ICollection类型模型属性验证失效问题求助
解决集合属性验证不生效的问题
1. 修改模型导航属性类型
把EmployeeInfo里的EmergencyInfos从ICollection<EmergencyInfo>换成IList<EmergencyInfo>——因为ICollection没有索引器,没法直接用[i]取元素,IList支持索引操作,这样页面绑定才不会报错:
public partial class EmployeeInfo { public int EmployeeInfoId { get; set; } [Required] [DisplayName("Last Name")] public string LastName { get; set; } = null!; // 换成IList,保持初始化的List实例不变 public virtual IList<EmergencyInfo> EmergencyInfos { get; } = new List<EmergencyInfo>(); }
2. 修正Razor页面的绑定代码
别再手动写ToList()和name属性了,用asp-for自动生成绑定表达式,再用for循环遍历集合(必须用for循环,因为要通过索引对应模型的集合元素):
@model AckPackage.Models.EmployeeInfo @{ ViewData["Title"] = "Create"; } <div class="form-group row"> <div class="col-sm-4"> <label asp-for="LastName" class="control-label"></label> <input asp-for="LastName" class="form-control input-lg" /> <span asp-validation-for="LastName" class="text-danger"></span> </div> @* 用for循环遍历EmergencyInfos,确保每个元素正确绑定到模型 *@ @for (int i = 0; i < Model.EmergencyInfos.Count; i++) { <div class="col"> <label asp-for="EmergencyInfos[i].FirstName" class="control-label"></label> <input asp-for="EmergencyInfos[i].FirstName" class="form-control" /> <span asp-validation-for="EmergencyInfos[i].FirstName" class="text-danger"></span> </div> } </div> @section Scripts { @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); } }
3. 服务器端添加验证逻辑
在Post方法里一定要检查ModelState.IsValid,确保服务器端也会校验集合里的必填项:
public async Task<IActionResult> OnPostAsync() { // 先验证模型完整性,包括集合中每个EmergencyInfo的FirstName if (!ModelState.IsValid) { return Page(); } _context.EmployeeInfo.Add(Model); await _context.SaveChangesAsync(); return RedirectToPage("./Index"); }
原写法失效原因
- 用
ToList()后,asp-for绑定的是临时生成的List对象,而非原模型的EmergencyInfos集合,验证框架找不到对应的[Required]规则,自然不触发验证。 - 直接删除
ToList()编译报错,是因为ICollection<T>接口没有定义索引器([i]访问方式),无法直接通过索引获取元素,换成IList<T>即可解决这个问题。
内容的提问来源于stack exchange,提问作者Anjali
相关产品推荐
相关产品推荐

