2015-10-02 27 views
0

這是關於C#中的數據註釋。C# - 如果其他數據註釋

我有一個名爲MyClass的類。那裏我會有兩個屬性。

class MyClass 
{ 
     private string _propName; 
     public string PropName 
     { 
       get {return _propName;} 
       set {_propName=value;} 
     } 

     private string _propVal; 
     public string PropVal 
     { 
       get {return _propVal;} 
       set {_propVal=value;} 
     } 
} 

我有一個包含數據propName和相關propValue一個MS SQL表。 我需要使用DataAnnotations進行驗證。每個_propName需要有不同的驗證。

我的問題是:如何向上面提到的類結構添加不同的驗證/數據註釋?我想知道是否有某種方式來指定數據註釋中的if-else條件?

 if "this propertyname" 
       validation 1 
     else if "that property name" 
       validation 1 

有人可以幫忙嗎?

+0

您可以隨時用自己的邏輯編寫自己的數據註釋屬性。 – ieaglle

+0

你能舉個例子嗎?因爲我嘗試過,並沒有奏效。 –

回答

0

您應該能夠像這樣:

public class MyValidationAttribute : ValidationAttribute 
{ 
    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     switch (validationContext.MemberName) 
     { 
      //some logic 
     } 
    } 
} 
0

問題是與ValidationAttribute你只會得到一個屬性的值,而不是屬性的組合,你可以做的是結合一個元組中的PropNamePropVal,然後驗證。

這個小測試應用程序顯示了一種實現你想要的方法。

public class MyClass { 
    [MyValidation] 
    public Tuple<string, string> PropValue { get; set; } 

    public List<ValidationResult> TestValidation() { 
     var validationContext = new ValidationContext(this, serviceProvider: null, items: null); 
     var results = new List<ValidationResult>(); 
     Validator.TryValidateObject(this, validationContext, results, validateAllProperties: true); 

     return results; 
    } 
} 

public class MyValidationAttribute : ValidationAttribute { 
    public override bool IsValid(object value) { 
     var propValue = value as Tuple<string, string>; 

     if (propValue.Item1 == "Item") { 
      var setPropValue = propValue.Item2; 

      //Do you validation 
     } 

     return true; 
    } 
} 


class Program { 
    static void Main(string[] args) { 
     MyClass instance = new MyClass(); 
     instance.PropValue = new Tuple<string, string>("Item", "Value"); 

     var result = instance.TestValidation(); 
    } 
}