ValidationSummary不显示用户验证失败错误的解决方法
问题原因
控制台能输出验证错误但ValidationSummary不显示,核心原因有两个:
ValidationSummary控件只会从ModelState字典中读取并渲染错误信息。当前控制器代码中,_UserManeger.CreateAsync、_UserManeger.AddClaimAsync返回的身份操作错误,仅被框架输出到调试控制台,没有手动添加到ModelState中,控件无法获取到对应内容。- 需要展示的“User Validation failed”属于全局模型级错误,这类错误需要将错误键设为空字符串添加到
ModelState,才能被ValidationSummary识别,当前代码没有做这一步处理。
配置方法
按以下两步修改即可:
- 修改控制器Post注册逻辑,将操作失败的全局提示和具体错误添加到
ModelState,同时修正原代码中按位与&的写法错误(应使用逻辑与&&),优化创建用户失败后仍执行添加角色逻辑的空引用风险,修改后的控制器代码如下:
[HttpPost("Register")] public async Task<ActionResult> Register(RegisterViewModle modle) { if (!ModelState.IsValid) { return View(modle); } var user = new ApplicationUser { Email = modle.Email, UserName = modle.Name }; var result = await _UserManeger.CreateAsync(user, modle.Pasword); if (result.Succeeded) { var roleResult = await _UserManeger.AddClaimAsync(user, new Claim(ClaimTypes.Role, "User")); if (roleResult.Succeeded) { await _SignInManager.SignInAsync(user, isPersistent:false); return Redirect("https://localhost:7195/user"); } // 添加角色失败时写入全局提示和具体错误 ModelState.AddModelError(string.Empty, "User Validation failed"); foreach (var error in roleResult.Errors) { ModelState.AddModelError(string.Empty, error.Description); } } else { // 创建用户失败时写入全局提示和具体错误 ModelState.AddModelError(string.Empty, "User Validation failed"); foreach (var error in result.Errors) { ModelState.AddModelError(string.Empty, error.Description); } } return View(modle); }
- 调整视图中
ValidationSummary的参数配置,确保全局错误可以正常显示:- 如果需要同时显示字段属性验证错误和全局提示,保持写法为
@Html.ValidationSummary(false)即可 - 如果只想显示“User Validation failed”这类全局提示,不显示单个字段的校验错误,修改为
@Html.ValidationSummary(true) - 可以自定义错误提示的样式,比如添加Bootstrap错误样式类:
@Html.ValidationSummary(false, "", new { @class = "text-danger" })
- 如果需要同时显示字段属性验证错误和全局提示,保持写法为
补充说明:
ModelState.AddModelError的第一个参数传入空字符串时,标记的是模型级全局错误,这类错误不会绑定到单个表单字段,只会被ValidationSummary渲染展示。
内容的提问来源于stack exchange,提问作者Vladlen
相关产品推荐
相关产品推荐

