ModelState验证检查多个布尔属性

时间:2014-06-20 02:22:58

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

我有一个具有多个布尔属性的视图模型,在我的控制器中,我在继续服务层之前检查ModelState.IsValid。现在我想让ModelState.IsValid返回false如果boolean属性都没有设置为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;}
}

2 个答案:

答案 0 :(得分:2)

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

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<ValidationResult>
  3. 在模型绑定过程中,将自动调用此方法,如果返回验证结果,则ModelState将不再有效。因此,在您的控制器中使用此熟悉的代码将确保您不采取任何操作,除非您的自定义条件检查:

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

答案 1 :(得分:0)

您可以扩展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; }
}