未添加必需属性但ModelState仍为false

时间:2014-09-24 10:52:32

标签: asp.net-mvc requiredfieldvalidator modelstate

我的模型有几个enum类型的属性。我使用新的MVC Html辅助方法调用EnumForDropDownList填充所有这些。其中一些是必需的,所以我添加了一个RequiredAttribute。不知怎的,我总是得到那些不需要的ModelState = false。我用调试器发现了这个: Here's the snapshot

当我查看Messages.resx文件时,我可以看到“不能为空”错误是针对RequiredAttribute:

  <data name="PropertyValueRequired" xml:space="preserve">
    <value>Cannot be empty</value>
  </data>

知道我不明白

  1. 如果不需要验证失败的属性,为什么ModelState为false。 (唯一的属性是[Column]映射)。
  2. 如果以某种方式将RequiredAttribute隐式添加到这些属性,那么为什么我不会像那些具有必需属性的那样获得客户端验证错误?
  3. P.S。如果我在这些属性上选择一个值,那么问题就会消失。

    编辑:这是模型:

    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; }
    }
    

2 个答案:

答案 0 :(得分:2)

enum类型无法设置为null。如果您希望null类型中包含enum值,则必须将其声明为

public Nullable<YouEnum> MyProperty {get; set;}

答案 1 :(得分:1)

事实上@Gaurav是对的,我应该从一开始就知道它。如果属性类型是枚举,则表示它可以具有枚举值范围内的值。 (我不知道是不是在考虑属性获得无效值,我只是陷入了验证的问题)。为什么它得到无效值,在这种情况下是一个空字符串,是因为我重新配置了EnumDropdownListFor方法以将第一个项的值设置为空字符串。然后,当它尝试将该空字符串分配给具有自定义枚举类型的属性时,ModelState显然变为无效。我重新配置EnumDropdownListFor的原因是RequiredAttribute没有工作,即使我没有选择任何东西,第一个值被选中,因此没有引发vaidation错误。

为了克服这两个问题,我只是将枚举类型的所有属性的类型更改为可以为空的版本。这样两个必需属性都可以工作,我可以将null传递给没有必需属性的那些。