Asp.net mvc 如何使RequiredAttribute与枚举字段一起工作

Asp.net mvc 如何使RequiredAttribute与枚举字段一起工作,asp.net-mvc,enums,requiredfieldvalidator,Asp.net Mvc,Enums,Requiredfieldvalidator,我最近意识到RequiredAttribute在枚举字段上不起作用。假设我在表单上有两个select元素,分别称为ddlconsors和ddlApplicationTypes,这两个元素都是在HtmlHelper方法的帮助下呈现的。协助人员制作绉纱的方法如下: @Html.DropDownListFor(x => x.OfficerID, Model.Officers, "<Choose>", new { id = "ddlAddressedOfficer" }) 其中Ap

我最近意识到RequiredAttribute在枚举字段上不起作用。假设我在表单上有两个select元素,分别称为ddlconsors和ddlApplicationTypes,这两个元素都是在HtmlHelper方法的帮助下呈现的。协助人员制作绉纱的方法如下:

 @Html.DropDownListFor(x => x.OfficerID, Model.Officers, "<Choose>", new { id = "ddlAddressedOfficer" })
其中ApplicationType的类型为名为AppType的自定义枚举

  public Enum AppType{
     None=0,
     Complaint,
     Query,
     Suggestion
  }
我用RequiredAttribute修饰了OfficeId和ApplicationType属性。当我没有选择任何内容时,我会在提交时收到验证警告。但当我没有在ddlApplicationType上选择任何内容时,我不会收到任何警告。我可能知道问题的原因:如果我比较两个select元素,我可以看到第一个选项Choose没有指定值,当选中该选项时,会导致验证出现问题。但是ddlApplicationType的第一个选项的值为None。因此,验证引擎会看到所选选项有一个值,并将其忽略。你建议怎么做才能让它工作

编辑:为了更清楚地看到,这里是两个select元素的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清楚地显示所需的数据验证已添加到所需的数据val中。简单地说,问题在于您的枚举总是有一个可接受的值。你可能认为没有人可以接受,但是从EnUM的角度来看,这很好。所以你有两个选择:

添加您自己的自定义验证以确保未选择任何验证。您需要在客户端和服务器端同时处理这个问题,因为在这里您完全是一个人

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

public AppType? ApplicationType { get; set; }
然后,所需的验证将按预期工作

此类允许您将列中的基础值映射到相应的枚举常量名称。这使您可以定义包含与数据库值相对应的描述性值的枚举,然后在显示数据时使用枚举常量名称而不是数据库值


如果它是您自己的helper方法,您可以修改它以生成没有值的第一个option元素,它可能看起来像-select-。如果ApplicationType是具有[Required]属性的可空枚举,则如果选择第一个选项,则该枚举应无效。@StephenMuecke,我希望您将此作为答案发布。我听从了你的建议,达到了目标。谢谢。再补充一下,上面的可空枚举之所以有效,是因为它将下拉列表中的默认值更改为空字符串,而不是零值(如果它是普通的不可空枚举,即int)。0的int将通过所需的属性检查,而具有空字符串的可空int则不会通过。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,则仅链接的答案可能无效
public AppType? ApplicationType { get; set; }
[EnumDataType(typeof(AppType))]