最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

ASP.NET?Core?MVC中Required與BindRequired用法與區(qū)別介紹

 更新時(shí)間:2022年02月22日 15:36:10   作者:Sweet-Tang  
這篇文章介紹了ASP.NET?Core?MVC中Required與BindRequired用法與區(qū)別,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

在開發(fā)ASP.NET Core MVC應(yīng)用程序時(shí),需要對(duì)控制器中的模型校驗(yàn)數(shù)據(jù)有效性,元數(shù)據(jù)注釋(Data Annotations)是一個(gè)完美的解決方案。

元數(shù)據(jù)注釋最典型例子是確保API的調(diào)用者提供了某個(gè)屬性的值,在傳統(tǒng)的ASP.NET MVC中使用的是RequiredAttribute特性類。該屬性仍然可以在ASP.NET Core MVC中使用,但也提供了一個(gè)新的特性類BindRequiredAttribute。

今天讓我們來看看它們之間的細(xì)微差別。

RequiredAttribute的典型用法

想象一下,您的模型是下面的BookOrder類。為了強(qiáng)制AuthorTitle屬性的值始終出現(xiàn)在傳入的請(qǐng)求中,并且值不能為空,我們使用RequiredAttribute修飾它們。

    public class BookOrder
    {
        [Required]
        public string Author { get; set; }
     
        [Required]
        public string Title { get; set; }
    }

這在傳統(tǒng)的ASP.NET MVC中是很常見方法。有了這個(gè),您可以驗(yàn)證ModelState是否存在錯(cuò)誤,因?yàn)閷?duì)這些屬性的驗(yàn)證失敗會(huì)反映在這里。示例:

    [Route("bookorder")]
    public IActionResult PostBook([FromForm]BookOrder bookOrder)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }
     
        // 正常邏輯代碼
        return Content("OK");
    }

如果傳入的請(qǐng)求中缺少兩個(gè)必需的屬性(或者屬性的值為String.Empty),則響應(yīng)將是一個(gè)400狀態(tài)碼,并將模型狀態(tài)錯(cuò)誤序列化到響應(yīng)中。

使用Postman進(jìn)行測(cè)試,請(qǐng)求中只提供了Title屬性的值,而未提供Author屬性的值:

常有趣的問題,例如當(dāng)我們添加類似數(shù)量的屬性時(shí)(類型為int)。在這種情況下,RequiredAttribute將無法正常工作,因?yàn)槟J(rèn)值為0,并且該屬性不可能為空。即使客戶端在不包括屬性值的情況下提交請(qǐng)求,模型實(shí)例的值都將為0。換句話說,RequiredAttribute不起作用。在我們的例子中,我們使用的是int,但是同樣適用于所有值的類型,例如DateTimeGuid。

以前,在傳統(tǒng)的ASP.NET MVC中,解決這個(gè)問題的方法是使用一個(gè)可為空類型,如下所示:

    public class BookOrder
    {
        [Required]
        public string Author { get; set; }
     
        [Required]
        public string Title { get; set; }
     
        [Required]
        public int? Quantity { get; set; }
    }

雖然它解決了這個(gè)問題,但是這不是最優(yōu)雅的方式。Quantity屬性不能為null,如果API的調(diào)用者未提供該屬性的值,則該值保持為null,配合RequiredAttribute特性可以達(dá)到我們的目的。

這種方法的缺點(diǎn)是,在正常邏輯代碼中,您需要直接訪問可為空的Value屬性。

    [Route("bookorder")]
    public IActionResult PostBook([FromForm]BookOrder bookOrder)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }
     
        // 正常邏輯代碼
        var requestedQuantity = bookOrder.Quantity.Value;
        
        return Content("OK");
    }

如果通過靜態(tài)分析工具來檢查代碼,因?yàn)樗鼈冋也徊坏娇罩禉z測(cè),所以會(huì)警告您可能出現(xiàn)空引用異常(即使在邏輯上,ModelState檢測(cè)是足夠的)。所以這并不是令人賞心悅目的方案。

如果在VS中安裝了Resharper工具,會(huì)顯示如下警告:

這就是BindRequiredAttribute產(chǎn)生的原因。它和RequiredAttribute的工作方式類似,它要求請(qǐng)求必須提示屬性的值 。

