我有一些通用验证我希望将毯子应用于每个模型的每个字符串属性。我正在寻找子类化DefaultModelBinder
并通过覆盖BindProperty
方法添加逻辑。这是否适合做?
答案 0 :(得分: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
}
答案 1 :(得分:1)
对DefaultModelBinder
进行子类化并覆盖BindProperty
对我来说效果很好。调用base.BindProperty可确保设置模型的属性,然后我可以对其进行评估以进行全局验证。