我正在使用ASP.NET MVC并通过我的模型上的自定义属性/数据注释实现自定义验证。
是否可以在自定义属性中访问对象父类的属性?
public class MyModel
{
[MyCustomValidator]
public string var1 {get; set;}
public string var2 {get; set;}
}
注意:使用asp.net mvc
public class MyCustomValidatorAttribute : ValidationAttribute
{
public bool override IsValid(Object value)
{
// somehow get access to var2 in the MyModel
}
}
所以基本上,使验证检查另一个属性的特定值。我试图将var2
的值作为参数传递给MyCustomValidator
,但这不起作用。
答案 0 :(得分:3)
不,基本上。在通过反射器搜索之后,您只能访问正在测试的成员的值 - 而不是包含对象,甚至是属性/字段/的成员信息。
我同意这是非常有限和令人沮丧的,但看起来这已在4.0修复 - 我之前的回复暗示此处,但在4.0中有一个IsValid
重载接受ValidationContext
,ObjectInstance
,通过{{3}}提供此信息。
答案 1 :(得分:1)
显然,MVC 2验证不支持validationContext
因为MVC 2针对DA 3.5。我不确定MVC 2 RC是否仍然如此,我正在使用VS 2010和MVC 2 Preview 1.
取自Brad Wilson在http://forums.asp.net/p/1457591/3650720.aspx
的帖子在3.5版本的DataAnnotations中没有验证上下文,这是MVC 2的目标。 [CustomValidation]属性也是DA4.0的工件,因此要编写自定义验证,您需要创建一个从ValidationAttribute派生的新验证属性
答案 2 :(得分:0)
请注意,您可以使用MVC3执行此操作:
public class MyCustomValidatorAttribute : ValidationAttribute
{
public bool override IsValid(Object value)
{
var model = validationContext.ObjectInstance as MyModel;
// would probably use reflection and pass property names instead of casting in real life
if (model.var2 != null && value == null)
{
return new ValidationResult("var1 is required when var2 is set");
}
return ValidationResult.Success;
}
}