MVC模型绑定 - 验证每个属性?

时间:2012-10-09 13:52:27

标签: c# asp.net-mvc-3 validation

我有一些通用验证我希望将毯子应用于每个模型的每个字符串属性。我正在寻找子类化DefaultModelBinder并通过覆盖BindProperty方法添加逻辑。这是否适合做?

2 个答案:

答案 0 :(得分:2)

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

    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");
               }
            }
        }
    }
    

    使用ModelBinder

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

    更多信息

答案 1 :(得分:1)

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