[英]ASP.net MVC View's Model vs ViewData.Model?
我正在學習asp.net mvc並發現了一些有趣的東西:
似乎我無法在View中顯式定義View Model
,並顯示錯誤消息,表明它沒有setter。
@{ this.Model = "Hello" } //error
然后我查看了WebViewPage.cs中的源代碼,View的Model屬性實際上是這樣的:
public object Model { get { return ViewData.Model; } }
因此錯誤。
但有趣的是我能做到這一點: @{ ViewData.Model = "hello"; }
@{ ViewData.Model = "hello"; }
居然能使用@model
聲明,導致對“你好”
我想我看得太多了,但為什么會這樣呢?
C#和ASP.NET初學者
規則是分離關注...在MVC中,控制器向視圖提供模型,它始終是控制器,可以將模型設置/分配給視圖....視圖可以使用...這個是按設計...按照規則玩是我會說的...如果你正在學習MVC它的偉大,我強烈建議你閱讀
像ModelBinders這樣的東西有時候不需要在上下文中改變模型,所以他們需要setter。 另一個原因是便於單元測試。
但是,您很少需要自己在視圖中執行此操作,因此濫用它需要您自擔風險。
它是API設計的“成功之坑”理論。 您不應該在視圖中更改Model屬性,因此它們會使其變得更難。 但是,由於可能存在您無法選擇的情況,因此無法實現。
這里沒有魔力。 在第一種情況下(正如您所指出的),Model屬性沒有屬性設置器。 所以,你不能分配任何東西。 這是有道理的 - 為什么你需要從視圖中重新分配模型?
在第二種情況下,您直接使用ViewData.Model破解/繞過該約束。 由於它是對象類型,您可以分配任何內容。
(順便說一句,我假設你在第一個代碼片段中指定了“Hello”,而不是“Hello”)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.