IModelBinder 上的 BindProperty 和 SetProperty 有什么区别
-
20-09-2019 - |
题
我正在 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);
}
我不确定两者之间有什么区别以及我是否按照推荐的方式这样做。
解决方案
首先,BindProperty 不是 IModelBinder 的一部分,而是 DefaultModelBinder 中的受保护方法。仅当您对 DefaultModelBinder 进行子类化时才可以访问它。
以下几点应该可以回答您的问题:
- BindProperty 使用 IModelBinder 它从 PropertyType 的 propertyDescriptor 参数。这 允许您注入自定义 properties 添加到属性中 元数据。
- 绑定属性正确 处理验证。它(也)调用 SetProperty 方法,仅当 新值有效。
因此,如果您想要正确的验证(使用注释属性),您必须调用 BindProperty。通过调用 SetProperty,您可以绕过所有内置验证机制。
你应该检查一下源代码 默认模型绑定器 查看每种方法的作用,因为智能感知仅提供有限的信息。
其他提示
我想的SetProperty取实际值设置为最后一个参数。
不隶属于 StackOverflow