Razor / MVC空列表验证

问题描述 投票:0回答:1

我有一个ID的SelectList,用户可以在List中选择零个项目。默认情况下,验证逻辑似乎要求至少选择一个元素。我尝试使用批注[MinLength(0)],因为各种文档都暗示它不仅适用于字符串,而且适用于集合/列表。

我的问题的明显答案是仅禁用属性验证。

不太明显的答案是编写我自己的自定义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>
asp.net-mvc validation razor zero
1个回答
0
投票

为了更好地理解问题,我决定创建一个从ValidationAttribute派生的自定义RequiredAttribute。尽管我可以验证新的验证属性的IsValid被调用了,但是仍然有一些情况ICollection.Count == 0导致自定义验证没有被调用,并且服务器ModelState包含错误。在这种情况下,框架中的某些内容会绕过基于属性的验证。

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

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

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