2012-03-28 111 views
6

我正在學習asp.net的MVC,發現一些有趣的事情:ASP.net MVC視圖模型vs ViewData.Model?

看來,我不能顯式定義視圖的Model從視圖中具有錯誤消息說,它沒有制定者。

@{ this.Model = "Hello" } //error

然後我看了看源代碼WebViewPage.cs和視圖的Model屬性其實是這樣的:

public object Model { get { return ViewData.Model; } }

這樣的錯誤。

但我怎麼能做到這一點很有趣:@{ ViewData.Model = "hello"; }居然能使用@model聲明,導致對「你好」

我想我期待太多進去,但是爲什麼會這樣呢?在C#

初學者和ASP.NET

+0

@BrokenGlass可能你需要更好地閱讀他的問題,它的一個新手有點問題...它相當有用/有助於解釋它... – NiK 2012-03-28 23:49:07

+0

@Jan Carlo Viray你能澄清一下你的問題嗎? '爲什麼'是什麼? – 2012-03-28 23:52:56

+0

我其實從來不知道'@ Model'包含在'ViewData'字典中。令人震驚的是,因爲我已經聽說了幾個備受推崇的資源** RAIL **反對使用ViewData,但它在這裏被嵌入到框架中。 – 2012-03-29 05:22:26

回答

7

該規則是關注分離...在MVC中,控制器爲視圖提供模型,並且它始終是可以將模型設置/分配給視圖的控制器....視圖可以使用......這是由設計......通過遊戲規則是我要說的話......如果你正在學習MVC的偉大,我會強烈建議您閱讀

Stevens Sandersons MVC book

2

之類的東西ModelBinders,什麼不該有時需要改變模型的情況下,所以需要制定者。另一個原因是促進單元測試。

但是,您很少需要自己在視圖中執行此操作,因此請自行承擔風險。

1

有沒有神奇這裏。在第一種情況下(正如您所指出的那樣),Model屬性沒有屬性設置器。所以,你不能分配任何東西。這是有道理的 - 爲什麼你需要從視圖內重新分配模型?

在第二種情況下,您直接使用ViewData.Model來篡改/繞過該約束。由於它是對象類型,所以你可以指定任何東西。

(順便說一句,我認爲在第一個代碼段分配「你好」,而不是「你好」)

2

這是API設計理論「成功的坑」。你不應該改變你的視圖中的Model屬性,所以它們會使得難以做到這一點。但是,由於可能有些情況下你沒有選擇,他們不會讓它變得不可能。