ASP.NET MVC3 RAZOR: Redirecting from Partial Views
我有两个部分视图"MyPopular"和"MyBlogs"。并且有两个控制器 -"ArticleController.cs"和"ThePopularController.cs"。这两个部分视图都包含按钮。
最初它在索引视图中呈现两个部分视图。
在博客点击的帖子操作处理程序上,要求它重定向到"BlogHome"操作,它将返回一个简单的字符串"Blog Home"(而不是视图)。在热门点击的帖子动作处理程序中,它被要求重定向到"PopularHome"动作,它将返回一个简单的字符串"Popular Home"。但是目前,当我点击任何一个按钮时,它会呈现localhost:1988 / Article索引;没有部分内容。
注意:即使我使用ContentResult和ActionResult,结果也是一样的。
注意:请强调我是否正在通过错误的方式来完成这么简单的任务。
我们如何纠正它以进行适当的重定向?
// ArticleController
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | 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<Blog> 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | 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<PopularTutorial> 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
1 2 3 4 5 6 7 8 | All Blogs List @Html.Action("myblogs") <br /> <br /> Popular Tutorial @Html.Action("mypopular","thepopular") |
//MyPopular.cshtml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | @model IEnumerable<MyArticleSummaryTEST.PopularTutorial> @{ var grid = new WebGrid(Model, canPage: true, canSort: false, rowsPerPage: 3); } @grid.GetHtml( columns: grid.Columns(grid.Column("", format: @<text>@item.Title</text>)) ) @using (Html.BeginForm()) { <input type="submit" name ="popularpress" id="2"/> } |
//MyBlogs.cshtml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | @model IEnumerable<MyArticleSummaryTEST.Blog> <section> <ul> @Html.DisplayForModel() </ul> </section> @using (Html.BeginForm()) { <input type="submit" name ="blogclick" id="1"/> } |
//博客显示模板
1 2 3 4 5 6 7 8 9 | @model MyArticleSummaryTEST.Blog <li> @Html.DisplayFor(x => x.Head) @Html.DisplayFor(x => x.Content) </li> |
读:
asp.net MVC局部视图控制器动作
使用Html.BeginForm发布到当前控制器
在jquery.dialog中加载局部视图
如何从局部视图生成html?
从同一个Action返回Redirect或PartialView
重定向使用ASP.NET MVC引用部分视图表单帖子
为什么在Asp.net MVC 2中的子操作中不允许重定向结果
ValidationSummary不会出现在部分视图中
从部分方向重定向查看ASP.Net MVC 2中的"正确"方式
http://geekswithblogs.net/DougLampe/archive/2011/08/05/redirecting-from-a-partial-view-the-right-way-in-asp.net.aspx
ASP.NET MVC中的部分请求
http://blog.stevensanderson.com/2008/10/14/partial-requests-in-aspnet-mvc/
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 2 3 4 5 | [HttpPost] public void MyBlogs(string blogclick) { RedirectToAction("BlogHome"); } |
应该
1 2 3 4 5 | [HttpPost] public ActionResult MyBlogs(string blogclick) { return RedirectToAction("BlogHome"); } |
这应该工作
问题在于
当我们在BeginForm中没有指定任何操作和控制器名称时,它会将数据发布到页面的URL。 (在此场景文章/索引中)。
您可以指定Action和Controller来发布数据,
就像在MyBlogs.cshtml中一样
1 2 | @using(Html.BeginForm("MyBlogs","Article")){ ...} |
在MyPopular.cshtml中
1 2 | @using(Html.BeginForm("MyPopular","ThePopular")){ ...} |
好吧,不确定这是不是完整的故事,但你有:
1 2 3 4 | public string PoularHome() { return"Poular Home"; } |
这只是一种方法。然后你发出(从你的
1 | RedirectToAction("PoularHome"); |
由于
1 2 3 4 | public ContentResult PoularHome() { return Content("Poular Home"); } |
没有保证 - 只需30K英尺的观察。
通过您的代码,您似乎正在重定向到不在当前控制器中的操作。如果操作不在当前控制器中,则需要使用指定控制器和操作的重载。否则它只会进入默认路由并将您发送到索引。
您还需要返回RedirectToAction。这仍然是一种必须返回的ActionResult。