2010-07-05 67 views
1

我是新的屬性。我只是在我的控制檯應用程序上嘗試它。如何驗證此屬性(annonation)?

那麼我如何驗證我的人實例下面的例子?

class Person 
    { 
     [StringLength(8,ErrorMessage="Please less then 8 character")] 
     public string Name { get; set; } 

    } 
+0

我熟悉ASP.NET MVC中的DataAnnotations和驗證,但我不確定它是如何在控制檯應用程序中一起出現的。我對這個答案也很感興趣。 – 2010-07-05 21:15:53

+0

我不相信這些屬性在MVC之外有任何影響/「動態數據控件」(?) - 請參閱http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.aspx – 2010-07-05 21:18:59

+1

我在MVC應用程序中使用它們,但它不適用於MVC。所以我想了解attritubes。如果你對答案感興趣,所以你可以投票問題,並選擇你最喜歡的問題獲得更多的好回答:) – Freshblood 2010-07-05 21:20:07

回答

3

這裏是沒有反射的簡單代碼示例。

class Program 
{ 
    static void Main(string[] args) 
    { 
     var invalidPerson = new Person { Name = "Very long name" }; 
     var validPerson = new Person { Name = "1" }; 

     var validator = new Validator<Person>(); 

     Console.WriteLine(validator.Validate(validPerson).Count); 
     Console.WriteLine(validator.Validate(invalidPerson).Count); 

     Console.ReadLine(); 
    } 
} 

public class Person 
{ 
    [StringLength(8, ErrorMessage = "Please less then 8 character")] 
    public string Name { get; set; } 
} 

public class Validator<T> 
{ 
    public IList<ValidationResult> Validate(T entity) 
    { 
     var validationResults = new List<ValidationResult>(); 
     var validationContext = new ValidationContext(entity, null, null); 
     Validator.TryValidateObject(entity, validationContext, validationResults, true); 
     return validationResults; 
    } 
} 
+0

我沒有檢查過你的代碼,但我想你的解決方案更好,因爲你已經使用了原生的DataAnnonations類。我也在嘗試,但沒有足夠的經驗來弄清楚。 – Freshblood 2010-07-05 22:16:07

+0

我在一些小型項目中使用了這種方法。由於必須執行AssociatedMetadataTypeTypeDescriptionProvider的手動註冊,因此唯一的問題是您要使用MetadataType屬性。 – 2010-07-05 22:27:11

+0

完美的作品,這就是我一直在尋找。它甚至不檢查屬性。 – Freshblood 2010-07-05 22:28:10

3

Attribute可以處理的唯一函數是描述,爲成員提供一些描述性數據。它們純粹是被動的,不能包含任何邏輯。 (有一些AOP框架可以使屬性生效)。所以如果你想要邏輯,你必須創建另一個類,它將使用MemberInfo.GetCustomAttributes來讀取屬性,並進行驗證並返回結果。

0

下面的代碼演示如何確定驗證僅性質,並給出方法,類等

public class DataValidator 
    { 
     public class ErrorInfo 
     { 
      public ErrorInfo(string property, string message) 
      { 
       this.Property = property; 
       this.Message = message; 
      } 

      public string Message; 
      public string Property; 
     } 

     public static IEnumerable<ErrorInfo> Validate(object instance) 
     { 
      return from prop in instance.GetType().GetProperties() 
        from attribute in prop.GetCustomAttributes(typeof(ValidationAttribute), true).OfType<ValidationAttribute>() 
        where !attribute.IsValid(prop.GetValue(instance, null)) 
        select new ErrorInfo(prop.Name, attribute.FormatErrorMessage(string.Empty)); 
     } 
    } 

想法驗證將此代碼添加到項目中,我們可以用它之後:

var errors =DataValidator.Validate(person); 

    foreach (var item in errors) 
    { 
     Console.WriteLine(item.Property +" " + item.Message); 
    }