簡體   English   中英

發布到 ASP.NET Core 3.1 Web 應用程序時,“[FromBody]MyClass 數據”通常為空

[英]When posting to an ASP.NET Core 3.1 web app, "[FromBody]MyClass data" is often null

我最近在從 .NET Core 2.2 升級到 3.1 后遇到了這個有趣(令人沮喪)的問題。 以前,我會將數據 POST 到 Web 應用程序,接收方法如下所示:

public IActionResult OnPostAddNewDataAsync([FromBody]MyClass data)
{
    //...
}

其中MyClass可能是這樣的:

public class MyClass
{
    public string Field1 {get; set;}
    public integer Value1 {get; set;}
}

(作為參考,要從 Javascript 訪問端點,您可以這樣做:

 await PostDataAsync("AddNewData", {
      "Field1": "Hello I am",
      "Value1": 7
 });

async function PostDataAsync(handler, data)
{
    return await $.ajax({
        url: window.location.pathname + "?handler=" + handler,
        type: "POST",
        contentType: "application/json",
        headers:
        {
            RequestVerificationToken: $('input:hidden[name="__RequestVerificationToken"]').val()
        },
        data: JSON.stringify(data)
    });
}

我花了一段時間才弄明白!)。

這工作得很好。

更新 .NET Core 3.1 后,我的許多 POST 方法停止工作,並且[FromBody]值將為空。

注意:作為升級到 .NET Core 3.1 的一部分,我刪除了對Newtonsoft.Json引用,決定改為嘗試使用新的System.Text.Json 這將變得很重要!

如前所述,刪除了對Newtonsoft.Json引用,留下任何自動 Json 轉換由System.Text.Json處理。 事實證明,這是問題的原因,因為System.Text.Json不夠靈活(微軟自己這么說,而且它的目的是這樣: 如何從 Newtonsoft.Json 遷移到 System.Text.Json) .

在 .NET Core 3 之前,ASP.NET Core 在內部使用Newtonsoft.Json ,現在它使用System.Text.Json

一個例子是數字字段,例如MyClass.Value1 如果從 Javascript 中傳遞“10”或 10, Newtonsoft.Json將處理它並將兩者識別為 10。默認情況下System.Text.Json該字段不能有周圍的引號,如果在 Json 中你發布了它d 得到一個空[FromBody]值。

解決這個問題的最快方法是在這些情況下恢復到Newtonsoft.Json ,這很容易通過:

  • 安裝 Nuget 包Microsoft.AspNetCore.Mvc.NewtonsoftJson
  • 在 Startup.cs 中,更新以下方法:

.

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages().AddNewtonsoftJson();

    //All your other code:
    //...
}

這是直接取自這里

進行此更改后,一切都再次按預期工作。

我知道System.Text.Json可以配置自定義解析器來處理這些情況(我確實在其他地方使用過),但我有幾十個 POST 方法,而不是更新它們以使用新方法,如上所述,這樣做要容易得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM