c#模型驗證數據和設置默認值( 特性驗證)


封裝驗證特性

public abstract class ValidationAttribute : Attribute
    {
        public ValidationAttribute()
        {
            ErrorMessage = "";
            Name = "";
        }

        /// <summary>
        /// 錯誤消息
        /// </summary>
        public string ErrorMessage { get; set; }
        /// <summary>
        /// 字段名稱
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 驗證過程
        /// </summary>
        /// <param name="o"></param>
        /// <returns></returns>
        public virtual bool Verify(object o)
        {
            return false;
        }

        /// <summary>
        /// 默認值
        /// </summary>
        public object DefaultValue { get; set; }
    }

錯誤信息實體

public class ValidResult
    {

        public ValidResult()
        {
            ValidResultDetails = new List<ValidResultDetail>();

        }

        public bool IsValid
        {
            get
            {

                return ValidResultDetails.Count() == 0;
            }
        }
        public virtual string ErrorMessage
        {
            get
            {
                string r = null;

                if (ValidResultDetails.Count() > 0)
                {

                    r = ValidResultDetails.FirstOrDefault().ErrorMessage;
                }

                return r;
            }
            set
            {
                value = ErrorMessage;


            }
        }  //錯誤摘要
        public List<ValidResultDetail> ValidResultDetails { get; set; }
    }
    public class ValidResultDetail
    {
        public string Name { get; set; }
        public bool IsValid
        {
            get; set;
        }
        public virtual string ErrorMessage { get; set; }
    }

驗證類

public class EntifyValidator
    {
        /// <summary>
        /// 驗證完所有字段
        /// </summary>
        public static ValidResult Validate(object data, params string[] ignore)
        {
            return new EntifyValidator().Verify(false, data, ignore);
        }

        /// <summary>
        ///  當有未通過的驗證時,直接返回,停止驗證
        /// </summary>
        public static ValidResult ValidateQuickly(object data, params string[] ignore)
        {
            return new EntifyValidator().Verify(true, data, ignore);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="quickly">驗證完所有字段Or驗證到未通過的立即返回</param>
        /// <param name="data">需要驗證的數據</param>
        /// <param name="ignore">忽略的字段</param>
        /// <returns></returns>
        public virtual ValidResult Verify(bool quickly, object data, params string[] ignore)
        {
            ValidResult result = new ValidResult();
            List<PropertyInfo> props = data.GetType().GetProperties().Where(a => !ignore.Contains(a.Name.ToLower())).ToList();
            foreach (var item in props)
            {
                var validateattrs = item.GetCustomAttributes(typeof(ValidationAttribute), true);
                var input = item.GetValue(data, null);
                foreach (var itemattr in validateattrs)
                {
                    var attr = ((ValidationAttribute)itemattr);
                    if (attr != null)
                    {
                        attr.Name = item.Name;
                        SetDefaultValue(data, item, attr);
                        var isvalid = attr.Verify(input);
                        if (string.IsNullOrEmpty(attr.ErrorMessage)) continue;
                        if (!isvalid)
                        {
                            ValidResultDetail validResultDetail = new ValidResultDetail();
                            validResultDetail.Name = item.Name;
                            validResultDetail.ErrorMessage = string.Format(attr.ErrorMessage, item.Name);
                            validResultDetail.IsValid = false;
                            result.ValidResultDetails.Add(validResultDetail);
                            if (quickly)
                            {
                                return result;
                            }
                        }
                    }
                }
            }
            return result;
        }
        /// <summary>
        /// 設置默認值
        /// </summary>
        private void SetDefaultValue(object data, PropertyInfo item, ValidationAttribute attr)
        {
            var input = item.GetValue(data, null);
            if (attr.DefaultValue != null && input == null)//設置默認值
            {
                item.SetValue(data, attr.DefaultValue, null);
            }
            else if (attr.DefaultValue != null && input.GetType().Name == "DateTime")
            {
                if (Convert.ToDateTime(input) == DateTime.MinValue)
                {
                    item.SetValue(data, Convert.ToDateTime(attr.DefaultValue), null);
                }
            }
        }
    }

封裝的簡單驗證特性

public class InEnumAttribute : ValidationAttribute
    {
        public InEnumAttribute()
        {
            ErrorMessage = "{0}應該在區間內";
        }

        public Type RangeType { get; set; }

        public override bool Verify(object o)
        {
            if (o == null)
            {
                return false;
            }
            var r = false;
            foreach (var item in Enum.GetValues(RangeType))
            {
                if (((int)item) == Convert.ToInt32(o))
                {
                    r = true;
                    break;
                }
            }
            return r;
        }
    }
public class NotNullAttribute : ValidationAttribute
    {
        public bool? NotNull { get; set; } = true;
        public NotNullAttribute()
        {
            ErrorMessage = "{0}必填";
        }
        public override bool Verify(object o)
        {
            if (o == null)
            {
                return false;
            }
            else if (string.IsNullOrWhiteSpace(o.ToString()))
            {
                return false;
            }
            return true;
        }
    }

    /// <summary>
    /// 默認值
    /// </summary>
    public class DValueAttribute : ValidationAttribute
    {
        public DValueAttribute()
        {

        }
    }

使用方式在要驗證的實體類型加特性

  /// <summary>
        /// 轉單
        /// </summary>    
        [NotNull(ErrorMessage = "轉單必填")]
        public string cserviceno { get; set; }
 /// <summary>
        /// 修改時間
        /// </summary>        
        [DValue(DefaultValue = "1900-01-01 00:00:00")]
        public DateTime dlastmod { get; set; }
/// <summary>
        /// 包裹類型
        /// </summary>        
        [InEnum(ErrorMessage = "包裹類型錯誤", RangeType = typeof(Nitemtype))]
        public Nitemtype nitemtype { get; set; }

調用

 var r = EntifyValidator.Validate(rec);
                if (!r.IsValid)
                {
                   r.ValidResultDetails.Select(item => item.ErrorMessage);
                }

 


免責聲明!

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



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