Я немного ломаю голову над тем, как механизм связывания моделей работает в ASP.Net MVC.
Если быть точным, метод BindModel () имеет параметр ModelBindingContext, который содержит имя и тип модели, но я не понимаю, как ModelBindingContext получает эти значения.
Модель MVC должна быть заполнена из опубликованных значений формы или параметров строки запроса или других источников данных. Но какой механизм определяет тип модели, передаваемый ModelBindingContext, и как один тип модели выбирается из другого типа модели, даже по сравнению, скажем, с простым списком, содержащим отдельные опубликованные значения?
Мне просто кажется, что ModelBindingContext «знает» тип модели, которую он передает, и я не уверен, откуда она исходит или рабочий процесс, связанный с ее заполнением.
Интересный вопрос. Вот простой обзор того, что делает MVC. Все это обрабатывается классом ControllerActionInovker. Это не в конкретном порядке, но близко.
Вы можете увидеть это сами в исходнике ASP.net MVC, расположенном на codeplex.com. Найдите класс ControllerActionInvoker и метод GetParameterValue.
ModelBindingContext "знает" тип передаваемой ему модели, потому что вы должны либо:
Пример атрибута ModelBinder:
[ModelBinder(typeof(ContactBinder))]
public class Contact { ... }
Пример ModelBinders.Binders.Add():
void Application_Start()
{
ModelBinders.Binders[typeof(Contact)] = new ContactBinder();
}
Если вы зарегистрировали ModelBinder и реализовали метод BindModel:
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { ... }
Запросите ModelBindingContext.ModelType равен вашей модели, например,
if (bindingContext.ModelType == typeof(Contact)) { ... }
Восстановите вашу модель из свойства ModelBindingContext.ValueProvider для получения экземпляров ValueProviderResult, которые представляют данные из постов формы, данных маршрута и строки запроса, например
bindingContext.ValueProvider["Name"].AttemptedValue;
Были использованы следующие книги ASP.NET MVC 2 в действии и ASP.NET MVC 1.0 Quickly