我們將模型改為如下結(jié)構(gòu),Quantity屬性為int類型,并使用[BindRequired]修飾:

    public class BookOrder
    {
        [Required]
        public string Author { get; set; }
     
        [Required]
        public string Title { get; set; }
     
        [BindRequired]
        public int Quantity { get; set; }
    }

使用Postman進(jìn)行測(cè)試,在請(qǐng)求體不包括Quantity屬性的值:

測(cè)試結(jié)果為ModelState.IsValid返回的false,要求提供Quantity屬性的值。

RequiredAttribute與BindRequiredAttribute的差別

BindRequiredAttribute特性類只要求API的調(diào)用者提供該屬性的值,但不進(jìn)行空值檢測(cè),允許提供的值為空,例如我們將模型改為如下示例,所有屬性中都使用了BindRequiredAttribute特性類進(jìn)行注釋:

    public class BookOrder
    {
        [BindRequired]
        public string Author { get; set; }
     
        [BindRequired]
        public string Title { get; set; }
     
        [BindRequired]
        public int Quantity { get; set; }
    }

使用Postman進(jìn)行測(cè)試,在請(qǐng)求體包括這三個(gè)屬性名稱的參數(shù),但是屬性的值均為空或默認(rèn)值:

測(cè)試結(jié)果為正常,BindRequiredAttribute特性類只要求API的調(diào)用者提供該屬性的值,但不進(jìn)行空值檢測(cè),允許提供的值為空。

RequiredAttribute 與 BindRequiredAttribute 混用問題

當(dāng)然,在代碼中混合使用[Required][BindRequired]并不是一個(gè)最令人滿意的效果。值得慶幸的是,ASP.NET Core MVC為您提供了足夠的靈活性來改變RequiredAttribute的行為,強(qiáng)制它包含BindRequiredAttribute的行為。

您可以通過實(shí)現(xiàn)自己的IBindingMetadataProvider并在您的應(yīng)用程序全局范圍內(nèi)注冊(cè)來實(shí)現(xiàn)這一目標(biāo)。

    public class RequiredBindingMetadataProvider : IBindingMetadataProvider
    {
        public void CreateBindingMetadata(BindingMetadataProviderContext context)
        {
            if (context.PropertyAttributes?.OfType<RequiredAttribute>().Any() ?? false) {
                context.BindingMetadata.IsBindingRequired = true;
            }
        }
    }

在全局范圍內(nèi)注冊(cè)它:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc(o =>
        {
            o.ModelMetadataDetailsProviders.Add(new RequiredBindingMetadataProvider());
        });
    }

相關(guān)補(bǔ)充內(nèi)容

1、ASP.NET Core MVC還提供了BindNeverAttribute特性類用于指定該屬性不進(jìn)行模型綁定。例如:您擁有一個(gè)像IsAdmin這樣的屬性,這需要通過服務(wù)端來指定,而不是通過客戶提交的數(shù)據(jù)來指定;

2、如果客戶端提交的是Json格式的數(shù)據(jù),BindRequiredAttributeBindNeverAttribute特性類就不會(huì)起任何作用,這是因?yàn)槟P椭苯油ㄟ^Json.Net反序列化來創(chuàng)建,MVC框架并不知道屬性的值從何而來。

上面補(bǔ)充的兩點(diǎn),感興趣的同學(xué)可以自己進(jìn)行測(cè)試。

總結(jié)

  • RequiredAttribute特性類的行為在傳統(tǒng)的ASP.NET MVC與ASP.NET Core MVC是一致的,校驗(yàn)屬性的值不能為null;
  • RequiredAttribute特性類對(duì)于值類型的屬性,就沒有任何效果了,所以在編碼的過程將屬性的類型改為可為空類型,不過編碼的過程就比較糾結(jié)了,需要訪問可為空類型的Value屬性,而且靜態(tài)代碼檢測(cè)工具會(huì)警告需要進(jìn)行非空的校驗(yàn);
  • BindRequiredAttribute特性類可以解決值類型默認(rèn)值的問題,強(qiáng)制要求客戶端提交請(qǐng)求時(shí),必須包含屬性的值,不過屬性的值可以為空,不進(jìn)行非空的校驗(yàn);
  • RequiredAttributeBindRequiredAttribute混合使用的情況下,我們也提供了優(yōu)雅的方法,讓RequiredAttribute包含BindRequiredAttribute的行為。

