- 什么是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; } }
asp.net mvc 中data annotation的使用:
asp.net mvc中對data annotation具有原生的支持,
默認情況下,ASP.NET MVC框架在模型綁定時執行驗證邏輯。
模型邦定器一旦完成對模型屬性的更新,就會利用當前的模型元數據獲得模型的所有驗證器。這運行時提供了一個驗證其 (DataAnnotationModelValidator)來與注解一同工作。這個模型驗證器會找到所有的驗證特性並執行它們包含的驗證邏輯。 ModelBinder捕獲所有失敗的驗證其規則並把它們放入ModelState中。
模型綁定的主要產物就是ModelState(Controller的屬性)。
這個對象不僅包含了用戶所有想放入模型屬性里的值,也包括與每一個屬性相關聯的所有錯誤,和模型本身的錯誤,如果存在錯誤ModelState.IsValid返回false。
ModelState("LastName").Errors[0].ErrorMessage;//查看LastName屬性的錯誤信息
View中查看:@Html.ValadationMessageFor(m=>m.LastName)
在編輯操作的PostAction中,可以先使用ModelState.IsValid屬性判斷是否通過驗證,再不同對待。
參考文檔:
http://www.asp.net/mvc/overview/older-versions-1/models-data/validation-with-the-data-annotation-validators-cs
http://www.cnblogs.com/xinchuang/archive/2013/06/06/3120482.html
http://www.cnblogs.com/kevin-kingdom/archive/2012/12/07/2807138.html
http://www.cnblogs.com/hjf1223/archive/2010/11/07/independent-dataannotation-validation.html
