我有一个控制器,处理三个特定于我的问题的操作。
@H_301_2@第一个是编辑操作,它返回具有HTML表单的视图,用户可以编辑给定项目上的属性。
@H_301_2@第二个是更新操作,它接受从浏览器返回的更新并更新数据库。当更新成功时,我们执行重定向到操作。
@H_301_2@第三个是显示给定项目的细节的显示动作。此操作是我们在成功更新后重定向到的地方。
@H_301_2@流程是:
@H_301_2@显示 – >编辑 – >更新(成功:y – >重定向到显示,n – >返回编辑)
@H_301_2@我想要实现的是在更新成功时有一个标志跳闸,以便在下一个显示视图中,我可以显示一个确认消息给用户。问题是,我不是100%肯定的最好的方式通过RedirectToAction()调用来携带这些数据。一个想法,我有使用查询字符串?我们已经携带变量的查询字符串为另一个目的,但我的一部分怀疑,滥用它。对重定向的调用如下。
RouteValueDictionary dict = Foo.GetRouteValues(bar); RedirectToAction("Show",dict);@H_301_2@我已经阅读了这个问题,但是关于使用TempData属性,如果我不必要。 @H_301_2@Question @H_301_2@感谢您的一些建议!
解决方法
编辑:对不起,最初没有看到你的笔记,不想使用TempData。
@H_301_2@简而言之,如果客户端刷新/重新加载他们已重定向到的页面,您是否希望您的邮件重新出现?
@H_301_2@如果你这样做,那么使用querystring,类似:
return(RedirectToAction("Index",new { message = "hi there!" }));@H_301_2@然后定义
public ActionResult Index(string message) { }@H_301_2@或显式地拉出Request.QueryString [“消息”],并以通常的方式将其传递给View通过ViewData。这也适用于不接受来自您网站的Cookie的浏览器。 @H_301_2@如果不希望消息再次显示,则ASP.NET MVC 1.0为此确切目的提供TempData集合。 @H_301_2@TempData属性值存储在会话状态,直到来自同一浏览器的下一个请求,之后它们被清除 – 所以如果你在返回RedirectToAction之前立即在TempData中添加一些东西,它将在重定向的结果上可用,但会被清除之后立即。 @H_301_2@以下是ASP.NET MVC启动项目中HomeController的简单更改:
public ActionResult Index() { ViewData["Message"] = "Welcome to ASP.NET MVC!"; return View(); } [AcceptVerbs(HttpVerbs.Post)] public ActionResult Index(string submitButton) { TempData["message"] = "You clicked " + submitButton; return(RedirectToAction("Index")); } public ActionResult About() { return View(); }@H_301_2@和相应的视图/Views/Home/Index.aspx应该包含这样:
<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server"> <% if (TempData["message"] != null) { %> <p><%= Html.Encode(TempData["message"]) %></p> <% } %> <% using (Html.BeginForm()) { %> <input type="submit" name="submitButton" value="Button One" /> <input type="submit" name="submitButton" value="Button Two" /> <% } %> </asp:Content>@H_301_2@您会注意到在POST-REDIRECT-GET序列之后立即显示TempData消息,但如果刷新页面,则不会再次显示。 @H_301_2@请注意,ASP.NET MVC 2中的此行为已更改 – 有关详细信息,请参阅this article中的“在操作方法之间传递状态”。