ASP.NET MVC中如何为List集合内的元素应用C#特性?
为List内元素应用验证特性的解决方案
在ASP.NET Core中,直接对List<T>类型的属性添加验证特性只会验证整个列表是否存在/非空,无法作用于列表内的单个元素。你需要通过创建包含单个元素验证规则的子模型来解决这个问题,具体步骤如下:
1. 创建子模型定义验证规则
定义一个包含单个标签和目标值的子模型,将验证特性直接应用到子模型的属性上:
public class ChartItemModel { [Required] [StringLength(maximumLength: 75)] public string? Label { get; set; } [Range(1, 100)] public int Goal { get; set; } = 0; }
2. 修改主模型使用子模型列表
在ChartModel中用List<ChartItemModel>替代原来的两个独立列表:
public class ChartModel { public List<ChartItemModel> Items { get; set; } = new List<ChartItemModel>(); }
3. 视图中绑定子模型属性并显示验证信息
在表单中遍历Items列表,绑定子模型的Label和Goal属性,同时对应设置验证提示:
@model ChartModel @for (int ind = 0; ind < Model.Items.Count; ind++) { <div> <input asp-for="Items[ind].Label" class="form-control" placeholder="@Model.Items[ind].Label" value="@Model.Items[ind].Label" /> <span asp-validation-for="Items[ind].Label" class="text-danger"></span> </div> <div> <input asp-for="Items[ind].Goal" class="form-control" placeholder="@Model.Items[ind].Goal" value="@Model.Items[ind].Goal" /> <span asp-validation-for="Items[ind].Goal" class="text-danger"></span> </div> }
为什么原有方法无效?
- 直接在
List<string?>上添加[Required]和[StringLength]:这些特性是验证列表本身是否为null或空集合,不会检查列表内的每个字符串元素。 - 使用独立的
LabelValidation/GoalValidation属性:输入框绑定的是LabelList[ind],但验证提示绑定的是LabelValidation,两者不属于同一个字段,验证框架无法关联,因此不会触发验证。
内容的提问来源于stack exchange,提问作者Manuel Rodriguez
相关产品推荐
相关产品推荐

