如何让ValidationSummary一次性展示所有验证错误信息
根本原因
ASP.NET MVC 默认的验证执行逻辑是先运行所有属性级验证(比如[Required]等数据注解规则),只有属性级验证全部通过后,才会执行实现了IValidatableObject接口的对象级Validate方法,这就是错误分批次展示的核心原因。
解决方案
你只需要在控制器的处理Action中手动触发对象级验证,把自定义验证的结果提前加入ModelState,就能实现所有错误一次性展示:
[HttpPost] public ActionResult 你的业务处理方法(你的模型类 model) { // 手动执行全量验证(同时包含属性级验证+对象级自定义验证) var validationContext = new ValidationContext(model); var allValidationResults = new List<ValidationResult>(); // validateAllProperties设为true时会强制执行所有层级的验证规则 Validator.TryValidateObject(model, validationContext, allValidationResults, validateAllProperties: true); // 将所有自定义验证结果同步到ModelState中 foreach (var result in allValidationResults) { if (result.MemberNames.Any()) { foreach (var memberName in result.MemberNames) { ModelState.AddModelError(memberName, result.ErrorMessage); } } else { // 没有关联属性的全局错误直接加入空键 ModelState.AddModelError(string.Empty, result.ErrorMessage); } } if (!ModelState.IsValid) { // 返回视图时ModelState已经包含所有层级的错误 return View(model); } // 后续正常业务逻辑 }
额外说明
你当前使用的@Html.ValidationSummary(false, "", new { @class = "text-danger" })第一个参数为false,本身已经配置为同时展示属性错误和全局错误,不需要修改。如果需要前端也实现一次性校验所有规则,只需额外为自定义验证规则编写jQuery Validate适配代码,让客户端也能同时触发属性校验和自定义规则校验即可。
内容的提问来源于stack exchange,提问作者Adok
相关产品推荐
相关产品推荐

