ASP.NET Core Razor ajax POST 请求数据对象为空
ASP.NET Core Razor ajax POST request data object is empty
有一个简单的 ajax POST 请求必须 stringify 一个简单的 class 并将其传递到 [=30 的正文中=] 请求,但是服务器端的 Person 参数有空(默认)值
// javascript
var person = { "FirstName": "Andrew", "LastName": "Lock", "Age": "31" };
$.ajax({
type: "POST",
url: "/UpdatePostBody?handler=Abc",
contentType: "application/json; charset=utf-8",
dataType: "json",
data: JSON.stringify(person),
headers: {
RequestVerificationToken:
$('input:hidden[name="__RequestVerificationToken"]').val()
},
})
.done(function (result) {
console.log(result);
});
C# code
public IActionResult OnPostAbc(Person person)
{
return new JsonResult("my result");
}
在服务器端,有一个简单的 ASP.NET Core Razor 页面,其中包含一个被命中的方法和 returns 结果,但是 person参数成员没有值。
通过读取POST body
中的数据解决
public async Task<IActionResult> OnPostAbc()
{
var buffer = new byte[1024];
using (var ms = new MemoryStream())
{
var read = 0;
while ((read = await Request.Body.ReadAsync(buffer, 0, buffer.Length)) != 0)
{
ms.Write(buffer, 0, read);
}
ms.Seek(0, SeekOrigin.Begin);
var person =
JsonConvert.DeserializeObject<Person>(Encoding.UTF8.GetString(ms.GetBuffer()));
return new JsonResult($"my result: {person.FirstName} {person.LastName}");
}
}
如您所见,JSON 作为请求正文的一部分发送。您可以(正如您在自己的回答中所做的那样)读取输入流并手动反序列化它,但是使用处理程序参数上的 [FromBody]
属性有一种更简单的方法:
public IActionResult OnPostAbc([FromBody] Person person)
{
return new JsonResult($"my result: {person.FirstName} {person.LastName}");
}
但是,如果您从 person
对象中的数字中删除引号,这仅适用于默认序列化程序 (System.Text.Json) 的 3.1:
var person = { "FirstName": "Andrew", "LastName": "Lock", "Age": 31 };
或者如果你 add your own type converter.
之前的序列化程序 JSON.Net 对任一版本都满意。并引用数字 are supported in ASP.NET Core 5.
你的 Pesron 数据为空是因为你的 Age
在 class Person
是 int type.And 你在 { "FirstName": "Andrew", "LastName": "Lock", "Age": "31" }
是 string 类型,所以你不能得到 it.Also,因为你将 json 数据从 ajax 传递给处理程序,你需要添加handler.Here 中的 [FromBody]
是一个演示:
cshtml:
<button onclick="postdata()">Abc</button>
function postdata() {
//change Age type to int
var person = { "FirstName": "Andrew", "LastName": "Lock", "Age": 31 };
$.ajax({
type: "POST",
url: "/UpdatePostBody?handler=Abc",
contentType: "application/json; charset=utf-8",
dataType: "json",
data: JSON.stringify(person),
headers: {
RequestVerificationToken:
$('input:hidden[name="__RequestVerificationToken"]').val()
},
})
.done(function (result) {
console.log(result);
});
}
cshtml.cs:
public IActionResult OnPostAbc([FromBody]Person person)
{
return new JsonResult("my result");
}
结果:
有一个简单的 ajax POST 请求必须 stringify 一个简单的 class 并将其传递到 [=30 的正文中=] 请求,但是服务器端的 Person 参数有空(默认)值
// javascript
var person = { "FirstName": "Andrew", "LastName": "Lock", "Age": "31" };
$.ajax({
type: "POST",
url: "/UpdatePostBody?handler=Abc",
contentType: "application/json; charset=utf-8",
dataType: "json",
data: JSON.stringify(person),
headers: {
RequestVerificationToken:
$('input:hidden[name="__RequestVerificationToken"]').val()
},
})
.done(function (result) {
console.log(result);
});
C# code
public IActionResult OnPostAbc(Person person)
{
return new JsonResult("my result");
}
在服务器端,有一个简单的 ASP.NET Core Razor 页面,其中包含一个被命中的方法和 returns 结果,但是 person参数成员没有值。
通过读取POST body
中的数据解决public async Task<IActionResult> OnPostAbc()
{
var buffer = new byte[1024];
using (var ms = new MemoryStream())
{
var read = 0;
while ((read = await Request.Body.ReadAsync(buffer, 0, buffer.Length)) != 0)
{
ms.Write(buffer, 0, read);
}
ms.Seek(0, SeekOrigin.Begin);
var person =
JsonConvert.DeserializeObject<Person>(Encoding.UTF8.GetString(ms.GetBuffer()));
return new JsonResult($"my result: {person.FirstName} {person.LastName}");
}
}
如您所见,JSON 作为请求正文的一部分发送。您可以(正如您在自己的回答中所做的那样)读取输入流并手动反序列化它,但是使用处理程序参数上的 [FromBody]
属性有一种更简单的方法:
public IActionResult OnPostAbc([FromBody] Person person)
{
return new JsonResult($"my result: {person.FirstName} {person.LastName}");
}
但是,如果您从 person
对象中的数字中删除引号,这仅适用于默认序列化程序 (System.Text.Json) 的 3.1:
var person = { "FirstName": "Andrew", "LastName": "Lock", "Age": 31 };
或者如果你 add your own type converter.
之前的序列化程序 JSON.Net 对任一版本都满意。并引用数字 are supported in ASP.NET Core 5.
你的 Pesron 数据为空是因为你的 Age
在 class Person
是 int type.And 你在 { "FirstName": "Andrew", "LastName": "Lock", "Age": "31" }
是 string 类型,所以你不能得到 it.Also,因为你将 json 数据从 ajax 传递给处理程序,你需要添加handler.Here 中的 [FromBody]
是一个演示:
cshtml:
<button onclick="postdata()">Abc</button>
function postdata() {
//change Age type to int
var person = { "FirstName": "Andrew", "LastName": "Lock", "Age": 31 };
$.ajax({
type: "POST",
url: "/UpdatePostBody?handler=Abc",
contentType: "application/json; charset=utf-8",
dataType: "json",
data: JSON.stringify(person),
headers: {
RequestVerificationToken:
$('input:hidden[name="__RequestVerificationToken"]').val()
},
})
.done(function (result) {
console.log(result);
});
}
cshtml.cs:
public IActionResult OnPostAbc([FromBody]Person person)
{
return new JsonResult("my result");
}
结果: