我有一个具有多个布尔属性的视图模型,在我的控制器中,我在继续服务层之前检查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;}
}
答案 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");
}
}
}
注意模型:
IValidateableObject
Validate
的方法,它返回类型IEnumerable<ValidationResult>
在模型绑定过程中,将自动调用此方法,如果返回验证结果,则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; }
}