2012-04-12 73 views
12

我目前正在处理一个数据列表,我需要在一个视图中显示一个列表并显示每个项目可执行的相应操作,如编辑它们或删除它们。对于这个版本来说,承认它是一个特定的视图是没有问题的。我的问题是当我想删除一个项目,我有两个选择在后期的方法。在Post方法和ViewBag抑制MVC3 RedirectToAction

//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不再是一样的第一个:... /名单,这是... /立即删除,我不觉得这是解决大,其他的解决方案是重定向到动作,现在url是好的,但viewBag中的错误消息不再可见,你们有没有更好的主意。

回答

35

您可以使用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

不错的建议在控制器中设置ViewBag.Error = TempData [“Error”],以便视图不必关心这个细节。 – 2012-04-12 13:19:25

+0

是的,我曾经在视图本身中拥有它,但是在视图中我有很多逻辑处理要查看的变量。我使用控制器来获取所有必要的信息并将其传递给视图。 – Joshua 2012-04-12 13:21:13

+0

非常感谢约书亚的答案,它工作正常,并感谢阅读资源。 – Oflocet 2012-04-12 13:45:15

13

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

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

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

@TempData["Error"] 

或者,如果你不使用剃刀:

<%= TempData["Error"] %> 
+0

感谢蛇形丘的答案。 – Oflocet 2012-04-12 13:45:34

1

使用ViewBag为POST ActionResult

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

    return view(); 
} 

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

    return view(); 
}