2011-11-27 20 views
3
另一個屬性

考慮驗證屬性我有這兩個屬性:如何根據DataAnnotation

public class Test 
{ 
    [Required(ErrorMessage = "Please Enetr Age")] 
    public System.Int32 Age { get; set; } 
    [Required(ErrorMessage = "Choose an option")] 
    public System.Boolean IsOld { get; set; } 
} 

當用戶例如15進入的Age,然後選擇「Yes」爲IsOld,我返回異常那正確的AgeIsOld。我爲它使用CustomValidation,但因爲我的驗證必須是靜態的,所以我無法訪問其他屬性。我怎樣才能做到這一點DataAnnotation

+0

至於我看到,如果任何這些值是沒有提交它會拋出異常。你還想要什麼?其實這不是很瞭解你在找什麼 –

+0

我說如果所有人都被偷偷???使用輸入15爲Age並選擇IsOld。 – Arian

+0

你的意思是說如果有人在你的'Age'屬性中輸入一個值,那麼'IsOld'被設置爲true? –

回答

6

您可以將數據註釋(自定義驗證器)添加到類本身。在您的驗證屬性的isValid方法中,您應該能夠投射對象並測試需要實現的值。

例子:

using System; 
using System.Collections.ObjectModel; 
using System.ComponentModel.DataAnnotations; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      // setup test object 
      Test t = new Test() { Age = 16, IsOld = true }; 
      // store validation results 
      Collection<ValidationResult> validationResults = new Collection<ValidationResult>(); 
      // run validation 
      if (Validator.TryValidateObject(t, new ValidationContext(t, null, null), validationResults, true)) 
      { 
       // validation passed 
       Console.WriteLine("All items passed validation"); 
      } 
      else 
      { 
       // validation failed 
       foreach (var item in validationResults) 
       { 
        Console.WriteLine(item.ErrorMessage); 
       } 
      } 
      Console.ReadKey(true); 
     } 
    } 

    [TestValidation(ErrorMessage = "Test object is not valid")] 
    public class Test 
    { 
     public int Age { get; set; } 
     public bool IsOld { get; set; } 
    } 

    public class TestValidation : ValidationAttribute 
    { 
     public override bool IsValid(object value) 
     { 
      bool isValid = false; 
      Test testVal = value as Test; 
      if (testVal != null) 
      { 
       // conditional logic here 
       if ((testVal.Age >= 21 && testVal.IsOld) || (testVal.Age < 21 && !testVal.IsOld)) 
       { 
        // condition passed 
        isValid = true; 
       } 
      } 
      return isValid; 
     } 
    } 
}