ASP.NET Core表单提交时验证错误信息无法显示问题求助
问题原因及修复方案
1. 控制器入参未绑定校验模型
你当前控制器的LeaveReview方法接收零散参数,系统不会自动套用CreatedReview上的校验注解对这些参数做校验,ModelState.IsValid会始终返回true,自然不会触发拦截。
2. 视图字段和模型属性不匹配
模型中评论字段名为Review1,但视图里评论输入框的name属性写的是review,二者无法对应绑定,校验规则找不到对应字段也不会生效。
3. 模型缺少无参构造函数
你自定义了带参构造函数后,框架模型绑定阶段无法实例化模型对象,会导致绑定失败。
对应修改代码
模型类新增无参构造函数
public class CreatedReview { // 新增无参构造函数 public CreatedReview() { } public CreatedReview(string review, int stars) { this.Review1 = review; this.Stars = stars; } public int Id { get; set; } [StringLength(60, MinimumLength = 3)] [Required] public string Review1 { get; set; } public int? RestaurantId { get; set; } public int? UserId { get; set; } [Required] public int? Stars { get; set; } }
控制器改为接收模型参数
public IActionResult LeaveReview(CreatedReview model, string name, int zipcode) { if (!ModelState.IsValid) { // 校验不通过时把模型带回视图,才能显示错误提示 return View("Index", model); } // 你的业务逻辑 var newReview = new CreatedReview(model.Review1, model.Stars.Value); return View("Index"); }
视图用asp-for绑定模型字段
用asp-for会自动生成正确的name属性和前端校验属性,不需要手动写name,避免匹配错误。
@model CreatedReview @{} <h1>发布评论</h1> <form method="post" asp-action="LeaveReview"> <p>餐厅名称</p> <input type="text" name="name" /> <p>邮编</p> <input type="number" name="zipcode" /> <p>评论内容</p> <input type="text" asp-for="Review1" /> <span asp-validation-for="Review1" class="text-danger"></span> <p>星级评分</p> <input type="number" asp-for="Stars" /> <span asp-validation-for="Stars" class="text-danger"></span> <input type="submit" value="提交" /> </form> <!-- 加上以下代码启用客户端校验,提交前就会提示错误,不用走后端请求 --> @section Scripts { <partial name="_ValidationScriptsPartial" /> }
可选优化
如果不需要兼容纯js禁用的场景,加了客户端校验脚本后,用户没填内容点提交时浏览器会直接显示错误,不会发请求到后端,体验更好。
内容的提问来源于stack exchange,提问作者Sokmixtp
相关产品推荐
相关产品推荐

