12

我目前正在处理我需要在表示列表的视图中显示的数据列表,并为每个项目显示可以执行的相应操作,例如编辑或删除它们。对于这个版本来说,承认它是一个特定的观点是没有问题的。我的问题是当我想删除一个项目时,我在 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 不再与第一个相同: .../List,现在是 .../Delete,我觉得这个解决方案不太好,另一个解决方案是重定向到行动,现在url是好的,但是viewBag中的错误信息不再可见,你们有更好的主意吗?

4

3 回答 3

36

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

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

请参阅ASP.NET TempData 在请求之间持续存在以及何时在 ASP.Net MVC 3 中使用 ViewBag、ViewData 或 TempData

于 2012-04-12T13:17:32.690 回答
13

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

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

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

@TempData["Error"]

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

<%= TempData["Error"] %>
于 2012-04-12T13:16:28.150 回答
1

使用ViewBagPOST ActionResult

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

    return view();
}

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

    return view();
}
于 2016-05-17T12:40:07.447 回答