我正在使用ASP.NET MVC3,我想知道默認的modelbinder綁定到公共屬性,但不公開的字段。默認modelbinder不綁定到字段的原因是什麼?
通常我只是用屬性定義模型類,但有時我使用一些預定義的類,其中包含一些字段。每次我必須調試並記住模型綁定器不喜歡字段。
問題:背後的原因是什麼?
我正在使用ASP.NET MVC3,我想知道默認的modelbinder綁定到公共屬性,但不公開的字段。默認modelbinder不綁定到字段的原因是什麼?
通常我只是用屬性定義模型類,但有時我使用一些預定義的類,其中包含一些字段。每次我必須調試並記住模型綁定器不喜歡字段。
問題:背後的原因是什麼?
也許忽略字段的原因是爲了提高活頁夾的性能。而不是搜索所有的字段和屬性。模型活頁夾只搜索屬性。
雖然我認爲模型活頁夾使用緩存來提高性能。
但有時我使用含有某些領域
雖然我不能回答你關於爲什麼默認的模型綁定與性能只適用的確切原因問題的一些預定義的類(我的猜測是,它尊重更好封裝這種方式,並避免修改對象的內部狀態,這是什麼字段代表)我可以說,你所謂的預定義類通常應該是視圖模型。您應該始終在您的控制器操作中使用視圖模型。這些視圖模型是專門定義的類,以滿足給定視圖的要求。
所以回到主要觀點:字段應該只在給定的類中進行修改。他們不應該直接從外面訪問。他們代表和掌握着班級的內部狀態。另一方面,房地產應該暴露給外部世界。想象一下,在財產getter/setter你有一些自定義邏輯。通過直接修改字段,該自定義邏輯將被破壞,並可能使對象進入不一致狀態。
DefaultModelBinder公開了一個公共方法: DefaultModelBinder.BindModel,以及一些可用於覆蓋的受保護方法。他們都列出了here。
除了模型,這些方法是指性質而已,不領域,如
其中XYZ
代表任一Model,
或Property/ies,
或兩者,且依此類推。
正如你所看到的,沒有提到這些名字的Fields
。如Darin所解釋的,Binder不允許對模型狀態的直接改變。因此在其方法中沒有Field
。
此外,你也可以看看另一個重要的類:ModelBindingContext。這個類的一個實例被傳遞到BindModel,
,隨後根據模型類型被傳遞到BindSimpleModel,
和BindComplexModel,
(string, int,
...被認爲是簡單的,其他一切都很複雜)。
所以,這種情況下具有以下特性:
換句話說,除非您不重寫這些類並採取特殊措施,否則無法引用ViewModel中的字段。
但是,要小心打架,它總是更容易遵循它。
編輯:ModelMetadata類擁有綁定模型所需的所有數據。但是,它的代碼沒有顯示字段,字段名等符號。只有屬性被引用和訪問。所以,即使你試圖繼承和覆蓋DefaultModelBinder和ModelBinderContext,你仍然無法訪問fiellds,他們的訪問修飾符是沒關係的內容:公共,私營等
希望這可以解釋大部分。
好吧,但爲此你有訪問修飾符。如果我不想直接設置字段,我只是將其聲明爲「private」。 Viewmodel類通常只是數據容器,並且大多不包含太多邏輯 - 所以我認爲只需使用公共字段即可。 – Jan 2011-12-19 09:57:02
@Jan,通常字段應該是私人的。 – 2011-12-19 09:59:20
通常情況下,你不應該在屬性的getters中有邏輯...... – gdoron 2011-12-19 10:41:29