В чем разница между BindProperty и SetProperty в IModelBinder - PullRequest
11 голосов
/ 11 февраля 2010

Я создаю пользовательский механизм связывания модели в приложении 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 ]

7 голосов
/ 25 ноября 2010

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

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

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

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

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

0 голосов
/ 30 сентября 2010

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

...