最近,在將我們的專案從.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 中,當我們使用 /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 中如何使用相同的原始設置,即如下所示。
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 開始,使用新的模型綁定實作會導致這種情況發生。
KOSD,或 Kopi-O Siew Dai,是我喜歡的一種新加坡咖啡。它基本上是一杯加了一點糖的咖啡。這個系列的目的是記錄我在喝一小杯 Kopi-O Siew Dai 時所獲得的技術知識。
以上是[KOSD] .NET o .NET8 中 FromQuery 模型綁定的更改的詳細內容。更多資訊請關注PHP中文網其他相關文章!