Asp.net mvc IModelBinder上的BindProperty和SetProperty有什么区别

Asp.net mvc IModelBinder上的BindProperty和SetProperty有什么区别,asp.net-mvc,modelbinders,Asp.net Mvc,Modelbinders,我正在Mvc应用程序中创建一个自定义模型绑定器,我想将字符串解析为枚举值并将其分配给模型属性。我已经让它覆盖了BindProperty方法,但是我还注意到有一个SetProperty方法 protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor p

我正在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);
    }

我不确定两者之间有什么区别,也不确定我是否以推荐的方式执行此操作。

我认为SetProperty将实际值设置为最后一个参数。

首先,BindProperty不是IModelBinder的一部分,而是DefaultModelBinder中的一个受保护方法。只有在对DefaultModelBinder进行子分类时,才能访问它

以下几点可以回答您的问题:

  • BindProperty使用IModelBinder 它从 属性的类型 propertyDescriptor参数。这 允许您注入自定义 将属性转换为属性 元数据
  • 正确地绑定属性 处理验证。它(也)称之为 仅当 新值有效
因此,如果您想要正确的验证(使用注释属性),您必须明确地调用BindProperty。通过调用SetProperty,可以绕过所有内置的验证机制


由于intellisense只提供有限的信息,您应该查看的源代码,看看每个方法的作用。

源代码现在位于@Rob。您的URL无效also@Kilanny怎么了?它似乎对我仍然有效。