无法在 asp.net 核心中使用 ajax 将 json 发布到控制器

Posted

技术标签:

【中文标题】无法在 asp.net 核心中使用 ajax 将 json 发布到控制器【英文标题】:Cannot post json to controller using ajax in asp.net core 【发布时间】:2018-02-09 00:34:21 【问题描述】:

我有以下代码

控制器动作方法

    [HttpPost]
    public async Task<IActionResult> Approve(int[] ids)
    
        await _service.Approve(ids).ConfigureAwait(false);
        return Json("Success.");
    

在客户端我有以下要发布的数据

var data = JSON.stringify(getIDs())

   $.ajax(
        type: "POST",
        data: data,
        url: "approve",
        contentType: "application/json; charset=utf-8",
        processData: true,
        cache: false,
        )
        .done(function (response, textStatus, jqXHR) 
            // do something here
        )
        .fail(function (jqXHR, textStatus, errorThrown) 
            // do something here
        )

 function getIDs() 
        var keys = [];
         keys.push(1);
         keys.push(2);
         keys.push(3);
        return keys;
    

问题 在服务器上,在批准操作方法中,ids 参数始终为空。

我也尝试过发送数据

var data = JSON.stringify(ids:getIDs())

我正在使用带有目标框架 1.1 的 ASP.NET Core。

我在经典的 asp.net 中有相同的代码,它可以工作

【问题讨论】:

您没有在您的操作参数中定义[FromBody] 属性,除非您将它们作为查询传递(对于 GET 以外的 Http 请求非常糟糕的做法),否则它不会起作用。或者您必须将其作为表单发送(multipart/form-data mime 类型) @Tseng 添加 [FromBody] 有效。谢谢。但是我不明白你的陈述and it wont work unless you pass them as query (very bad practice on Http requests other than GET)。我在操作方法上定义了HttpPost 属性,并且从客户端也定义了我正在使用ajax POST 所以我假设数据将在正文中发送而不是作为查询参数..我错过了什么吗? (我只错过了[FromBody] 属性,因为我认为在经典的 ASP.NET 中不需要这样做) ....根据 jQuery 文档,如果 processData 为真,那么“数据将转换为查询字符串,如果还不是字符串”.. 所以在我的情况下,我正在做 @ 987654334@..so 数据是字符串类型。所以 i 数据将在正文中发送,而不是在查询字符串中。这不正确吗? 如果有人感兴趣..这就是为什么 ASP.NET Core 需要 FromBody andrewlock.net/model-binding-json-posts-in-asp-net-core 请阅读文档docs.microsoft.com/en-us/aspnet/core/mvc/models/model-binding。基本上,当您没有[FromBody] 属性时,它会尝试从查询(问号后的url?或表单(在带有multipart/form-data 的发布请求)中读取路由(在url 中)的参数值 【参考方案1】:

您似乎正在发送一个对象ids:getIDs(),但在您的控制器中您期望一个array,并且您没有具体说明它来自哪里。

像这样更改您的代码。

[HttpPost("approve")]
public async Task<IActionResult> Approve([FromBody]Data data)

    await _service.Approve(data.ids).ConfigureAwait(false);
    return Json("Success.");


public class Data

    public int[] ids  get; set; 

或者如果你想直接在Ajax POST 中发送数组

[HttpPost("approve")]
public async Task<IActionResult> Approve([FromBody]int[] ids)

    await _service.Approve(ids).ConfigureAwait(false);
    return Json("Success.");

阿贾克斯...

$.ajax(
    type: "POST",
    data: JSON.stringify(getIDs()), //I assume getIDs returns an array of integers
    url: "/approve",
    contentType: "application/json; charset=utf-8",
    processData: true,
    cache: false,
)

【讨论】:

谢谢,但正如@Tseng 提到的[FromBody] 属性有效 还要确保 HttpPost 属性路径是相对于站点根目录的:[HttpPost("/controller-name/approve")]

以上是关于无法在 asp.net 核心中使用 ajax 将 json 发布到控制器的主要内容,如果未能解决你的问题,请参考以下文章

带有asp .net核心的防伪令牌jquery ajax

在 asp.net 核心客户端中使用 ajax 上传文件类型

如何使用asp.net核心在action方法中接收通过ajax请求发送的文件和整数

无法使用 asp.net Web 服务将 ajax 标头值传递给我的 Web 服务方法

将 jQuery 用于 AJAX 与 ASP.NET Webforms [关闭]

在 asp.net 核心中使用返回 url