我有一些通用验证,我希望将毯子应用于每个模型上的每个字符串属性。我正在考虑DefaultModelBinder
通过覆盖BindProperty
方法来继承和添加逻辑。这是合适的做法吗?
问问题
902 次
2 回答
2
- 编写您自己的自定义模型绑定器。
- 使用反射获取所有属性
- 检查属性是否属于类型
string
- 使用反射获取属性的值
- 运行您的自定义验证并将验证错误添加到
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 回答