[转]DbFirst数据验证
转自:Data Validate 之 Data Annotation
- 什么是Data Annotation ?
- 如何使用 ?
- 自定义Validate Attribute
- EF Db first中使用Data Annotation
- asp.net MVC中使用Data Annotation
什么是Data Annotation ?
貌似没听过,但肯定见过
所属程序集:System.ComponentModel.DataAnnotations
DataAnnotation code:
public class Product { [Required] [StringLength(10,MinimumLength =5)] public string Name { get; set; } [Required] public decimal? UnitPrice { get; set; } }
没错,就是给类的属性加上描述性的验证信息,
如何使用这些信息 为我们自己所用呢?
当然是先自己想办法了,
添加辅助类:
public class ModelValidationError { public string FieldName { get; set; } public string Message { get; set; } } public static class DataAnnotationHelper { public static IEnumerable<ModelValidationError> IsValid<T>(this T o) { var descriptor = GetTypeDescriptor(typeof(T)); foreach (PropertyDescriptor propertyDescriptor in descriptor.GetProperties()) { var validations = propertyDescriptor.Attributes.OfType<ValidationAttribute>(); foreach (var validationAttribute in validations) { var v = propertyDescriptor.GetValue(o); if (!validationAttribute.IsValid(v)) { yield return new ModelValidationError() { FieldName = propertyDescriptor.Name, Message = validationAttribute.FormatErrorMessage(propertyDescriptor.Name) }; } } } } private static ICustomTypeDescriptor GetTypeDescriptor(Type type) { return new AssociatedMetadataTypeTypeDescriptionProvider(type).GetTypeDescriptor(type); } }
如何使用:
class Program { static void Main(string[] args) { Product product = new Product(); foreach (var item in product.IsValid()) { Console.WriteLine("FieldName:{0} Error Message:{1}", item.FieldName, item.Message); } Console.ReadKey(); } }
自定义ValidateAttribute
.net 提供的 ValidateAttribute不够用怎么搞?自定义呗,
public class PriceAttribute : ValidationAttribute { public double MinPrice { get; set; } public override bool IsValid(object value) { if (value == null) { return false; } var price = (double)value; if (price < MinPrice) { return false; } return true; } public override string FormatErrorMessage(string name) { return "Min Price is "+MinPrice; } }
使用方法和.net 提供的一样:
public class Product { [Required] [StringLength(10,MinimumLength =5)] public string Name { get; set; } [Required] [Price(MinPrice =2)] public decimal? UnitPrice { get; set; } }
EF Db first中使用Data Annotation
实际应用中遇到的问题:
在使用EF DBfirst的时候,实体类的validate attribute,一不小心经常会被覆盖掉,如何解决
巧妙使用partial 类
public class ProductMetaData { [Required] [StringLength(10, MinimumLength = 5)] public string Name { get; set; } [Required] [Price(MinPrice = 2)] public decimal? UnitPrice { get; set; } } [MetadataType(typeof(ProductMetaData))] public partial class Product { } public partial class Product { public string Name { get; set; } public decimal? UnitPrice { get; set; } }
这样做在大多数情况下是没有问题的。但是仅仅是这样,还不能解决所有问题。一般情况下Business Model和MetadataType是不在同一个Assembly里面,这时候你就无法以partial类的形式来扩展Business Model。所以我们就需要有一套机制来延迟注册Business Model与MetadataType的映射关系。通过MVC源码的分析,我们可以通过扩展DataAnnotationsModelMetadataProvider的GetTypeDescriptor方法来解决这个问题(http://www.cnblogs.com/hjf1223/archive/2010/07/27/independency_metadatatype.html)。
asp.net mvc 中data annotation的使用:
asp.net mvc中对data annotation具有原生的支持,
作者:xuejianxiyang
出处:http://xuejianxiyang.cnblogs.com
关于作者:Heaven helps those who help themselves.
本文版权归原作者和博客园共有,欢迎转载,但未经原作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。