看起来,当 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);
}
}
此方法的一个警告是,在没有属性级(数据注释)错误的情况下,验证将运行两次。为了避免这种情况,您可以向模型添加一个属性,例如布尔值 Validated,一旦运行,您就可以在 Validate() 方法中将其设置为 true,然后在手动调用控制器中的方法之前进行检查。
所以在你的控制器中:
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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)