【问题标题】:When posting to an ASP.NET Core 3.1 web app, "[FromBody]MyClass data" is often null发布到 ASP.NET Core 3.1 Web 应用程序时,“[FromBody]MyClass 数据”通常为空
【发布时间】:2020-06-17 12:24:11
【问题描述】:

我最近从 .NET Core 2.2 升级到 3.1 后遇到了这个有趣(令人沮丧)的问题。以前我会将数据发布到网络应用程序,接收方法如下所示:

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。事实证明这很重要!

【问题讨论】:

    标签: c# asp.net-core razor-pages


    【解决方案1】:

    如前所述,对Newtonsoft.Json 的引用已被删除,任何自动Json 转换都由System.Text.Json 处理。事实证明,这是导致问题的原因,因为 System.Text.Json 没有那么灵活(微软自己这么说,并且打算如此:How to migrate from Newtonsoft.Json to 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 中发布它你会是得到一个空的[FromBody] 值。

    对于这些情况,最快的解决方案是恢复到Newtonsoft.Json,这很容易做到:

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

    .

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages().AddNewtonsoftJson();
    
        //All your other code:
        //...
    }
    

    这是直接取自here

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

    我知道System.Text.Json 可以配置自定义解析器来处理这种情况(我在其他地方使用过),但我有几十个 POST 方法,而不是更新所有这些方法以使用新方法,按照上面的描述做起来要容易得多。

    【讨论】:

    • System.Text.Json 还没有准备好迎接黄金时段,坚持使用旧的 Newtonsoft Json。
    • 感谢您的回答。我真的在同样的问题上苦苦挣扎。
    • 但是 .NET 6 中没有 AddNewtonsoftJson 方法。
    猜你喜欢
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    • 2020-06-21
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多