使用System.ComponentModel.DataAnnotations驗證字段數(shù)據(jù)正確性

在.NET MVC 中,當頁面提交model到Action的時候,自動填充ModelState。使用ModelState.IsValid進行方便快捷的數(shù)據(jù)驗證,其驗證也是調(diào)用命名空間System.ComponentModel.DataAnnotations中的各種方法進行驗證。但是使用非MVC架構(gòu)時,就需要寫很多if判斷或者正則表達式,當有多個字段需要驗證的的時候不知道有多少人和我一樣很厭煩這種用if判斷的方式。這里記錄一個方法,使用System.ComponentModel.DataAnnotations來實現(xiàn)自己的驗證model拋出相應(yīng)的錯誤信息。
C#文檔地址:System.ComponentModel.DataAnnotations

這里我們先實現(xiàn)一個Person類,里面包含幾個簡單的屬性,然后指定幾個Attribute

        public class Person
    {
        [Required(ErrorMessage = "{0} 必須填寫")]
        [DisplayName("姓名")]
        public string Name { get; set; }

        [Required(ErrorMessage = "{0} 必須填寫")]
        [RegularExpression(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}",ErrorMessage = "郵件格式不正確")]
        public string Email { get; set; }

        [Required(ErrorMessage = "{0} 必須填寫")]
        [Range(1, 100,ErrorMessage = "超出范圍")]
        public int Age { get; set; }

        [Required(ErrorMessage = "{0} 必須填寫")]
        [StringLength(11, MinimumLength=11, ErrorMessage = "{0}輸入長度不正確")]
        public string Phone { get; set; }

        [Required(ErrorMessage = "{0} 必須填寫")]
        [Range(typeof(decimal),"1000.00","2000.99")]
        public decimal Salary { get; set; }
    }

然后實現(xiàn)一個ValidatetionHelper靜態(tài)類,這里主要用到的是Validator.TryValidateObject方法。

 public static ValidResult IsValid(object value)
        {
            ValidResult result= new ValidResult();
            try
            {
                var validationContext = new ValidationContext(value);
                var results = new List<ValidationResult>();
                var isValid = Validator.TryValidateObject(value, validationContext, results, true);

                if (!isValid)
                {
                    result.IsVaild = false;
                    result.ErrorMembers = new List<ErrorMember>();
                    foreach (var item in results)
                    {
                        result.ErrorMembers.Add(new ErrorMember()
                        {
                            ErrorMessage = item.ErrorMessage,
                            ErrorMemberName = item.MemberNames.FirstOrDefault()
                        });
                    }
                }
                else
                {
                    result.IsVaild = true;
                }
            }
            catch (Exception ex)
            {
                result.IsVaild = false;
                result.ErrorMembers = new List<ErrorMember>();
                result.ErrorMembers.Add(new ErrorMember()
                {
                    ErrorMessage =ex.Message,
                    ErrorMemberName = "Internal error"
                });
            }

            return result;
        }

其中需要的返回結(jié)果類

    public class ValidResult
    {
        public List<ErrorMember> ErrorMembers { get; set; }
        public bool IsVaild { get; set; }
    }

    public class ErrorMember
    {
        public string ErrorMessage { get; set; }
        public string ErrorMemberName { get; set; }
    }

實現(xiàn)一個測試代碼,這里看到對應(yīng)驗證數(shù)據(jù)比使用多個if簡潔很多,整個代碼也十分美觀。

        static void Main(string[] args)
        {
            Person person = new Person();
            person.Name = "";
            person.Email = "121 212 K";
            person.Phone = "2345";
            person.Salary = 3000;
            var result =ValidatetionHelper.IsValid(person);
            if (!result.IsVaild)
            {
                foreach (ErrorMember errorMember in result.ErrorMembers)
                {
                    Console.WriteLine(errorMember.ErrorMemberName+":"+errorMember.ErrorMessage);
                }
            }
            Console.Read();
        }

通過測試,可以看到得到正確的驗證結(jié)果。


測試結(jié)果

后續(xù)有時間,把DisplayName給顯示上去,那就更完美了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong閱讀 22,931評論 1 92
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • 今天終于下定決心打算做一個開始,其實做這個2017年結(jié)束倒計時是源于最近的靈感,但是這個想要日更以共同勉勵的想法卻...
    蒙娜麗傻閱讀 522評論 4 5
  • 可可讀大班了,該長見識了,計劃帶他回湖北農(nóng)村老家去看看。一直覺得讓孩子回歸大自然是孩子節(jié)假日最好的去處。...
    風中花絮兒閱讀 925評論 2 4

友情鏈接更多精彩內(nèi)容