我是新的属性。我只是在我的控制台应用程序上尝试它。如何验证此属性(annonation)?
那么我如何验证我的人实例下面的例子?
class Person
{
[StringLength(8,ErrorMessage="Please less then 8 character")]
public string Name { get; set; }
}
我是新的属性。我只是在我的控制台应用程序上尝试它。如何验证此属性(annonation)?
那么我如何验证我的人实例下面的例子?
class Person
{
[StringLength(8,ErrorMessage="Please less then 8 character")]
public string Name { get; set; }
}
这里是没有反射的简单代码示例。
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;
}
}
我没有检查过你的代码,但我想你的解决方案更好,因为你已经使用了原生的DataAnnonations类。我也在尝试,但没有足够的经验来弄清楚。 – Freshblood 2010-07-05 22:16:07
我在一些小型项目中使用了这种方法。由于必须执行AssociatedMetadataTypeTypeDescriptionProvider的手动注册,因此唯一的问题是您要使用MetadataType属性。 – 2010-07-05 22:27:11
完美的作品,这就是我一直在寻找。它甚至不检查属性。 – Freshblood 2010-07-05 22:28:10
Attribute可以处理的唯一函数是描述,为成员提供一些描述性数据。它们纯粹是被动的,不能包含任何逻辑。 (有一些AOP框架可以使属性生效)。所以如果你想要逻辑,你必须创建另一个类,它将使用MemberInfo.GetCustomAttributes
来读取属性,并进行验证并返回结果。
下面的代码演示如何确定验证仅性质,并给出方法,类等
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);
}
我熟悉ASP.NET MVC中的DataAnnotations和验证,但我不确定它是如何在控制台应用程序中一起出现的。我对这个答案也很感兴趣。 – 2010-07-05 21:15:53
我不相信这些属性在MVC之外有任何影响/“动态数据控件”(?) - 请参阅http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.aspx – 2010-07-05 21:18:59
我在MVC应用程序中使用它们,但它不适用于MVC。所以我想了解attritubes。如果你对答案感兴趣,所以你可以投票问题,并选择你最喜欢的问题获得更多的好回答:) – Freshblood 2010-07-05 21:20:07