【问题标题】:ModelState validation checking multiple boolean propertyModelState 验证检查多个布尔属性
【发布时间】:2014-06-20 02:22:57
【问题描述】:

我的视图模型具有多个布尔属性,在我的控制器中,我在进入服务层之前检查了ModelState.IsValid。现在我想让ModelState.IsValid 返回false 如果没有布尔属性设置为true,有没有办法让它发生?

这是我的示例类

public class Role {

   public int Id {get; set;}

   [Required(ErrorMessage = "Please enter a role name")]
   public string Name {get; set;}

   public bool IsCreator {get; set;}

   public bool IsEditor {get; set;}

   public bool IsPublisher {get; set;}
}

【问题讨论】:

    标签: c# asp.net-mvc viewmodel model-validation


    【解决方案1】:

    我会在模型上实现您自己的验证方法。您的模型最终会看起来像这样:

    public class Role : IValidatableObject {
       public int Id {get; set;}
    
       [Required(ErrorMessage = "Please enter a role name")]
       public string Name {get; set;}
    
       public bool IsCreator {get; set;}
    
       public bool IsEditor {get; set;}
    
       public bool IsPublisher {get; set;}
    
       public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
           if (!this.IsCreator && !this.IsEditor && !this.IsPublisher)) {
               yield return new ValidationResult("You must be a creator, editor or publisher");
           }
       }
    }
    

    注意模型:

    1. 实现IValidateableObject
    2. 有一个名为Validate 的方法返回类型IEnumerable&lt;ValidationResult&gt;

    在模型绑定过程中,此方法将被自动调用,如果返回验证结果,您的ModelState 将不再有效。因此,在您的控制器中使用这个熟悉的代码将确保您不采取任何行动,除非您的自定义条件检查:

    public class SomeController {
        public ActionResult SomeAction() {
            if (ModelState.IsValid) {
                //Do your stuff!
            }
        }
    }
    

    【讨论】:

    • 感谢它有效,但我需要将您的代码修改为if (!(this.IsCreator || this.IsEditor || this.IsPublisher))
    • 糟糕,好消息!你说得对,我翻转了我的一和零。
    • 嘿,我只是想在客户端应用这个?
    【解决方案2】:

    您可以扩展 ValidationAttribute:

    public class MustBeCreatorEditorPublisherAttribute : ValidationAttribute
    {
    
        public NoJoeOnMondaysAttribute() { ErrorMessage = "You must be a creator, editor or publisher"; }
    
        public override bool IsValid(object value)
        {
            using (Role role = value as Role)
            {
                return (role.IsCreator || role.IsEditor || role.IsPublisher);
    
            }
            return base.IsValid(value);
        }
    }
    

    你的模特:

    [MustBeCreatorEditorPublisher]
    public class Role
    {
        public int Id { get; set; }
    
        [Required(ErrorMessage = "Please enter a role name")]
        public string Name { get; set; }
    
        public bool IsCreator { get; set; }
    
        public bool IsEditor { get; set; }
    
        public bool IsPublisher { get; set; }
    }
    

    【讨论】:

    • 我不需要所有 bool 属性都为真,如果假设是这样的话,我已经想出了你的答案,相反,在我的情况下,我希望其中至少有 1 个为真,谢谢无论如何尝试:)
    猜你喜欢
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 2023-03-31
    • 2023-03-03
    • 2014-03-09
    • 1970-01-01
    相关资源
    最近更新 更多