ASP.NET MVC ModelBindingContext Class - как насленны значения модели?

StackOverflow https://stackoverflow.com/questions/3523752

Вопрос

Я немного царапаю голову в том, как модельные связующие делают свою работу в ASP.NET MVC.

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

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

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

Это было полезно?

Решение

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

  1. ControlConceInovker определяет тип параметра посредством отражения.
  2. Следующие ValueProviders создаются из формы запроса httpContext, маршрута, кригента и т. Д. Свойства. Вы также можете предоставить свои собственные поставщики стоимости.
  3. Эти значения Value Providers поставляются в ModelBindingContext через коллекцию, которая действует как виртуальное значениеProvider.
  4. Затем ControlConceInovker ищет ModelBinder для конкретного типа. Если он не найдет одно по умолчанию для встроенного по умолчанию ModelBinder.
  5. В большинстве случаев используется значение defaultmodelbinder. Работа - это создать модель и использовать значениеProviders для подключения свойств со значениями, используя имена моделей свойств в качестве ключа. Когда ValueProviders имеют значение, они возвращают объект ValuePreviderResult, который отвечает за преобразование типа.

Вы можете увидеть это для себя в ASP.NET MVC Источник, расположенный в CodePlex.com. Отказ Ищите класс ControlleringIningInvoker и методом GetParametervalue.

Другие советы

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 быстро

То, как я вижу, так это то, что ControlLoxingInvoker использует отражение для получения типа параметра, он затем проверяет, назначается ли какой-либо ModelBinder для решения этого типа, если это означает, что он создает этот ModelBinder и передает его BindingContext, который будет содержать (объект модели, модель Имя, тип модели, фильтр недвижимости) Для этого объекта типа параметров и коллекции поставщика стоимости (ModelBindingContext.valueProvider) всех других провайдеров стоимости (форма, строка запроса и т. Д.), Выступающий в виде одного большого провайдера виртуального значения.

Затем самого ModelBinder использует отражение, чтобы получить все имена свойств для типа, который назначен для привязки и пробел рекурсивно против всех поставщиков стоимости в (ModelBindingContext.valueProvider) и ищет имена свойств в этих поставщиках ценностей, привязывающих эти значения для кого Имена (взятые у клиента) Сопоставьте имена свойств типа, когда они соответствуют поставщику стоимости, возвращает объект valuePreviderresult, несущий имя и значение для соответствующего свойства на модели.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top