IModelBinder上的BindProperty和SetProperty有什么区别

时间:2010-02-11 15:51:28

标签: asp.net-mvc modelbinders

我正在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 个答案:

答案 0 :(得分:7)

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

以下几点应该回答你的问题:

  • BindProperty使用IModelBinder 它来自的接口 PropertyType属性 propertyDescriptor参数。这个 允许您注入自定义 物业进入物业 元数据。
  • BindProperty正确 处理验证。它(也)打电话给 SetProperty方法只有 新值有效。

因此,如果您想要进行适当的验证(使用注释属性),您一定要调用BindProperty。通过调用SetProperty,您可以绕过所有内置验证机制。

你应该查看DefaultModelBinder的源代码,看看每个方法的作用,因为intellisense只提供有限的信息。

答案 1 :(得分:0)

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