ASP.NET Core MVC 2.1 顶级参数验证
本文討論ASP.NET Core 2.1中與ASP.NET Core MVC / Web API控制器中的模型綁定相關(guān)的功能。雖說(shuō)這是一個(gè)功能,但從我的角度來(lái)看,它更像是一個(gè)錯(cuò)誤修復(fù)!
請(qǐng)注意,我使用的是 NET Core 2.1 Preview 1,正式版發(fā)布后,功能可能存在變動(dòng)。
ASP.NET Core 2.0 模型驗(yàn)證
模型驗(yàn)證是ASP.NET Core MVC 管線的重要組成部分。有很多方法可以注入到驗(yàn)證層(例如使用FluentValidation),最常見(jiàn)的方法可能是使用來(lái)自System.ComponentModel的驗(yàn)證標(biāo)記來(lái)修飾綁定模型。 例如:
public class UserModel ?{[Required, EmailAddress] ??public string Email { get; set; }[Required, StringLength(1000)] ?
public string Name { get; set; } }
如果您在控制器的操作方法中使用UserModel,MvcMiddleware則會(huì)自動(dòng)創(chuàng)建對(duì)象的新實(shí)例,綁定模型的屬性并使用如下三個(gè)來(lái)源對(duì)其進(jìn)行驗(yàn)證:
表單?- 當(dāng)使用POST將表單發(fā)送到服務(wù)器時(shí),發(fā)送到HTTP請(qǐng)求的主體中;
路由?- 在匹配路由后從URL段或默認(rèn)值中獲取;
查詢字符串?- 在URL的末尾傳遞。
請(qǐng)注意,目前,作為JSON發(fā)送的數(shù)據(jù)默認(rèn)情況下不會(huì)被綁定。如果您希望綁定請(qǐng)求體中的JSON數(shù)據(jù),則需要使用此處所述的[FromBody]標(biāo)記修飾模型。
在控制器Action方法中,可以簡(jiǎn)單地檢查ModelState屬性,確定提供的數(shù)據(jù)是否有效:
public class CheckoutController : Controller ?{ ? ?public IActionResult SaveUser(UserModel model) ? ?{ ? ?
? ?if(!ModelState.IsValid){ ? ? ? ? ? ?// Something wasn't valid on the modelreturn View(model);} ? ? ? ?// The model passed validation, do something with it} }
這是非常標(biāo)準(zhǔn)的MVC內(nèi)容,但是如果您不想創(chuàng)建整個(gè)綁定模型,但仍想驗(yàn)證傳入數(shù)據(jù),該怎么辦?
ASP.NET Core 2.0 頂級(jí)參數(shù)
DataAnnotation標(biāo)記默認(rèn)MVC驗(yàn)證系統(tǒng)使用的屬性不必應(yīng)用于類的屬性,它們也可以應(yīng)用于參數(shù)。這可能會(huì)導(dǎo)致您認(rèn)為您可以完全替換UserModel上面的示例中的以下內(nèi)容:
MVC默認(rèn)驗(yàn)證系統(tǒng)使用的DataAnnotation標(biāo)記不一定應(yīng)用于類的屬性,它們同樣可以應(yīng)用于參數(shù)。這可能會(huì)導(dǎo)致您認(rèn)為可以完全替換上面示例中的UserModel,如下所示:
public class CheckoutController : Controller ?{ ??public IActionResult SaveUser([Required, EmailAddress] string Email [Required, StringLength(1000)] string Name) ?
? ?{ ? ?
?? ?if(!ModelState.IsValid){ ? ? ? ? ? ?// Something wasn't valid on the modelreturn View(model);} ? ? ? ?// The model passed validation, do something with it} }
不幸的是,這是行不通的!在綁定屬性時(shí),驗(yàn)證屬性將被忽略,并且ModelState.IsValid始終是true!
ASP.NET Core 2.1中的頂級(jí)參數(shù)
幸運(yùn)的是,ASP.NET Core團(tuán)隊(duì)意識(shí)到了這個(gè)問(wèn)題,并且已經(jīng)將修補(bǔ)程序合并為ASP.NET Core 2.1的一部分。因此,上一節(jié)中的代碼的行為與您所期望的一樣,參數(shù)經(jīng)過(guò)驗(yàn)證,并相應(yīng)地進(jìn)行了ModelState.IsValid更新。
作為這項(xiàng)工作的一部分,您現(xiàn)在還可以使用[BindRequired]標(biāo)記修飾參數(shù)。當(dāng)綁定非空值類型時(shí),此標(biāo)記很重要,因?yàn)槭褂肹Required]標(biāo)記對(duì)這些屬性并不能提供預(yù)期的行為。
這意味著您現(xiàn)在可以執(zhí)行以下操作,并確保testId參數(shù)已從路由參數(shù)中正確綁定,并且qty參數(shù)已從查詢字符串中綁定。在ASP.NET Core 2.1之前,它甚至不能編譯!
[HttpGet("test/{testId}")]public IActionResult Get([BindRequired, FromRoute] Guid testId, [BindRequired, FromQuery] int qty) ?{ ? ?if(!ModelState.IsValid){ ? ? ? ?return BadRequest(ModelState);} ? ?// Valid and bound}
對(duì)于這個(gè)問(wèn)題可以查閱我之前的博客:《ASP.NET Core MVC中的 [Required]與[BindRequired]》。
總結(jié)
在ASP.NET Core 2.0及以下版本中,應(yīng)用于頂級(jí)參數(shù)的驗(yàn)證標(biāo)記將被忽略,并且ModelState不會(huì)更新。只考慮復(fù)雜模型類型的驗(yàn)證參數(shù)。
在ASP.NET Core 2.1中,驗(yàn)證標(biāo)記現(xiàn)在將在頂級(jí)參數(shù)上得到遵守。更重要的是,您可以將[BindReqired]標(biāo)記應(yīng)用于參數(shù)。
ASP.NET Core 2.1 增加了很多新特性。這是一些不錯(cuò)的小改進(jìn)之一,它使事情變得更容易,更一致 -- 我喜歡這種改變。
翻譯自https://andrewlock.net/coming-in-asp-net-core-2-1-top-level-mvc-parameter-validation/。
原文地址:https://www.cnblogs.com/tdfblog/p/asp-net-core-2-1-top-level-mvc-parameter-validation.html
.NET社區(qū)新聞,深度好文,歡迎訪問(wèn)公眾號(hào)文章匯總 http://www.csharpkit.com
總結(jié)
以上是生活随笔為你收集整理的ASP.NET Core MVC 2.1 顶级参数验证的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 微软将人工智能嵌入Windows 10更
- 下一篇: .net core2.0下Ioc容器Au