В чем разница между BindProperty и SetProperty на IModelBinder

Я создаю пользовательскую привязку модели в приложении Mvc, и я хочу разобрать строку на значение перечисления и назначить его свойству модели. У меня он работает, переопределяя BindProperty метод, но я также заметил, что есть SetProperty метод.

    protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor)
    {
        switch (propertyDescriptor.Name)
        {
            case "EnumProperty":
                BindEnumProperty(controllerContext, bindingContext);
                break;
        }

        base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
    }

    private static void BindEnumProperty(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var formValue = controllerContext.HttpContext.Request.Form["formValue"];

        if (String.IsNullOrEmpty(formValue))
        {
            throw new ArgumentException();
        }

        var model = (MyModel)bindingContext.Model;
        model.EnumProperty = (EnumType)Enum.Parse(typeof(EnumType), formValue);
    }

Я не уверен, в чем разница между ними и делаю ли я это рекомендуемым способом.

2 ответов


прежде всего, BindProperty не является частью IModelBinder, но защищенным методом в DefaultModelBinder. Вы можете получить доступ к нему, только если вы суб-причислять к DefaultModelBinder.

следующие пункты должны ответить на ваш вопрос:

  • BindProperty использует IModelBinder интерфейс он получает от PropertyType из аргумента дескриптор свойства. Этот позволяет вводить пользовательские свойства в свойство метаданные.
  • BindProperty правильно проверки. Он (также) называет Метод SetProperty, только если новое значение является допустимым.

поэтому, если вы хотите правильную проверку (используя атрибуты аннотации), вы обязательно должны вызвать BindProperty. Вызывая SetProperty, вы обходите все встроенные механизмы проверки.

вы должны проверить исходный код DefaultModelBinder посмотреть, что делает каждый метод, так как intellisense предоставляет только ограниченную информацию.


Я думаю, что SetProperty принимает фактическое значение для установки в качестве последнего параметра.