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

Posted

技术标签:

【中文标题】将复杂的 JSON 发布到 ASP.NET Core 控制器【英文标题】:POSTing complex JSON to ASP.NET Core Controller 【发布时间】:2016-11-06 13:28:31 【问题描述】:

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

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

最快的方法是什么?

【问题讨论】:

url: '@Url.Action("Create" ,"Test")',。你确定这行得通吗? 是的,网址没问题 【参考方案1】:

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

挑战在于我不知道如何使它与发布的 JSON 数据一起工作。您可以通过将以下内容添加到 testItem 中:

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

欲了解更多信息,请查看include antiforgerytoken in ajax post ASP.NET MVC

【讨论】:

以上是关于将复杂的 JSON 发布到 ASP.NET Core 控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 json 将复杂类型传递给 ASP.NET MVC 控制器

如何在asp.net mvc中返回复杂的Json对象

asp.net 将 json 发布到控制器

将 JSON 发布到 ASP.NET MVC 可空短属性

将大型 JSON 对象发布到 ASP.NET MVC

如何在 C# Asp.Net 中从相当复杂的 Json 响应中创建 Dto