Razor/MVC 空列表验证

Razor/MVC Empty List Validation

我有一个 ID 的 SelectList,用户可以将零多个项目选入 List。默认情况下,验证逻辑似乎需要至少选择一个元素。我尝试使用注释 [MinLength(0)] 因为各种文档暗示它不仅适用于字符串而且适用于 collections/lists.

我的问题的明显答案是禁用 属性.

的验证

不太明显的答案是写我自己的习惯ValidationAttribute,这似乎比保证的要多。

我正在寻找是否有另一种简单的方法。

我的 ViewModel 属性:

        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 包含一个错误。在这种情况下,框架中的某些内容正在绕过基于属性的验证。

因为我启用了 Nullable,所以我尝试了使 List 可空或不可空的不同组合。行为没有变化。

唯一可行的解​​决方案似乎是禁用对该 属性 的验证。这需要两个步骤:

  1. 在调用 ModelState.IsValid 之前的 OnPost 方法中,插入对 ModelState.Remove("ModelDiver.DiverIDList");
  2. 的调用
  3. 在 CSHTML 中,将 data-val="false" 添加到 <select> 标签。