2010-01-23 59 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; 
    } 
}