最近,在將我們的專案從.NET 6 遷移到.NET 8 時,我的隊友Jeremy Chan 發現了模型綁定行為中的一個未記錄的更改,該更改似乎自.NET 7 以來就出現了。此更改在官方 .NET 中沒有明確解釋文檔,因此開發人員很容易忽略它。
為了說明這個問題,讓我們從一個簡單的 Web API 專案開始,探索一個突出顯示變更的簡單控制器方法。
[ApiController] public class FooController { [HttpGet()] public async void Get([FromQuery] string value = "Hello") { Console.WriteLine($"Value is {value}"); return new JsonResult() { StatusCode = StatusCodes.Status200OK }; } }
然後我們假設我們在 .NET 6 和 .NET 8 專案中都啟用了 nullable。
<project sdk="Microsoft.NET.Sdk.Web"> <propertygroup> <nullable>enable</nullable> ... </propertygroup> ... </project>
.NET 6 中的情況
在 .NET 6 中,當我們使用 /foo?value= 呼叫端點時,我們將收到以下錯誤。
{ "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1", "title": "One or more validation errors occurred.", "status": 400, "traceId": "00-5bc66c755994b2bba7c9d2337c1e5bc4-e116fa61d942199b-00", "errors": { "value": [ "The value field is required." ] } }
但是,如果我們將方法改成如下,就不會出現這個錯誤了。
public async void Get([FromQuery] string? value) { if (value is null) Console.WriteLine($"Value is null!!!"); else Console.WriteLine($"Value is {value}"); return new JsonResult() { StatusCode = StatusCodes.Status200OK }; }
使用 /foo?value= 呼叫端點時的日誌將會是「Value is null!!!」。
因此,我們可以知道沒有值的查詢字串將被解釋為空。這就是為什麼當值不可為空時會出現驗證錯誤的原因。
因此,我們可以說,為了使端點在.NET 6中工作,我們需要將其更改為如下以使該值可選。這不會將值標記為必填欄位。
public async void Get([FromQuery] string? value = "Hello")
現在,如果我們使用 /foo?value= 呼叫端點,我們將收到列印的日誌「Value is Hello」。
.NET 8(和 .NET 7)中的情況
那麼在 .NET 8 中如何使用相同的原始設置,即如下所示。
public async void Get([FromQuery] string value = "Hello")
在.NET 8中,當我們使用 /foo?value= 呼叫端點時,我們將看到列印日誌「Value is Hello」。
那麼,這裡發生了什麼事?
.NET 7 中引進了新的介面 IParsable。因此,從 .NET 7 開始,IParsable.TryParse API 用於綁定控制器操作參數值。
初步研究表明,從 .NET 7 開始,使用新的模型綁定實作會導致這種情況發生。
參考
- [API建議]:String應該實作IParsable;
- 讓 bool 和 string 實作 ISpanParsable。
KOSD,或 Kopi-O Siew Dai,是我喜歡的一種新加坡咖啡。它基本上是一杯加了一點糖的咖啡。這個系列的目的是記錄我在喝一小杯 Kopi-O Siew Dai 時所獲得的技術知識。
以上是[KOSD] .NET o .NET8 中 FromQuery 模型綁定的更改的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本文解釋了C標準模板庫(STL),重點關注其核心組件:容器,迭代器,算法和函子。 它詳細介紹了這些如何交互以啟用通用編程,提高代碼效率和可讀性t

本文詳細介紹了c中有效的STL算法用法。 它強調了數據結構選擇(向量與列表),算法複雜性分析(例如,std :: sort vs. std vs. std :: partial_sort),迭代器用法和並行執行。 常見的陷阱

本文詳細介紹了C中的有效異常處理,涵蓋了嘗試,捕捉和投擲機制。 它強調了諸如RAII之類的最佳實踐,避免了不必要的捕獲塊,並為強大的代碼登錄例外。 該文章還解決了Perf

本文討論了使用C中的移動語義來通過避免不必要的複制來提高性能。它涵蓋了使用std :: Move的實施移動構造函數和任務運算符,並確定了關鍵方案和陷阱以有效

C 20範圍通過表現力,合成性和效率增強數據操作。它們簡化了複雜的轉換並集成到現有代碼庫中,以提高性能和可維護性。

本文討論了C中的動態調度,其性能成本和優化策略。它突出了動態調度會影響性能並將其與靜態調度進行比較的場景,強調性能和之間的權衡

文章討論了在C中有效使用RVALUE參考,以進行移動語義,完美的轉發和資源管理,重點介紹最佳實踐和性能改進。(159個字符)


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

WebStorm Mac版
好用的JavaScript開發工具

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。