<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一文看懂C# 數(shù)據(jù)標(biāo)注與數(shù)據(jù)校驗(yàn)

          共 3075字,需瀏覽 7分鐘

           ·

          2020-11-02 02:42

          數(shù)據(jù)標(biāo)注(Data Annotation)是類或類成員添加上下文信息的一種方式,在 C# 通常用特性(Attribute)類來(lái)描述。它的用途主要可以分為下面這三類:

          • 驗(yàn)證 Validation:向數(shù)據(jù)添加驗(yàn)證規(guī)則
          • 展現(xiàn) Display:指定數(shù)據(jù)如何呈現(xiàn)給用戶
          • 模型 Modelling:添加關(guān)于用法和與其它類的關(guān)系信息

          下面是一個(gè)用來(lái)驗(yàn)證和展現(xiàn)用戶信息的一個(gè) Model:

          class?Kid
          {
          ??[Range(0,?18)]?//?年齡不能超過18歲,不能為負(fù)數(shù)
          ??public?int?Age?{?get;?set;?}

          ??[StringLength(MaximumLength?=?50,?MinimumLength?=?3)]?//?名稱的長(zhǎng)度不能超過?50,不能小于?3
          ??public?string?Name?{?get;?set;?}

          ??[DataType(DataType.Date)]?//?生日將作為日期展示?(不帶時(shí)間)
          ??public?DateTime?Birthday?{?get;?set;?}
          }

          數(shù)據(jù)標(biāo)注的展現(xiàn)的用途主要在早期的 ASP.NET 和 ASP.NET MVC 等框架中使用。例如,在 ASP.NET MVC 中,Razor 引擎會(huì)根據(jù) Model 屬性的 DataType 特性動(dòng)態(tài)生成不同類型的表單元素。不過,現(xiàn)在這類用途除了 WPF(比如 EditableAttribute)已經(jīng)過時(shí)很少用了。

          數(shù)據(jù)標(biāo)注用來(lái)驗(yàn)證數(shù)據(jù)的合法性是最常見的用法,在 ASP.NET Core/Mvc 中,數(shù)據(jù)作為表單 Model 提交時(shí),框架會(huì)對(duì) Model 數(shù)據(jù)自動(dòng)進(jìn)行校驗(yàn),也可以手動(dòng)調(diào)用 ModelState.IsValid() 來(lái)判斷數(shù)據(jù)是否合法。

          自定義校驗(yàn)特性

          自定義一個(gè)校驗(yàn)特性很簡(jiǎn)單,創(chuàng)建一個(gè)繼承 ValidationAttribute 的類,然后重寫它的 IsValid 方法。示例:

          [AttributeUsage(AttributeTargets.Property,?AllowMultiple?=?false,?Inherited?=?false)]
          public?class?EvenNumberAttribute?:?ValidationAttribute
          {
          ????public?override?bool?IsValid(object?input)
          ????{
          ????????if?(input?==?null)
          ????????????return?false;

          ????????if?(!int.TryParse(input.ToString(),?out?int?val))
          ????????????return?false;

          ????????return?val?%?2?==?0;
          ????}
          }

          然后這個(gè)特性可以這么用:

          public?class?Model
          {
          ????[EvenNumberAttribute(ErrorMessage?=?"數(shù)字必須是偶數(shù)")]
          ????public?int?MyNumber?{?get;?set;?}
          }

          除了這自定義校驗(yàn)的方式,C# 還提供了一個(gè) CustomValidation 特性,也是用來(lái)自定義數(shù)據(jù)校驗(yàn)的,它是通過反射的方式來(lái)實(shí)現(xiàn)的。示例:

          public?class?Model
          {
          ????[CustomValidation(typeof(MyCustomValidation),?"IsNotEvenNumber")]
          ????public?int?MyNumber?{?get;?set;?}
          }

          public?static?class?MyCustomValidation
          {
          ????public?static?ValidationResult?IsNotEvenNumber(object?input)
          ????{
          ????????var?result?=?new?ValidationResult("數(shù)字必須是偶數(shù)");
          ????????if?(input?==?null?||?!int.TryParse(input.ToString(),?out?int?val))
          ????????????return?result;
          ????????return?val?%?2?==?0???ValidationResult.Success?:?result;
          ????}
          }

          C# 內(nèi)置了很多常用數(shù)據(jù)校驗(yàn)特性類,比如最常用的 RequiredAttributeStringLengthAttributeRangeAttribute 等。

          手動(dòng)執(zhí)行數(shù)據(jù)校驗(yàn)

          大多數(shù)時(shí)候,數(shù)據(jù)校驗(yàn)都是由框架(如 ASP.NET Core)幫我們做了,但有時(shí)候我們想手動(dòng)執(zhí)行校驗(yàn)數(shù)據(jù)怎么做呢?簡(jiǎn)單說(shuō),使用 Validator 類即可,但也不是想像的那么直接。數(shù)據(jù)校驗(yàn)需要提供檢驗(yàn)的信息,比如校驗(yàn)規(guī)則、需要校驗(yàn)的屬性及未通過顯示的錯(cuò)誤信息等,而這些需要由另一個(gè)類來(lái)從待校驗(yàn)的實(shí)例中提取作為上下文,它是 ValidationContext,所以需要先創(chuàng)建 ValidationContext 對(duì)象:

          ValidationContext?vc?=?new?ValidationContext(objectToValidate);

          創(chuàng)建好這個(gè)上下文對(duì)象就可以對(duì)數(shù)據(jù)進(jìn)行多種方式的校驗(yàn)了,比如校驗(yàn)對(duì)象的所有屬性:

          ValidationContext?vc?=?new?ValidationContext(objectToValidate);
          ICollection?results?=?new?List();
          bool?isValid?=?Validator.TryValidateObject(objectToValidate,?vc,?results,?true);

          也可以只校驗(yàn)對(duì)象的指定屬性:

          ValidationContext?vc?=?new?ValidationContext(objectToValidate);
          ICollection?results?=?new?List();
          bool?isValid?=?Validator.TryValidatePropery(objectToValidate.PropertyToValidate,?vc,?results,?true);

          返回值 isValid 表示是否所有數(shù)據(jù)都驗(yàn)證通過,驗(yàn)證失敗的信息會(huì)放到 results 結(jié)果集。

          看到這,我覺得手動(dòng)執(zhí)行校驗(yàn)還是有點(diǎn)麻煩,創(chuàng)建 ValidationContext 對(duì)象這一步如果也封裝在 Validator 類的方法內(nèi),豈不是簡(jiǎn)潔一些?







          回復(fù)?【關(guān)閉】學(xué)關(guān)
          回復(fù)?【實(shí)戰(zhàn)】獲取20套實(shí)戰(zhàn)源碼
          回復(fù)?【被刪】學(xué)個(gè)
          回復(fù)?【訪客】學(xué)
          回復(fù)?【小程序】學(xué)獲取15套【入門+實(shí)戰(zhàn)+賺錢】小程序源碼
          回復(fù)?【python】學(xué)微獲取全套0基礎(chǔ)Python知識(shí)手冊(cè)
          回復(fù)?【2019】獲取2019 .NET 開發(fā)者峰會(huì)資料PPT
          回復(fù)?【加群】加入dotnet微信交流群


          終于GitHub App 已支持簡(jiǎn)體中文!


          良心推薦:.NET Core快速開發(fā)利器WTM!


          瀏覽 44
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产亚洲欧美精品久久久www | 女人一级A片色黄情免费 | 日韩色导航| 国产肏屄网站 | 日逼五月天 |