.NET模型列表的Remote Validation远程验证失效问题
问题解决:ASP.NET Remote验证在模型列表动态表格中失效
问题场景
为ItemQuantity字段配置了Remote远程验证,要求输入数量小于数据库可用库存,单个文本框场景下验证正常触发,但绑定模型列表的动态表格场景中验证无法生效。
问题原因
当模型以列表形式绑定表单时,ASP.NET生成的字段名称为StrRequestDetails[i].ItemQuantity和StrRequestDetails[i].ItemCode,但默认Remote属性生成的验证规则中,AdditionalFields参数仅传递ItemCode,而非带索引的StrRequestDetails[i].ItemCode,导致后台验证方法无法获取对应行的ItemCode值,验证逻辑失效。
解决方案
在视图的for循环中,手动为每个ItemQuantity输入框设置正确的data-val-remote-additionalfields属性,指定带索引的ItemCode字段名:
修改后的视图代码
@for(int i =0; i< Model.StrRequestDetails.Count; i++) { <tr> <td> <select class="form-control" asp-for="@Model.StrRequestDetails[i].CategoryCode" asp-items="@ViewBag.ListofCategory" onchange='Change(this)'> <option value="">---Select Category---</option> </select> <span asp-validation-for="@Model.StrRequestDetails[i].CategoryCode" class="text-danger"> </span> </td> <td> <select class="form-control" asp-for="@Model.StrRequestDetails[i].ItemCode" id="ItemCodes"></select> <span asp-validation-for="@Model.StrRequestDetails[i].ItemCode" class="text-danger"></span> </td> <td> <input class="form-control" asp-for="@Model.StrRequestDetails[i].ItemQuantity" data-val-remote-additionalfields="*.StrRequestDetails[@i].ItemCode" /> <span asp-validation-for="@Model.StrRequestDetails[i].ItemQuantity" class="text-danger"></span> </td> <td> <button type="button" class="btn btn-primary" id="btnremove-@i" onclick="DeleteItem(this);">Delete</button> </td> </tr> }
补充说明
data-val-remote-additionalfields的值格式为*.字段全名,其中StrRequestDetails[@i].ItemCode是对应行的ItemCode字段名称,循环中的@i会被自动替换为当前索引值。- 确保后台验证方法的参数名称与字段名保持一致,当前代码中的
ItemQuantity和ItemCode参数是正确匹配的。
可选优化:后台空值处理
为避免未找到商品时出现空引用异常,建议在验证方法中增加空值判断:
[AcceptVerbs("get", "post")] [AllowAnonymous] public JsonResult VerifyQuntity(int ItemQuantity, int ItemCode) { var qutity = _context.StrItemCodes.FirstOrDefault(e => e.ItemCode == ItemCode); // 未找到对应商品时直接返回验证失败 if(qutity == null) { return Json("商品未在库存中找到"); } bool result = ItemQuantity <= qutity.TotalQuaAva; return Json(result); }
内容的提问来源于stack exchange,提问作者AL- MAHROUQI
相关产品推荐
相关产品推荐

