![](/img/trans.png)
[英]calling asp.net mvc 5 web api in asp.net core, FromBody always null
[英]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
,這很容易通過:
Microsoft.AspNetCore.Mvc.NewtonsoftJson
.
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages().AddNewtonsoftJson();
//All your other code:
//...
}
這是直接取自這里。
進行此更改后,一切都再次按預期工作。
我知道System.Text.Json
可以配置自定義解析器來處理這些情況(我確實在其他地方使用過),但我有幾十個 POST 方法,而不是更新它們以使用新方法,如上所述,這樣做要容易得多。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.