4

我正在開發ASP.NET MVC2應用程序。我已經意識到MVC在幕後與ModelState和模型綁定有關的一件令人驚訝但令人驚訝的事情。我有一個ViewModel,它有一大堆數據 - 有些字段是表單的一部分,而另一些只是UI的一部分。在HttpPost上,我的Action方法使用DefaultModelBinder試圖綁定整個模型,但只有屬於表單的字段才能成功反序列化 - 所有其他字段保留爲空。這很好,可以理解。如果ModelState無效,我需要刷新來自db的模型和綁定這些特定的表單域返回到相同的編輯視圖以顯示相關的ModelState驗證錯誤。當ModelState在HttpPost上無效時,ASP.NET MVC自動綁定刷新的模型

這裏是我的驚奇和好奇來臨。這是我的假設,爲了讓我綁定與刷新模型的表單字段,我需要撥打UpdateModel()TryUpdateModel<>(),傳入新刷新的模型。例如:

[HttpPost] 
public ActionResult EditDetail(EditDetailItemModel model) 
{ 
    if (model.IsValid) 
    { 
     // Save the results to the db 

     return RedirectToAction(...) 
    } 

    // Can't simply "return View(model)". Not all fields in EditDetailItemModel 
    // were part of the form - thus they returned null. Have to refresh 
    // model from the db. 

    var refreshedModel = RefreshModelFromDB(); 

    // Is this line necessary????? 
    TryUpdateModel<EditDetailItemModel>(refreshedModel); 

    return View(refreshedModel); 
} 

但是,我發現,如果我只是回到refreshedModel到視圖不打電話,以TryUpdateModel<>()刷新模型自動發佈表單字段值約束!因此,這裏不需要TryUpdateModel<>()

我可以理解它的唯一方法是,由於ModelState處於無效狀態,一旦我使用刷新的模型返回視圖,「MVC渲染引擎」遍歷模型狀態錯誤並限制這些屬性我的刷新模型的值。這簡直太棒了!但是,我想要證明這個假設。我無法在網絡上的任何地方找到相關文檔。任何人都可以證實我的假設:爲什麼這種真棒自動綁定行爲發生和/或教育我爲什麼/如何發生,希望通過一些在線文檔鏈接備份,以便我更全面地理解封面下發生了什麼?

回答

0
public ActionResult EditDetail(EditDetailItemModel model) 

該行將執行模型綁定。將ActionMethod參數視爲始終由對UpdateModel的調用填充。

您沒有在視圖中看到refreshedModel的值,您將看到來自EditDetailItemModel的ModelState條目和值。

+0

右 - 我在視圖中看到的值「回發」後是ModelState條目。但有區別 - 「其他」非表單屬性不是NULL!如果我在回發視圖之前沒有刷新模型,那些其他屬性仍然爲空。但是因爲我刷新了模型,所以當我在視圖中設置斷點時,我可以看到,不僅窗體屬性被正確還原,而且窗體屬性還原爲用戶在表單中輸入的值 - EXACTLY我想要發生的事情。我正在尋找的是一些確認功能的文檔。 – tbehunin 2010-11-02 16:01:33

+1

沒有在線(我可以找到)談到必須在返回顯示驗證錯誤之前「刷新」模型,我認爲這很奇怪。這似乎是一個非常標準的事情,但沒有例子,我發現嘗試這樣做。看看我上面的問題中的代碼,如果我沒有對TryUpdateModel <>()進行調用,那麼看起來「refreshModel」(其值直接來自數據庫)將是顯示給用戶的值 - 而不是他們在投放前輸入的值。太棒了。如果我可以在線閱讀這個預期的功能,只是會減輕我的良心。 – tbehunin 2010-11-02 16:14:00

+0

@tbehunin,我不明白你在找什麼。當你調用'return View(refreshedModel);'你將視圖模型傳遞給視圖。這就是事情的工作原理。TryUpdateModel將爲該refreshedModel創建ModelState條目,並且在查看模型之前,任何htmlhelpers將首先使用這些條目。 – jfar 2010-11-02 17:05:02