首頁  >  文章  >  後端開發  >  [KOSD] .NET o .NET8 中 FromQuery 模型綁定的更改

[KOSD] .NET o .NET8 中 FromQuery 模型綁定的更改

Patricia Arquette
Patricia Arquette原創
2024-11-04 11:38:29986瀏覽

[KOSD] Change of FromQuery Model Binding from .NET o .NET8

最近,在將我們的專案從.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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn