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
可空或不可空的不同组合。行为没有变化。
唯一可行的解决方案似乎是禁用对该 属性 的验证。这需要两个步骤:
- 在调用
ModelState.IsValid
之前的 OnPost 方法中,插入对 ModelState.Remove("ModelDiver.DiverIDList");
的调用
- 在 CSHTML 中,将
data-val="false"
添加到 <select>
标签。
我有一个 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
可空或不可空的不同组合。行为没有变化。
唯一可行的解决方案似乎是禁用对该 属性 的验证。这需要两个步骤:
- 在调用
ModelState.IsValid
之前的 OnPost 方法中,插入对ModelState.Remove("ModelDiver.DiverIDList");
的调用
- 在 CSHTML 中,将
data-val="false"
添加到<select>
标签。