MVC3 RedirectToAction在post方法和ViewBag抑制中

时间:2012-04-12 13:11:43

标签: c# asp.net-mvc-3 viewbag

我目前正在处理一个数据列表,我需要在一个视图中显示一个列表,并为每个项目显示可执行的相应操作,例如编辑或删除它们。对于该版本,可以毫无疑问地认为它是一种特殊的观点。我的问题是当我想删除一个项目时,我在post方法中有两个选择。

 //Call directly the list 
 [HttpPost]
 [Authorize]
 public ActionResult Delete(int itemId)
 {
     // logic to delete an item
     ViewBag.Error = ""; // The result of the execution
     return List(); 
 }

这个解决方案的问题是网址不再与第一个网址相同:... /列表,它是... /现在删除,我发现这个解决方案不太好,另一个解决方案是重定向到动作,现在url很好,但viewBag中的错误消息不再可见,你们有更好的主意吗?

3 个答案:

答案 0 :(得分:36)

您可以使用TempData在一个请求中保留信息,这是针对这个确切的用例。而不是使用ViewBag使用TempData["Error"] = "";代替。然后,在接收端,您将获得如下代码段:

[HttpGet]
public ActionResult List() {
    ViewBag.Error = TempData["Error"];
    // ...
    return View();
}

请参阅ASP.NET TempData persists between requestsWhen to use ViewBag, ViewData, or TempData in ASP.Net MVC 3

答案 1 :(得分:13)

如果您正在进行重定向,请尝试使用TempData代替ViewBag。 TempData是一个字典,它保留用户会话中的键/值,直到下一页请求。在您的控制器中:

TempData["Error"] = "A message goes here";

在列表视图中,您要重定向到:

@TempData["Error"]

或者如果您不使用剃须刀:

<%= TempData["Error"] %>

答案 2 :(得分:1)

使用ViewBag发布ActionResult

ActionResult SubmitUser()
{
    ViewBag.Msg =TempData["Msg"];

    return view();
}

[HtttpPost]
ActionResult SubmitUser()
{
    TempData["Msg"] ="Submitted Successfully"];

    return view();
}