2010-01-23 60 views
3

我正在使用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

已更新回答re your comment – 2010-01-23 22:54:42

回答

1

显然,MVC 2验证不支持validationContext,因为MVC 2的目标是DA 3.5。我不知道这是否仍与MVC 2 RC的情况下,我使用VS 2010 MVC 2预览1.

从Brad Wilson的后摄于http://forums.asp.net/p/1457591/3650720.aspx

没有验证的上下文在3.5 SP1版本的DataAnnotations中,这是MVC 2的目标。在[CustomValidation]属性也是DA4.0的神器,所以写了一个自定义的验证,你需要创建一个ValidationAttribute

3

不,基本上。在通过反射器搜索后,您只能访问正在测试的成员的 - 而不是包含对象,或者甚至是属性/字段/任何成员信息。

这我同意是非常有限的和令人沮丧的,但它看起来像这样固定在4.0 - 我以前的答复暗示这个,但在4.0有一个IsValid重载接受ValidationContext,它通过提供这个信息来源ObjectInstance

+0

不'ObjectInstance'是否指用上述属性装饰的对象?此外,我似乎无法重写验证,它不显示。只有IsValid(对象值)显示。 – Omar 2010-01-23 16:29:19

+0

附注:使用asp.net mvc – Omar 2010-01-23 16:41:28

+0

@Baddie - 我稍后再看一下...... – 2010-01-23 19:08:05

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; 
    } 
}