到此這篇關(guān)于ASP.NET Core MVC中Required與BindRequired用法與區(qū)別的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • .Net行為型設(shè)計(jì)模式之備忘錄模式(Memento)

    .Net行為型設(shè)計(jì)模式之備忘錄模式(Memento)

    這篇文章介紹了.Net行為型設(shè)計(jì)模式之備忘錄模式(Memento),文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • Entity Framework Core工具使用命令行

    Entity Framework Core工具使用命令行

    這篇文章介紹了Entity Framework Core工具使用命令行,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01
  • ASP.NET Core應(yīng)用程序配置文件AppSetting.json

    ASP.NET Core應(yīng)用程序配置文件AppSetting.json

    這篇文章介紹了ASP.NET Core應(yīng)用程序配置文件AppSetting.json,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02
  • 那些年,我還在學(xué)asp.net(一) 學(xué)習(xí)筆記

    那些年,我還在學(xué)asp.net(一) 學(xué)習(xí)筆記

    那些年到此,基本學(xué)習(xí)了前端的基本知識(shí),那些年的第四課就是asp.net,當(dāng)然那時(shí)看了很多教程,比如說:天轟穿,當(dāng)然天轟穿說得比較多,如面向?qū)ο螅珻#知識(shí),由于當(dāng)時(shí)上過C++,所以就沒有看這些,直接從asp.net開始,主要是學(xué)習(xí)一下asp.net用到的一些基本控件
    2012-03-03
  • asp.net WebForm頁面間傳值方法

    asp.net WebForm頁面間傳值方法

    asp.net WebForm頁面間傳值方法...
    2006-07-07
  • ASP.NET中 TextBox 文本輸入框控件的使用方法

    ASP.NET中 TextBox 文本輸入框控件的使用方法

    TextBox 控件為用戶提供了一種向 ASP.NET 網(wǎng)頁中鍵入信息(包括文本、數(shù)字和日期)的方法。
    2016-04-04
  • asp.net Timer的使用方法

    asp.net Timer的使用方法

    使用方法很簡(jiǎn)單,對(duì)于需要使用asp.net下timer控件的使用是個(gè)不錯(cuò)的例子
    2008-10-10
  • 利用C#遠(yuǎn)程存取Access數(shù)據(jù)庫(kù)

    利用C#遠(yuǎn)程存取Access數(shù)據(jù)庫(kù)

    目前,基于數(shù)據(jù)庫(kù)服務(wù)器的桌面管理程序和Web程序已經(jīng)有太多的應(yīng)用了,尤其是網(wǎng)絡(luò)的大量普及,孤立地?cái)?shù)據(jù)庫(kù)管理系統(tǒng)無法勝任分布式管理應(yīng)用,但是面對(duì)基于Access數(shù)據(jù)庫(kù)的現(xiàn)有的桌面應(yīng)用我們也無法完全的摒棄。我們利用.Net 遠(yuǎn)程處理功能將連接和存取Access的行為封裝為一個(gè)遠(yuǎn)程對(duì)象,供網(wǎng)絡(luò)中其它客戶端通過調(diào)用該遠(yuǎn)程對(duì)象來存取實(shí)際的Access數(shù)據(jù)庫(kù)。我們以 C# 2005 為開發(fā)語言來實(shí)現(xiàn)上述功能。
    2008-04-04
  • Linux下使用Jenkins自動(dòng)化構(gòu)建.NET?Core應(yīng)用

    Linux下使用Jenkins自動(dòng)化構(gòu)建.NET?Core應(yīng)用

    這篇文章介紹了Linux下使用Jenkins自動(dòng)化構(gòu)建.NET?Core應(yīng)用的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • asp.net中MVC的處理流程詳解

    asp.net中MVC的處理流程詳解

    本文詳細(xì)講解了asp.net MVC的處理流程,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07

最新評(píng)論

铜梁县| 滦南县| 文安县| 建德市| 毕节市| 青铜峡市| 二连浩特市| 农安县| 呼伦贝尔市| 治县。| 敦化市| 宜春市| 上蔡县| 遂川县| 葫芦岛市| 凉山| 宣威市| 淄博市| 望城县| 上虞市| 天津市| 舒城县| 双鸭山市| 敦煌市| 罗源县| 云阳县| 迭部县| 广昌县| 白朗县| 牙克石市| 周口市| 平定县| 池州市| 鹤壁市| 仁寿县| 丽江市| 八宿县| 伊宁县| 永宁县| 司法| 玉田县|