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 @using (Html.BeginForm()) { }
//博客显示模板
@model MyArticleSummaryTEST.Blog @Html.DisplayFor(x => x.Head)
@Html.DisplayFor(x => x.Content)
读:
-
asp.net MVC局部视图控制器动作
-
使用Html.BeginForm发布到当前控制器
-
在jquery.dialog中加载局部视图
-
如何从局部视图生成html?
-
从同一个Action返回Redirect或PartialView
-
使用ASP.NET MVC重定向以引用部分视图表单post
-
为什么在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-在-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
您的代码中存在多个错误:
- 从父操作
Index
调用子操作MyBlogs
,在MyBlogs视图中使用@using (Html.BeginForm())
,生成发布到Index
操作的表单, 而不是MyBlogs
。 Populars的故事也是如此。 因此,并不是每个提交重新呈现索引操作内容的惊喜 – 这是您的表单请求的操作。 尝试使用接受路由参数的Html.BeginForm重载。 -
[ChildActionOnly]
表示外界无法访问该操作,请求HttpGet,Post,url或任何其他方式。 它只能与Html.Action
助手一起使用。 因此,当您更正第一个错误时,您仍然无法发布该操作。 如果该操作应处理发布请求,则应删除ChildActionOnly
属性。 - 如果它是您发布的真实代码,则不会(也不应该)重定向。 您应该更正方法签名并添加缺少的
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。
上述就是C#学习教程:ASP.NET MVC3 RAZOR:从部分视图重定向分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请点击右边联系管理员删除。
如若转载,请注明出处:https://www.ctvol.com/cdevelopment/1012275.html