簡體   English   中英

ASP.net MVC View的模型與ViewData.Model?

[英]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它的偉大,我強烈建議你閱讀

史蒂文斯桑德森MVC書

像ModelBinders這樣的東西有時候不需要在上下文中改變模型,所以他們需要setter。 另一個原因是便於單元測試。

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

它是API設計的“成功之坑”理論。 您不應該在視圖中更改Model屬性,因此它們會使其變得更難。 但是,由於可能存在您無法選擇的情況,因此無法實現。

這里沒有魔力。 在第一種情況下(正如您所指出的),Model屬性沒有屬性設置器。 所以,你不能分配任何東西。 這是有道理的 - 為什么你需要從視圖中重新分配模型?

在第二種情況下,您直接使用ViewData.Model破解/繞過該約束。 由於它是對象類型,您可以分配任何內容。

(順便說一句,我假設你在第一個代碼片段中指定了“Hello”,而不是“Hello”)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM