2012-04-12 76 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(); 
}