【问题标题】:Razor/MVC Empty List ValidationRazor/MVC 空列表验证
【发布时间】:2020-06-10 11:35:51
【问题描述】:

我有一个 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>

【问题讨论】:

  • 这个问题与stackoverflow.com/questions/39608083/… 非常相似,当创建自定义验证属性时,也不会调用空列表。但是,如果您将自定义验证属性构建为从 requiredattribute 继承,它将始终被调用,即使为空

标签: asp.net-mvc validation razor zero


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    相关资源
    最近更新 更多