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 Personint 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");
        }

结果: