无法在 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 核心客户端中使用 ajax 上传文件类型
如何使用asp.net核心在action方法中接收通过ajax请求发送的文件和整数
无法使用 asp.net Web 服务将 ajax 标头值传递给我的 Web 服务方法