我只是掌握了自定义验证属性,我正在尝试编写一个自定义验证attirbute,它将放置在类级别,以验证我的模型的多个属性。
我可以访问我的模型上的所有属性,并且我希望能够检查我的IsValid重载中的多个条件,并报告它们,具有如下不同的错误消息(简单示例)。
public override bool IsValid(object value)
{
var model = (MyObject) value;
//if this value is set, I don't want to do anything other checks
if (model.Prop3)
{
return true;
}
if (model.Prop1 == "blah" && model.Prop2 == 1)
{
ErrorMessage = "you can't enter blah if prop 2 equals 1";
return false;
}
if(model.Prop1 == "blah blah" && model.Prop2 == 2)
{
ErrorMessage = "you can't enter blah blah if prop 2 equals 2";
return false;
}
return true;
}
但是当我这样做时,我在第一次引用ErrorMessage时遇到异常“无法多次设置属性。
现在我可以将自定义属性拆分为多个自定义属性,但希望有一种方法可以在一个属性中进行,否则,我会在每个中重复我的“全部捕获”
//if this value is set, I don't want to do anything other checks
if (model.Prop3)
{
return true;
}
我已经进行了搜索,但找不到任何内容,如果我遗漏任何明显的内容,请道歉。
提前感谢!
答案 0 :(得分:3)
在MVC4中,您可以覆盖IsValid以返回不同的消息作为ValidationResult
public class StrongPasswordAttribute : ValidationAttribute
{
protected override ValidationResult IsValid(object value, ValidationContext context)
{
if (value == null)
return new ValidationResult("Password is required");
var val = value.ToString();
if (!Regex.Match(val, @"^(?=.*[a-z]).{0,}$").Success)
{
return new ValidationResult("Password must contain at least one lower case letter");
}
if (!Regex.Match(val, @"^(?=.*[A-Z]).{0,}$").Success)
{
return new ValidationResult("Password must contain at least one UPPER case letter");
}
if (!Regex.Match(val, @"^(?=.*\d).{0,}$").Success)
{
return new ValidationResult("Password must contain at least one number");
}
return ValidationResult.Success;
}
}
答案 1 :(得分:1)
有趣的问题!我可以想到两个解决方案。所以不是基于你想要的适当解决方案,但它们可能有助于重用你的代码。你不能创建一个名为MyCustomAttribute(或其他东西)的CustomAttribute抽象类,它以下列方式覆盖IsValid:
public override bool IsValid(object value)
{
var model = (MyObject) value;
//if this value is set, I don't want to do anything other checks
if (model.Prop3)
{
return true;
}
CustomValidate(model);
}
CustomValidate(MyObject model)
是您的抽象方法,您可以编写多个扩展MyCustomAttribute的自定义属性类,并且纯粹需要为特定方案实现验证逻辑。
所以你可以有两个班级:
public class BlahCustomAttribute : MyCustomAttribute
{
public override Boolean CustomValidate(MyObject obj)
{
if (model.Prop1 == "blah" && model.Prop2 == 1)
{
ErrorMessage = "you can't enter blah if prop 2 equals 1";
return false;
}
}
}
public class BlahBlahCustomAttribute : MyCustomAttribute
{
public override Boolean CustomValidate(MyObject obj)
{
if (model.Prop1 == "blah" && model.Prop2 == 1)
{
ErrorMessage = "you can't enter blah blah if prop 2 equals 1";
return false;
}
}
}
希望这会有所帮助 - 不完全是你想要的,但也能完成工作,也很干净。
另一个解决方案是用逗号分隔ErrorMessage属性中的错误消息并在前端处理它(但我会采用第一种方法)。