看来,当MVC验证其首先通过DataAnnotation属性(如必需或范围)运行的模型时,如果其中任何一个失败,它将跳过在我的IValidatableObject模型上运行Validate方法。
有没有办法让MVC继续运行该方法,即使其他验证失败呢?
最佳答案
您可以通过传入ValidationContext的新实例来手动调用Validate(),如下所示:
[HttpPost]
public ActionResult Create(Model model) {
if (!ModelState.IsValid) {
var errors = model.Validate(new ValidationContext(model, null, null));
foreach (var error in errors)
foreach (var memberName in error.MemberNames)
ModelState.AddModelError(memberName, error.ErrorMessage);
return View(post);
}
}
此方法的一个警告是,在没有属性级(DataAnnotation)错误的实例中,验证将运行两次。为了避免这种情况,您可以在模型中添加一个属性,例如一个 bool(boolean) 值Validated,运行该值后,您可以在Validate()方法中将该属性设置为true,然后在 Controller 中手动调用该方法之前进行检查。
因此,在您的 Controller 中:
if (!ModelState.IsValid) {
if (!model.Validated) {
var validationResults = model.Validate(new ValidationContext(model, null, null));
foreach (var error in validationResults)
foreach (var memberName in error.MemberNames)
ModelState.AddModelError(memberName, error.ErrorMessage);
}
return View(post);
}
在您的模型中:
public bool Validated { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
// perform validation
Validated = true;
}
关于validation - 如何强制MVC验证IValidatableObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6431478/