.Net MVC3 Custom Model Binder — начальная загрузка модели

Я создаю настраиваемую привязку модели, чтобы сначала загрузить модель из базы данных, прежде чем обновлять модель входными значениями. (Наследование от DefaultModelBinder)

Какой метод мне нужно переопределить, чтобы сделать это?


person kroehre    schedule 01.06.2011    source источник


Ответы (2)


Вам необходимо переопределить метод BindModel базового класса DefaultModelBinder:

    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        if (bindingContext.ModelType == typeof(YourType))
        {
            var instanceOfYourType = ...; 
            // load YourType from DB etc..

            var newBindingContext = new ModelBindingContext
            {
                ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => instanceOfYourType, typeof(YourType)),
                ModelState = bindingContext.ModelState,
                FallbackToEmptyPrefix = bindingContext.FallbackToEmptyPrefix,
                ModelName = bindingContext.FallbackToEmptyPrefix ? string.Empty : bindingContext.ModelName,
                ValueProvider = bindingContext.ValueProvider,
            };
            if (base.OnModelUpdating(controllerContext, newBindingContext)) // start loading..
            {
                // bind all properties:
                base.BindProperty(controllerContext, bindingContext, TypeDescriptor.GetProperties(typeof(YourType)).Find("Property1", false));
                base.BindProperty(controllerContext, bindingContext, TypeDescriptor.GetProperties(typeof(YourType)).Find("Property2", false));

                // trigger the validators:
                base.OnModelUpdated(controllerContext, newBindingContext);
            }

            return instanceOfYourType;
        }            
        throw new InvalidOperationException("Supports only YourType objects");
    } 
person m0sa♦    schedule 01.06.2011
comment
Нужно ли привязывать каждое свойство вручную после загрузки из базы данных или это все равно будет происходить автоматически? - person kroehre; 02.06.2011
comment
Вам нужно привязать каждое свойство вручную или делегировать его базовому классу. - person m0sa♦; 02.06.2011

Вы захотите переопределить BindModel сделать это.

person Tejs    schedule 01.06.2011