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

Mik*_*yev 4 asp.net-mvc enums requiredfieldvalidator

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

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

WhereID是一个 Nullable<int>

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

 @Html.EnumDropDownListFor(x => x.ApplicationType, new { @class = "select-normal" })
Run Code Online (Sandbox Code Playgroud)

其中ApplicationType的类型为自定义枚举,称为AppType

  public Enum AppType{
     None=0,
     Complaint,
     Query,
     Suggestion
  }
Run Code Online (Sandbox Code Playgroud)

我使用RequiredAttribute修饰了OfficerID和ApplicationType属性.当我没有在ddlOfficers上选择任何内容时,我会在提交时收到验证警告.但是当我没有在ddlApplicationType上选择任何内容时,我没有收到任何警告.我可能知道问题的原因:如果我比较两个选择元素,我可以看到ddlOfficers的第一个选项(选择)没有指定值,选中后会导致验证抱怨.但是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>
Run Code Online (Sandbox Code Playgroud)

Chr*_*att 10

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

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

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

    public AppType? ApplicationType { get; set; }
    
    Run Code Online (Sandbox Code Playgroud)

    然后,所需的验证将按预期工作.

  • 只是添加上面Nullable枚举的原因是它将下拉列表中的默认值更改为空字符串而不是零值(如果它是普通的不可为空的枚举,即int).int为零将传递Required属性检查,而带有null(空字符串)的可空int将不会传递. (3认同)