ASP.NET MVC3 RAZOR:从部分视图重定向

我有两个部分视图“MyPopular”和“MyBlogs”。 并且有两个控制器 – “ArticleController.cs”和“ThePopularController.cs”。 这两个部分视图都包含按钮。

最初,它在索引视图中呈现两个局部视图。

在博客点击的post操作处理程序中,要求它重定向到“BlogHome”操作,它将返回一个简单的字符串“Blog Home”(而不是视图)。 在流行点击的post动作处理程序中,它被要求重定向到“PopularHome”动作,它将返回一个简单的字符串“Popular Home”。 但是目前,当我点击任何一个按钮时,它会呈现localhost:1988 / Article索引; 没有部分内容。

注意:即使我使用ContentResult和ActionResult,结果也是一样的。 注意:请强调我是否正在通过错误的方式来完成这么简单的任务。

我们如何纠正它以进行适当的重定向?

// ArticleController

public class ArticleController : Controller { public ActionResult Index() { //Index returns no model return View(); } public string BlogHome() { return "Blog Home"; } //ChildActionOnly attribute indicates that this action should not be callable directly via the URL. [ChildActionOnly] public ActionResult MyBlogs() { Thread.Sleep(500); return PartialView(GetAllBlogEntries()); } [ChildActionOnly] [HttpPost] public void MyBlogs(string blogclick) { RedirectToAction("BlogHome"); } private IEnumerable GetAllBlogEntries() { return new[] { new Blog { ID = 1, Head = "Introduction to MVC", PostBy = "Lijo", Content = "This is a ..." }, new Blog { ID = 2, Head = "jQuery Hidden Gems", PostBy = "Lijo", Content = "This is a ..." }, new Blog { ID = 3, Head = "Webforms Intenals", PostBy = "Lijo", Content = "This is a ..." } }; } } 

// ThePopularController

 public class ThePopularController : Controller { public string PoularHome() { return "Poular Home"; } //ChildActionOnly attribute indicates that this action should not be callable directly via the URL. [ChildActionOnly] public ActionResult MyPopular() { Thread.Sleep(500); return PartialView(GetPopularBlogs()); } [ChildActionOnly] [HttpPost] public void MyPopular(string popularpress) { RedirectToAction("PoularHome"); } private IEnumerable GetPopularBlogs() { return new[] { new PopularTutorial { ID = 17, Title = "Test1", NumberOfReads = 1050 }, new PopularTutorial { ID = 18, Title = "Test2", NumberOfReads = 5550 }, new PopularTutorial { ID = 19, Title = "Test3", NumberOfReads = 3338 }, new PopularTutorial { ID = 20, Title = "Test4", NumberOfReads = 3338 }, new PopularTutorial { ID = 21, Title = "Test5", NumberOfReads = 3338 }, new PopularTutorial { ID = 22, Title = "Test6", NumberOfReads = 3338 }, new PopularTutorial { ID = 23, Title = "Test7", NumberOfReads = 3338 }, }; } } 

//Index.cshtml

 All Blogs List @Html.Action("myblogs") 

Popular Tutorial @Html.Action("mypopular","thepopular")

//MyPopular.cshtml

 @model IEnumerable @{ var grid = new WebGrid(Model, canPage: true, canSort: false, rowsPerPage: 3); } @grid.GetHtml( columns: grid.Columns(grid.Column("", format: @@item.Title)) ) @using (Html.BeginForm()) { 
}

//MyBlogs.cshtml

 @model IEnumerable 
    @Html.DisplayForModel()
@using (Html.BeginForm()) {
}

//博客显示模板

 @model MyArticleSummaryTEST.Blog 
  • @Html.DisplayFor(x => x.Head)

    @Html.DisplayFor(x => x.Content)
  • 读:

    1. asp.net MVC局部视图控制器动作

    2. 使用Html.BeginForm发布到当前控制器

    3. 在jquery.dialog中加载局部视图

    4. 如何从局部视图生成html?

    5. 从同一个Action返回Redirect或PartialView

    6. 使用ASP.NET MVC重定向以引用部分视图表单post

    7. 为什么在Asp.net MVC 2中的子操作中不允许重定向结果

    8. ValidationSummary不会出现在部分视图中

    9. 从部分视图重定向ASP.Net MVC 2中的“正确”方式http://geekswithblogs.net/DougLampe/archive/2011/08/05/redirecting-from-a-partial-view-the-right-way-在-asp.net.aspx

    10. ASP.NET MVC中的部分请求http://blog.stevensanderson.com/2008/10/14/partial-requests-in-aspnet-mvc/

    11. asp.net mvc 3和jquery的渐进增强教程http://www.matthidinger.com/archive/2011/02/22/Progressive-enhancement-tutorial-with-ASP-NET-MVC-3-and-jQuery.aspx

    您的代码中存在多个错误:

    1. 从父操作Index调用子操作MyBlogs ,在MyBlogs视图中使用@using (Html.BeginForm()) ,生成发布到Index操作的表单, 而不是MyBlogs 。 Populars的故事也是如此。 因此,并不是每个提交重新呈现索引操作内容的惊喜 – 这是您的表单请求的操作。 尝试使用接受路由参数的Html.BeginForm重载。
    2. [ChildActionOnly]表示外界无法访问该操作,请求HttpGet,Post,url或任何其他方式。 它只能与Html.Action助手一起使用。 因此,当您更正第一个错误时,您仍然无法发布该操作。 如果该操作应处理发布请求,则应删除ChildActionOnly属性。
    3. 如果它是您发布的真实代码,则不会(也不应该)重定向。 您应该更正方法签名并添加缺少的return语句

    这段代码

     [HttpPost] public void MyBlogs(string blogclick) { RedirectToAction("BlogHome"); } 

    应该

     [HttpPost] public ActionResult MyBlogs(string blogclick) { return RedirectToAction("BlogHome"); } 

    这应该工作

    问题在于@using (Html.BeginForm())

    当我们在BeginForm中没有指定任何操作和控制器名称时,它会将数据发布到页面的URL。 (在此场景文章/索引中)。

    您可以指定Action和Controller来发布数据,

    比如,在MyBlogs.cshtml中

     @using(Html.BeginForm("MyBlogs","Article")){ ...} 

    在MyPopular.cshtml中

     @using(Html.BeginForm("MyPopular","ThePopular")){ ...} 

    好吧,不确定这是不是完整的故事,但你有:

     public string PoularHome() { return "Poular Home"; } 

    这只是一种方法。 然后你发出(从你的MyPopular方法):

     RedirectToAction("PoularHome"); 

    由于PoularHome()没有返回一种ActionResult (或派生),管道将忽略这个’请求’。 你需要认真看看返回合适的类型。 尝试重构您的方法(操作),看看它是否有帮助:

     public ContentResult PoularHome() { return Content("Poular Home"); } 

    没有保证 – 只需30K英尺的观察。

    通过您的代码,您似乎正在重定向到不在当前控制器中的操作。 如果操作不在当前控制器中,则需要使用指定控制器和操作的重载。 否则它将进入默认路由并将您发送到索引。

    您还需要返回RedirectToAction。 这仍然是一种必须返回的ActionResult。