如何使RequiredAttribute与枚举字段一起使用

2023-11-26

我最近意识到 requiredAttribute 不适用于枚举字段。假设我在表单上有两个名为 ddlOfficers 和 ddlApplicationTypes 的选择元素,这两个元素都是在 HtmlHelper 方法的帮助下呈现的。创建ddlOfficers的辅助方法如下:

 @Html.DropDownListFor(x => x.OfficerID, Model.Officers, "<Choose>", new { id = "ddlAddressedOfficer" })

其中,OfficerID 是Nullable<int>

对于 ddlApplicationTypes,我必须编写一个扩展方法,让我为枚举字段创建下拉列表:

 @Html.EnumDropDownListFor(x => x.ApplicationType, new { @class = "select-normal" })

其中 ApplicationType 是名为 AppType 的自定义枚举类型

  public Enum AppType{
     None=0,
     Complaint,
     Query,
     Suggestion
  }

我已经用RequiredAttribute 修饰了OfficerID 和ApplicationType 属性。当我不在 ddlOfficers 上选择任何内容时,我会在提交时收到验证警告。但是,当我未在 ddlApplicationType 上选择任何内容时,我不会收到任何警告。我可能知道问题的原因:如果我比较两个 select 元素,我可以看到 ddlOfficers 的第一个选项(Choose)没有指定值,选择该值时会导致验证抱怨。但 ddlApplicationType 的第一个选项的值为“None”。因此,验证引擎发现所选选项具有值并简单地忽略它。您建议做什么才能让它发挥作用?

编辑:为了让事情更清楚地看到这里是两个选择元素的 html:

<select class="select-normal input-validation-error" data-val="true"  data-val-required="Choose the addressed officer" id="ddlOfficers" name="OfficerID">
   <option value="">&lt;Choose&gt;</option>
   <option value="1">Ben Martin</option>
   <option value="2">Nick Carter</option>
   <option value="3">Sebastian Van</option>
</select>

<select class="select-normal valid" data-val="true" data-val-required="Select the application type" id="ddlApplicationType" name="ApplicationType">
   <option selected="selected" value="None">&lt;Choose&gt;</option>
   <option value="Complaint">Complaint</option>
   <option value="Query">Query</option>
   <option value="Suggestion">Suggestion</option>
</select>

您的自定义助手没有任何问题。 HTML 清楚地表明已添加所需的数据验证(data-val-required)。简单地说,问题是你的枚举总是有一个可接受的值。你可能不考虑None可以接受,但从枚举的角度来看,这很好。所以你有两个选择:

  1. 添加您自己的自定义验证以确保None未选择。您需要在客户端和服务器端处理这个问题,因为您在这里完全靠自己。

  2. 如果可以更改枚举,则可以删除None选项,然后只需在模型/视图模型属性上使用可为空的枚举,即:

    public AppType? ApplicationType { get; set; }
    

    然后,所需的验证将按预期进行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使RequiredAttribute与枚举字段一起使用 的相关文章

随机推荐