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

时间:2016-07-04 19:20:48

标签: json ajax 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; }
}

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

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

我的页面中有以下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.
        }
    });
};

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

最快的出路是什么?

1 个答案:

答案 0 :(得分:6)

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

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

__RequestVerificationToken: $('input[name="__RequestVerificationToken"]', form).val()

有关详细信息,请查看include antiforgerytoken in ajax post ASP.NET MVC