【问题标题】:Get encompassing class, then access a property of it inside custom attribute获取包含类,然后在自定义属性中访问它的属性
【发布时间】:2010-01-23 04:28:00
【问题描述】:

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

【问题讨论】:

  • 更新回答您的评论

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


【解决方案1】:

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

我同意这是非常有限和令人沮丧的,但看起来这在 4.0 中已修复 - 我之前的回复 提示 在此,但在 4.0 中有一个 IsValid 重载接受 @ 987654322@,通过ObjectInstance 提供此信息。

【讨论】:

  • ObjectInstance 不是指用上述属性修饰的对象吗?另外,我似乎无法覆盖验证,它没有显示出来。只有 IsValid(object value) 显示出来。
  • 当我执行protected override ValidationResult IsValid(object value, ValidationContext validationContext) 时,validationContext 始终为空。
  • @Baddie - 好吧,这更更多令人沮丧。您可以在“连接”上登录为问题?
【解决方案2】:

显然,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 SP1 版本的 DataAnnotations 中没有验证上下文,这是 MVC 2 的目标。 [CustomValidation] 属性也是 DA4.0 的神器,所以要编写自定义验证,需要创建一个新的从 ValidationAttribute 派生的验证属性

【讨论】:

    【解决方案3】:

    只是说明您可以使用 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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-05-20
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-19
      • 1970-01-01
      相关资源
      最近更新 更多