我有一个具有多个枚举类型属性的模型。我使用新的 MVC Html 帮助器方法调用 EnumForDropDownList 来填充所有这些内容。其中一些是必需的,因此我添加了一个RequiredAttribute。不知怎的,对于那些不需要的,我总是得到 ModelState=false 。我用调试器发现了这一点:
当我查看 Messages.resx 文件时,我可以看到“不能为空”错误是针对RequiredAttribute:
<data name="PropertyValueRequired" xml:space="preserve">
<value>Cannot be empty</value>
</data>
知道我不明白
附注如果我在这些属性上选择一个值,那么问题就会消失。
编辑:这是模型:
public class DocumentCitizen{
[Column("DOCID")]
public int? DocID { get; set; }
[Column("SOCIALCAT")]
public SocialCategory SocialCat { get; set; }
[Column("GENDER")]
public Gender Gender { get; set; }
[Column("APPTYPE")]
[Required(ErrorMessage="Please select the application type")]
public ApplicationType {get;set; }
}
enum
类型不能设置为null
。如果您想在 null
类型中拥有 enum
值,则必须将它们声明为
public Nullable<YourEnum> MyProperty {get; set;}
事实上@Gaurav 是对的,我从一开始就应该知道这一点。如果属性类型是枚举,则意味着它可以具有枚举值范围内的值。 (不知何故,我并没有考虑该属性获得无效值,我只是陷入了验证问题)。为什么它获得无效值(在本例中为空字符串)是因为我重新配置了 EnumDropdownListFor 方法以将第一项的值设置为空字符串。然后,当它尝试将该空字符串分配给具有自定义枚举类型的那些属性时,ModelState 显然变得无效。我重新配置 EnumDropdownListFor is requiredAttribute 的原因是不起作用,因为即使我没有选择任何内容,也会选择第一个值,因此不会引发验证错误。
为了克服这两个问题,我只是将所有具有枚举类型的属性的类型更改为可空版本。这样,两个必需属性都可以工作,并且我可以将 null 传递给那些没有必需属性的属性。