【发布时间】: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-datamime 类型) -
@Tseng 添加 [FromBody] 有效。谢谢。但是我不明白你的陈述
and it wont work unless you pass them as query (very bad practice on Http requests other than GET)。我在操作方法上定义了HttpPost属性,并且从客户端也定义了我正在使用ajaxPOST所以我假设数据将在正文中发送而不是作为查询参数..我错过了什么吗? (我只错过了[FromBody]属性,因为我认为在经典的 ASP.NET 中不需要这样做) -
....根据 jQuery 文档,如果
processData为真,那么“数据将转换为查询字符串,如果还不是字符串”.. 所以在我的情况下,我正在做 @ 987654334@..so 数据是字符串类型。所以 i 数据将在正文中发送,而不是在查询字符串中。这不正确吗? -
如果有人感兴趣..这就是为什么 ASP.NET Core 需要
FromBodyandrewlock.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