将复杂的JSON发布到ASP.NET核心控制器

mar*_*rin 2 ajax json asp.net-web-api asp.net-core

我的ASP.NET核心代码中有以下模型:

public class TestItem
{
    public string Id { get; set; }
    public string Name { get; set; }
    public List<TestSubItem> SubItems { get; set; }
}

public class TestSubItem
{
    public string Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

和我的Controllers/TestController.cs中的以下方法:

    // POST: Test/Create
    [HttpPost]
    [ValidateAntiForgeryToken]
    public IActionResult Create([FromBody]TestItem item)
    {
        // Use item here...
        return View(item);
    }
Run Code Online (Sandbox Code Playgroud)

我的页面中有以下JavaScript:

var mySubItems = [{"Id": "1"}];

function submitForm() {
    // myForm contains an Id textbox and a Name textbox
    $("#myForm").submit();
};

function doPost() {

    var testItem = {
        Id: "2",
        Name: "testName",
        SubItems: mySubItems
    };

    $.ajax({
        url: '@Url.Action("Create" ,"Test")',
        type: "POST",
        contentType: "application/json",
        data: JSON.stringify(testItem),
        success: function (data) {
            alert(data);
        },
        error: function (error) {
            var x = error; //break here for debugging.
        }
    });
};
Run Code Online (Sandbox Code Playgroud)

当我使用时doPost,我总是400 Bad Request从服务器返回.submitForm另一方面工作正常,但我不知道如何包含mySubItems在发送到服务器的数据中.

什么是最快的出路?

Jef*_*ver 6

在控制器上包含[ValidateAntiForgeryToken]会导致问题.发布数据时需要包含令牌.MVC自动将其包含在表单中,这就是submitForm()的工作原理.

挑战在于我不知道如何使用它来发布JSON数据.您可以通过将以下内容添加到testItem中:

__RequestVerificationToken: $('input[name="__RequestVerificationToken"]', form).val()
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请查看ASP.NET MVC中的ajax后面的antiforgerytoken