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

问题描述 投票:0回答:2

我有一个具有多个枚举类型属性的模型。我使用新的 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。 (唯一的属性是[列]映射)。
  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
2个回答
3
投票

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

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

1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.