我有一个 ID 的选择列表,用户可以在List
中选择零多个项目。默认情况下,验证逻辑似乎至少需要一个元素。我尝试使用注释[MinLength(0)]
因为各种文档暗示它不仅适用于字符串,还适用于集合/列表。
我的问题的明显答案是禁用属性验证。
稍微不太明显的答案是编写我自己的自定义ValidationAttribute
这似乎比保证的要多
。我正在寻找是否有另一种简单的方法。
我的视图模型属性:
public List<int> DiverIDList { get; } = new List<int>();
我的 CSHTML:
@{
var DiverSL = (SelectList)ViewData["DiverSL"];
}
<div class="form-group">
<label asp-for="DiverIDList" class="control-label"></label>
<select asp-for="DiverIDList" class="form-control"
asp-items="@DiverSL" size="8">
<option value="">-- Select Divers --</option>
</select>
<span asp-validation-for="DiverIDList" class="text-danger" />
</div>
为了更好地理解这个问题,我决定创建一个从RequiredAttribute
派生的自定义ValidationAttribute
。尽管我能够验证我的新验证属性的IsValid
是否被调用,但仍存在ICollection.Count == 0
导致无法调用自定义验证并且服务器ModelState
包含错误的情况。在这种情况下,框架中的某些内容绕过了基于属性的验证。
因为我启用了可为空,所以我尝试了使List
可为空或不可为空的不同组合。 行为没有变化。
唯一可行的解决方案似乎是禁用对该属性的验证。这需要两个步骤:
- 在 OnPost 方法中,在调用
ModelState.IsValid
之前插入对ModelState.Remove("ModelDiver.DiverIDList");
的调用 - 在 CSHTML 中,将
data-val="false"
添加到<select>
标记。