ASP.NET MVC 5枚举字段未加[Required]却提示必填的问题排查
枚举字段莫名触发必填验证?解决方案来了
嘿,这个问题我之前做ASP.NET MVC项目时也踩过坑,咱们一步步理清楚:
为啥会出现这个问题?
你遇到的必填错误,根源在于C#里的枚举是值类型——值类型默认不能为null,哪怕你没加[Required]特性,ASP.NET MVC的模型验证机制会默认认为值类型字段必须提供有效值。而且你加的[Required(AllowEmptyStrings = true)]完全是无效操作,这个参数只针对字符串类型,对枚举半毛钱用没有。
哪怕你没给Genre赋值,它也会有一个默认值(比如SexeEnum的第一个枚举项),但MVC的验证会把这种“未明确选择”的情况判定为无效,所以弹出了"This field is required"的错误。
怎么解决?改成可空枚举就搞定了
要让这个字段允许留空,只需要把枚举类型改成可空值类型(在枚举名后面加个?),同时删掉那个没用的[Required]特性就行:
修改你的两个受益人类中的Genre属性:
// 原代码:[Required(AllowEmptyStrings = true)] public SexeEnum Genre { get; set; } // 修改后: public SexeEnum? Genre { get; set; }
这样一来,当用户不选择这个字段时,模型绑定会把Genre设为null,MVC的验证就不会再触发必填错误了。
额外要注意的小细节
- 如果你用Razor生成下拉框,记得给下拉框加一个空选项,比如:
@Html.DropDownListFor(m => m.Genre, new SelectList(Enum.GetValues(typeof(SexeEnum))), "请选择(可选)", new { @class = "form-control" })
不然下拉框默认会选中第一个枚举值,用户根本没法选择“留空”。
- 顺便提一句,你的
DateNaissance是DateTime值类型,如果这个字段也允许用户不填,建议也改成DateTime?,不然同样会触发类似的必填验证问题。
内容的提问来源于stack exchange,提问作者EL-Mehdi Loukach
相关产品推荐
相关产品推荐

