ASP.NET Core MVC子实体验证信息无法在视图显示问题求助
1. 确保控制器正确处理模型验证
在创建Restaurant的控制器方法中,必须显式检查ModelState.IsValid,验证失败时返回原视图并保留错误信息,这样视图才能读取到验证结果:
[HttpPost] public IActionResult Create(Restaurant restaurant) { if (!ModelState.IsValid) { // 保留验证错误,返回原视图 return View(restaurant); } // 后续保存逻辑 _context.Restaurants.Add(restaurant); _context.SaveChanges(); return RedirectToAction(nameof(Index)); }
2. 修正视图中的表单绑定代码
你的视图里已经用了asp-for,但手动指定name属性可能干扰自动绑定,导致验证信息无法关联到对应字段。建议移除手动设置的name和value(asp-for会自动填充值):
<div id="menuFields" class="toggable-div" style="display: @ViewData["Visibility"]" data-count="0"> @if (Model?.Menus != null) { @foreach (var (menu,i) in Model.Menus.Select((menu, index) => (menu,index)).ToArray()) { <div class="form-group"> <label asp-for="Menus[@i].Name">Menu Name</label> <input asp-for="Menus[@i].Name" type="text" class="form-control" id="menuName@(i)" /> <span asp-validation-for="Menus[@i].Name" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="Menus[@i].Description">Menu Description</label> <input asp-for="Menus[@i].Description" type="text" class="form-control" id="menuDescription@(i)" /> <span asp-validation-for="Menus[@i].Description" class="text-danger"></span> </div> } } </div>
3. 确认客户端验证脚本已引入
ASP.NET Core的客户端验证依赖三个核心脚本,必须在视图或布局页中引入,否则提交前的即时验证和提交后的错误渲染都会失效:
<script src="~/lib/jquery/dist/jquery.min.js"></script> <script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script> <script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script>
如果菜单字段是动态添加的(比如通过JS新增输入框),还要在动态生成字段后重新初始化验证:
// 动态添加菜单字段后执行此代码,重新绑定验证规则 $.validator.unobtrusive.parse('#menuFields');
4. 检查ModelState是否包含子实体错误
可以在控制器中调试查看ModelState的内容,如果没有Menus[0].Name这类键的错误,说明表单数据绑定失败,需要检查提交的参数格式是否符合嵌套集合的绑定要求(比如参数名是否为Menus[0].Name)。
内容的提问来源于stack exchange,提问作者newnick988888
相关产品推荐
相关产品推荐

