使用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)系作者
  • 序言:七十年代末笼痹,一起剝皮案震驚了整個濱河市配喳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凳干,老刑警劉巖晴裹,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異救赐,居然都是意外死亡涧团,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門经磅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來泌绣,“玉大人,你說我怎么就攤上這事预厌“⒙酰” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵轧叽,是天一觀的道長苗沧。 經(jīng)常有香客問我,道長犹芹,這世上最難降的妖魔是什么崎页? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮腰埂,結(jié)果婚禮上飒焦,老公的妹妹穿的比我還像新娘。我一直安慰自己屿笼,他們只是感情好牺荠,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著驴一,像睡著了一般休雌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肝断,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天杈曲,我揣著相機與錄音驰凛,去河邊找鬼。 笑死担扑,一個胖子當著我的面吹牛恰响,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播涌献,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼胚宦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了燕垃?” 一聲冷哼從身側(cè)響起枢劝,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎卜壕,沒想到半個月后您旁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡印叁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年被冒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轮蜕。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡昨悼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出跃洛,到底是詐尸還是另有隱情率触,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布汇竭,位于F島的核電站葱蝗,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏细燎。R本人自食惡果不足惜两曼,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望玻驻。 院中可真熱鬧悼凑,春花似錦、人聲如沸璧瞬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嗤锉。三九已至渔欢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瘟忱,已是汗流浹背奥额。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工苫幢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人披坏。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓态坦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親棒拂。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容

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