【问题标题】:No required attribute added but ModelState is still false没有添加必需的属性,但 ModelState 仍然为 false
【发布时间】:2014-11-18 20:07:19
【问题描述】:

我有一个具有多个枚举类型属性的模型。我使用新的 MVC Html 辅助方法调用 EnumForDropDownList 填充所有这些。其中一些是必需的,所以我添加了一个RequiredAttribute。不知何故,对于那些不需要的,我总是得到 ModelState=false 。我用调试器发现了这一点:

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

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

知道我不明白

  1. 如果不需要验证失败的属性,为什么 ModelState 为 false。 (唯一的属性是 [Column] 映射)。
  2. 如果RequiredAttribute 以某种方式被隐式添加到这些属性中,那么为什么我不会像那些带有Required Attribute 的那样收到客户端验证错误?

附:如果我在这些属性上选择一个值,那么问题就会消失。

编辑:这是模型:

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

【问题讨论】:

    标签: asp.net-mvc requiredfieldvalidator modelstate


    【解决方案1】:

    enum 类型不能设置为null。如果你想在 enum 类型中有 null 值,你必须将它们声明为

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

    【讨论】:

    • 不是null,是空字符串。("")
    • 'Enum' 属性不能设置为空字符串或 null。该消息的意思是通知该属性的值不能为空,即“null”您也可以发布您的模型吗?
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-05
      • 2023-03-04
      • 2017-04-14
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-25
      相关资源
      最近更新 更多