【问题标题】:Cannot post json to controller using ajax in asp.net core无法在 asp.net 核心中使用 ajax 将 json 发布到控制器
【发布时间】: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 中)的参数值

标签: javascript jquery asp.net-core asp.net-core-mvc coreclr


【解决方案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")]
猜你喜欢
  • 2018-11-14
  • 2018-06-22
  • 1970-01-01
  • 1970-01-01
  • 2016-05-28
  • 2019-03-30
  • 1970-01-01
  • 2017-07-20
  • 1970-01-01
相关资源
最近更新 更多