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

时间:2014-08-28 12:24:40

标签: asp.net-mvc enums requiredfieldvalidator

我最近意识到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上选择任何内容时,我没有收到任何警告。我可能知道问题的原因:如果我比较两个选择元素,我可以看到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>

2 个答案:

答案 0 :(得分:10)

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

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

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

    public AppType? ApplicationType { get; set; }
    

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

答案 1 :(得分:0)

[EnumDataType(typeof(AppType))]

MSDN Article