2012-07-24 53 views
4

當通過ASP.NET MVC調用方法時,在以下情況下,我的viewModel參數是否永遠不會爲null?例如使用URL「.../Home/Index」。在ASP.NET MVC 3操作中,ViewModel參數不會爲空嗎?

public ViewResult Index(HomeViewModel viewModel) 
{ 
    // .. do stuff...viewModel is never null here when called within ASP.NET? 
} 

我從來沒有注意到,在ASP.NET MVC這種行爲之前,但視圖模型(如果它不被提供)似乎被越來越實例化。

有人可以澄清此行爲。

+0

對下面的一個小的澄清 - 它將永遠存在,但是如果它不能綁定到任何傳入字段,所有字段可能爲空 – 2012-07-24 19:45:15

回答

9

是的,即使在可以分配給視圖模型的請求中沒有任何參數存在,您也將始終獲得視圖模型的實例。

爲什麼會發生這種情況?

這是DefaultModelBinder是如何工作的,

  1. 創建視圖模型的實例。

  2. 迭代模型中的屬性並要求值提供程序查找值並將找到的值設置爲屬性。

  3. 返回創建的實例。

如果你看到的步驟DefaultModelBinder它不關心,如果存在這樣可以設置爲模型實例,它只是提前啓動並創建實例,然後填充性能要求的任何值。

這沒什麼意義吧?

模型聯編程序檢查請求是否包含任何匹配模型屬性的值然後創建一個實例會更復雜。

4

MVC將嘗試採用通過POST/GET發送的值並「自動」將它們綁定到模型的屬性。這由默認的模型綁定器完成。在大多數情況下,默認模型聯編程序將執行您需要的所有操作。

您可以更深入地瞭解自定義模型綁定(並可能更深入地瞭解它),但查看IModelBinder接口 - 它包含一個名爲BindModel的單一方法。在這個方法中,你幾乎可以接受ControllerContext.HttpContext.Request中的任何內容,並填充你的類屬性(基本上與默認模型綁定器相同)。使用自定義模型綁定器有幾個需要跳過的環節,但會讓您瞭解綁定生命週期的概念。

簡短回答:使用默認的模型聯編程序,它不會爲空。

HTH

0

當動作方法的參數是一個複雜的類型,那麼類DefaultModelBinder使用反射以獲取該組的公共屬性,然後結合到它們中的每。對於使用的複雜類型Activator.CreateInstance(typeToCreate);然後ValueProviders將用於獲取這些屬性的值。請記住,模型綁定器未鎖定到特定的源,但它們可以從源集合中構建對象。

相關問題