Asp.net-Mvc
ASP.Net MVC ModelBindingContext 類——它的模型值是如何填充的?
我對模型綁定器如何在 ASP.Net MVC 中工作感到有些摸不著頭腦。
具體來說,BindModel()方法有一個ModelBindingContext參數,裡面保存著模型名稱和類型,但是我不明白ModelBindingContext是怎麼接收這些值的。
必須從發布的表單值或查詢字元串參數或其他數據源填充 MVC 模型。但是什麼機制決定了傳遞給 ModelBindingContext 的模型類型,以及如何選擇一種模型類型而不是另一種模型類型,甚至(比如說)一個包含各個發布值的簡單列表?
在我看來,ModelBindingContext“知道”它正在處理的模型類型,我不確定它來自哪里或填充它所涉及的工作流。
有趣的問題。以下是 MVC 功能的簡單概述。這一切都由 ControllerActionInovker 類處理。這不是特定的順序,但很接近。
- ControllerActionInovker 通過反射確定參數類型。
- Next ValueProviders 是從 HttpContext Request Form、Route、QueryString 等屬性創建的。您還可以提供自己的價值提供者。
- 這些 ValueProviders 通過充當虛擬 ValueProvider 的集合提供給 ModelBindingContext。
- 然後 ControllerActionInovker 查找特定類型的 ModelBinder。如果找不到,則預設為內置的 DefaultModelBinder。
- 在大多數情況下,使用 DefaultModelBinder。它的工作是創建一個模型,並使用 ValueProviders 使用模型屬性名稱作為鍵將屬性與值連接起來。當 ValueProviders 有值時,它們返回一個負責類型轉換的 ValueProviderResult 對象。
您可以在位於 codeplex.com 的 ASP.net MVC 原始碼中親自看到這一點。查找 ControllerActionInvoker 類和 GetParameterValue 方法。