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=""><Choose></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"><Choose></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的角度来看,它很好.所以你有两个选择:
添加您自己的自定义验证以确保None未选中.你需要在客户端和服务器端处理这个问题,因为你完全独自在这里.
如果您可以更改枚举,则可以删除该None选项,然后在模型/视图模型属性上使用可为空的枚举,即:
public AppType? ApplicationType { get; set; }
Run Code Online (Sandbox Code Playgroud)
然后,所需的验证将按预期工作.
| 归档时间: |
|
| 查看次数: |
3980 次 |
| 最近记录: |