ASP.Net MVC Класс ModelBindingContext - как заполняются значения его модели?

Я немного ломаю голову над тем, как механизм связывания моделей работает в ASP.Net MVC.

Если быть точным, метод BindModel () имеет параметр ModelBindingContext, который содержит имя и тип модели, но я не понимаю, как ModelBindingContext получает эти значения.

Модель MVC должна быть заполнена из опубликованных значений формы или параметров строки запроса или других источников данных. Но какой механизм определяет тип модели, передаваемый ModelBindingContext, и как один тип модели выбирается из другого типа модели, даже по сравнению, скажем, с простым списком, содержащим отдельные опубликованные значения?

Мне просто кажется, что ModelBindingContext «знает» тип модели, которую он передает, и я не уверен, откуда она исходит или рабочий процесс, связанный с ее заполнением.

8
задан larryq 19 August 2010 в 16:06
поделиться

2 ответа

Интересный вопрос. Вот простой обзор того, что делает MVC. Все это обрабатывается классом ControllerActionInovker. Это не в конкретном порядке, но близко.

  1. ControllerActionInovker определяет тип параметра через отражение.
  2. Следующие ValueProviders создаются из свойств HttpContext Request Form, Route, QueryString и т.д. Вы также можете предоставить свои собственные провайдеры значений.
  3. Эти ValueProviders предоставляются ModelBindingContext через коллекцию, которая действует как виртуальный ValueProvider.
  4. Затем ControllerActionInovker ищет ModelBinder для определенного типа. Если он его не находит, то по умолчанию используется встроенный DefaultModelBinder.
  5. В большинстве случаев используется DefaultModelBinder. Его задача - создать модель и использовать ValueProviders для соединения свойств со значениями, используя имена свойств модели в качестве ключа. Когда у ValueProviders есть значение, они возвращают объект ValueProviderResult, который отвечает за преобразование типов.

Вы можете увидеть это сами в исходнике ASP.net MVC, расположенном на codeplex.com. Найдите класс ControllerActionInvoker и метод GetParameterValue.

12
ответ дан 5 December 2019 в 10:38
поделиться

ModelBindingContext "знает" тип передаваемой ему модели, потому что вы должны либо:

  • Добавить атрибут ModelBinder к вашей модели
  • Зарегистрировать ModelBinder с вашей моделью, используя метод ModelBinders.Binders.Add().

Пример атрибута 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) { ... }
  1. Запросите ModelBindingContext.ModelType равен вашей модели, например,

    if (bindingContext.ModelType == typeof(Contact)) { ... }
    
  2. Восстановите вашу модель из свойства ModelBindingContext.ValueProvider для получения экземпляров ValueProviderResult, которые представляют данные из постов формы, данных маршрута и строки запроса, например

    bindingContext.ValueProvider["Name"].AttemptedValue;
    

Были использованы следующие книги ASP.NET MVC 2 в действии и ASP.NET MVC 1.0 Quickly

3
ответ дан 5 December 2019 в 10:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: