2012-02-08 73 views
34

我見過很多關於何時使用ViewBag/ViewData vs ViewModel的文章,但我一直無法找到ViewBag生命週期的解釋。ViewBag/ViewData生命週期

例如,我有一個控制器2種action方法:

// POST: /MyModel/Edit/5 
[HttpPost] 
public ActionResult Edit(MyModel _mymodel){} 

// GET: /MyModel/Edit/5 
public ActionResult Edit(int id){} 

如果我把一些值在ViewBag在GET操作方法,建立某種形式標籤,然後當用戶單擊「提交」按鈕並通過HTTP POST將表單發送回服務器時,ViewBag值不再位於POST操作方法中。

有人可以解釋(或提供良好的文章參考)ViewBag/ViewData的生命週期?

回答

35

您在ViewBag/ViewData中放入的數據僅在填充它的請求的生命週期中可用。 MVC沒有發佈帖子。如果你需要一些東西來堅持多個請求,你應該使用會話。

這裏是關於ViewData的,ViewBag和TempData的之間的差異體面文章:http://rachelappel.com/when-to-use-viewbag-viewdata-or-tempdata-in-asp.net-mvc-3-applications

+0

感謝您的回覆。我已經閱讀過這篇文章,並沒有涉及ViewBag/ViewData的生命週期,但是對TempData略有介紹。爲了解決這些問題,'Post Back'我的意思是用戶提交一個FORM,從而導致一個HTTP POST請求,然後由一個Controllers適當的Action方法處理。 – JTech 2012-02-08 02:19:18

+1

該文章的狀態爲「但是,一旦控制器重定向,ViewBag和ViewData將包含空值。」正確的是,她沒有具體說明ViewBag和ViewData的生命週期在請求完成後就結束了,但她的確暗示了它。 – 2012-02-08 02:27:09

2

MSDN - ViewBag:動態視圖數據字典,ViewData的:該字典視圖數據。

所以這些/這是一個給定視圖的字典。你在你的行爲中設定它的價值,並在你的視野中使用它。正如扎克所說,隨後的請求不會回來。您可以將其值返回給任何給定的動作作爲表單字段,查詢字符串等,但這些值不會自動作爲VieBag的屬性提供。

0

ViewBagViewData用於相同的目的。它們用於將數據從控制器傳遞到視圖。當我們分配任何數據或對象給他們時,他們可以在視圖中訪問。

  • ViewDataViewData是對象的字典,他們是通過 字符串作爲鍵訪問。
  • ViewBag:使用動態特徵。它允許一個對象爲其添加 動態屬性。
+0

這是不正確的。你爲什麼認爲有2? ViewBag是視圖本身的一個動態屬性包,例如頁面標題,本地化數據(如標籤),如果您的控制器操作呈現不同視圖(例如網頁/手機等)並且用戶需要切換語言,ViewBag可能會更改。 ViewData是模型,將數據傳遞給視圖以用數據填充頁面,例如使用值填充輸入控件或某些用戶響應數據。 – 2016-08-05 02:46:02

7

這裏接受的答案並沒有真正描述ViewBag/ViewData的生命週期。不幸的是,似乎沒有關於這方面的明確文件。然而,在此基礎上:

http://blogs.msdn.com/b/varunm/archive/2013/10/03/understanding-of-mvc-page-life-cycle.aspx

這似乎生命週期是:

IIS請求 - >路由 - > MVC處理程序 - >控制器(帶的ViewData) - >視圖(ViewData的) - > Disposal

因此,ViewData(ViewBag只是​​簡單的包裝)實際上將用ControllerContext實例化,同時TempData被實例化。在步驟4:MVC處理程序執行後,會發生幾個步驟。

在從控制器切換到查看過程中,後面有一個有趣的步驟,其中「如果頁面具有ViewData,ViewData已設置」。 ViewData在此之前顯然是可用的,所以設置並不意味着實例化。它似乎意味着它從Controller(記住不可用於View)轉移到ViewContext(提供對ViewBag/ViewData和View的View訪問的容器)中。

ViewData大概與視圖的其餘部分同時處置。

重要的是還要注意MVC Views從內到外呈現,因此特定View和它對ViewBag所做的任何分配同樣會按照內部到外部的順序發生。這意味着View子頁面上設置的某些內容可用於Layout,但向Layout中的ViewBag添加內容然後在View子頁面中閱讀它將失敗。