Data Validate 之 Data Annotation


  1. 什么是Data Annotation ?
  2. 如何使用 ?
  3. 自定義Validate Attribute
  4. EF  Db first中使用Data Annotation
  5. 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
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM