2013-05-06 49 views
1

我試圖學習ASP.NET MVC,我在我們公司遇到了一些使用ViewBag的代碼。我研究過它是什麼,它看起來像是一個變量的容器,可以在控制器中聲明,然後從視圖中訪問。ASP.NET MVC的新手,我不明白使用ViewData和/或ViewBag

我已經使用了其他的框架,比如Ruby on Rails和Struts,它們不會讓我這麼做。在特別導軌紅寶石,我可以做調用get變容易的觀點:

<%= variable %> 

進一步的研究使我相信,不鼓勵使用的ViewData和ViewBag。有人可以解釋直接從控制器獲取變量的用途嗎?

謝謝。

+0

首先,您正在使用ASP.NET MVC。它不同於ASP.NET – 2013-05-06 14:20:56

+0

@ManishMishra我認爲有ASP.NET MVC和ASP.NET Web Forms。但是,這是MVC。 – user1287523 2013-05-06 14:22:42

+1

看看[這個](http://stackoverflow.com/questions/8328083/heavy-use-of-viewbag)和[this](http://stackoverflow.com/questions/4766062/is-using-viewbag- in-mvc-bad)幫助你 – 2013-05-06 14:24:47

回答

4

在ASP.NET MVC中,您必須明確地將視圖需要的數據從控制器傳遞到視圖。

這樣的鼓勵方式是使用強類型的視圖和一個類實例的形式傳遞數據:

public ActionResult MyAction() { 
    return View(new MyViewModel { Prop1 = "Value1", ... }); 
} 

您認爲您指定的視圖使用模型類:

@model MyViewModel 

ViewData和ViewBag是將數據傳遞到視圖的備用/歷史方式。 ViewData是一個字典,需要通過類型轉換才能獲取值。 ViewBag是一個動態對象。兩者都缺乏從強烈輸入視圖中獲得的好處。

ViewData有一些其他屬性可以訪問模型元數據或模型狀態。例如,請參閱ViewData.ModelMetadata

有人可以解釋它的使用,而不是直接從控制器獲取變量嗎?

是的,去耦。 MVC模式表明,View對控制器沒有依賴性。當您的視圖可以訪問控制器的屬性時,它將耦合到該特定的控制器,並且MVC中的消息已經消失。

2

ViewBag和ViewData都是爲了維持視圖/控制器的解耦。通常適合ViewModel的數據可以放置在視圖中使用的ViewBag或ViewData中。例如,選擇列表數據之類的數據不一定是特定的。

ViewBag和ViewData之間的區別在於,視圖數據是作爲鍵/值容器(字典)訪問的,ViewBag中的數據是通過屬性訪問的(它是一個動態對象,因此將新值賦給一個「財產」創造財產)。

更新:

當您使用<%= variable %>你在特定視圖訪問變量權。爲了讓控制器設置這個值,它必須與視圖耦合並直接賦值。當然,這是可能的,但直接將耦合直接引入您可能不想要的視圖。

+1

正確,但爲什麼沒有'<%= variable%>'? – 2013-05-06 14:31:52

+2

將其放入ViewBag/ViewData而不是ViewModel的動機是什麼? – user1287523 2013-05-06 14:32:04

+0

@ user1287523更少的代碼,更多的*動態*如果您更喜歡過度安全 – Jan 2013-05-06 14:33:40