获取包含类,然后在自定义属性中访问它的属性

时间:2010-01-23 04:28:00

标签: c# asp.net-mvc data-annotations

我正在使用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,但这不起作用。

3 个答案:

答案 0 :(得分:3)

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

我同意这是非常有限和令人沮丧的,但看起来这已在4.0修复 - 我之前的回复暗示此处,但在4.0中有一个IsValid重载接受ValidationContextObjectInstance,通过{{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;
    }
}