4

我有一些通用验证,我希望将毯子应用于每个模型上的每个字符串属性。我正在考虑DefaultModelBinder通过覆盖BindProperty方法来继承和添加逻辑。这是合适的做法吗?

4

2 回答 2

2
  1. 编写您自己的自定义模型绑定器。
  2. 使用反射获取所有属性
  3. 检查属性是否属于类型string
  4. 使用反射获取属性的值
  5. 运行您的自定义验证并将验证错误添加到ModelState

样本

public class MyCustomModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        foreach (var propertyInfo in typeof(bindingContext.Model.GetType().GetProperties(BindingFlags.Public|BindingFlags.Instance))
        {
           if (propertyInfo.PropertyType == typeof(string)) 
           {
               var value = propertyInfo.GetValue(bindingContext.Model);
               // validate
               // append to ModelState if validation failed
               bindingContext.ModelState.AddModelError(propertyInfo.Name, "Validation Failed");
           }
        }
    }
}

使用模型绑定器

public ActionResult MyActionMethod([ModelBinder(typeof(MyCustomModelBinder ))] ModelType model)
{
  // ModelState.IsValid is false if validation fails
}

更多信息

于 2012-10-09T13:59:05.073 回答
1

子类化DefaultModelBinder和覆盖BindProperty对我来说效果很好。调用 base.BindProperty 可确保设置模型的属性,然后我可以评估它以进行全局验证。

于 2012-10-10T15:51:27.770 回答