2010-07-05 41 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); 
    }