我有一个 Controller ,可以处理针对我的问题的三个操作。
第一个是edit操作,该操作返回一个带有HTML表单的 View ,用户可以在该 View 中编辑给定项目的属性。
第二个是update操作,它接受来自浏览器的回发并更新数据库。更新成功后,我们将重定向至操作。
第三是显示 Action ,显示给定项目的详细信息。成功更新后,我们将重定向到该操作。
流程是:
显示->编辑->更新(成功:y->重定向到显示,n->返回编辑)
我想要实现的是在更新成功时使标志跳闸,以便在下一个“显示” View 中可以为用户显示确认消息。问题是我不确定通过RedirectToAction()调用传输数据的最佳方式是100%。曾经以为我在使用查询字符串?我们已经在查询字符串中附带了变量,用于其他目的,但是我的一部分对此表示怀疑。重定向的调用如下。
RouteValueDictionary dict = Foo.GetRouteValues(bar);
RedirectToAction("Show", dict);
我也已经阅读了这个问题,但是如果不需要的话,对使用TempData属性也很了解。
Question
感谢您的建议!
最佳答案
编辑:对不起,最初没有看到关于不希望使用TempData的注释。
简而言之-如果客户端刷新/重新加载已重定向到的页面,您是否希望重新显示消息?
如果这样做,则使用查询字符串,例如:
return(RedirectToAction("Index", new { message = "hi there!" }));
然后定义
public ActionResult Index(string message) { }
或显式拉出Request.QueryString [“message”]并以通常的方式通过ViewData将其传递给View。这也将在不接受您站点中的cookie的浏览器中起作用。
如果您不想再次显示该消息,则ASP.NET MVC 1.0提供了TempData集合用于此目的。
TempData属性值以 session 状态存储,直到从同一浏览器发出下一个请求为止,之后它们将被清除-因此,如果您在返回RedirectToAction之前立即在TempData中放入内容,它将在重定向结果上可用,但会之后立即清除。
这是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();
}
并且相应的 View /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>
您会注意到TempData消息在POST-REDIRECT-GET序列之后立即显示,但是如果刷新页面,则不会再次显示它。
请注意,此行为在ASP.NET MVC 2中已更改-有关更多信息,请参见this article中的“在操作方法之间传递状态”。
关于asp.net-mvc - 重定向至操作并需要传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3363842/