我有一个Action,它接受一个简单的字符串参数,我使用Ajax向它发送数据,如下所示:
[HttpPost]
public async Task<IActionResult> Add(string data)
$.ajax({
type: "POST",
url: "/Items/Add",
data: {
data: item
}
})
这很好用,但是在阅读了关于ASP.NET Core中的模型绑定简单类型后,我了解到你可以使用[FromBody]属性并将值加上前缀'=',所以我按照以下示例重写了它:
[HttpPost]
public async Task<IActionResult> Add([FromBody] string data)
$.ajax({
type: "POST",
url: "/Items/Add",
data: "=" + item,
contentType: "text/plain"
})
然而,在执行此操作后,我的操作不再被命中,并且ajax请求返回404.无论是否设置contentType: "text/plain"
都会发生这种情况,但我发现在未设置contentType时我的请求有效负载为空第二个例子。
更新:我通过重写Ajax请求得到了[FromBody]属性,如下所示:
$.ajax({
type: "POST",
url: "/Items/Add",
data: JSON.stringify(item),
contentType: "application/json"
})
添加application/json
修复了404,但数据为空。我必须将它更新为"'=" + item + "'"
以便在操作中输入值,但是“=”仍然是数据的一部分,所以我没有得到=前缀的全部内容文档。
答案 0 :(得分:1)
我不确定这里的text/plain
内容类型,但您的问题可以通过做两件事来解决:
[FromBody]
更改为[FromForm]
- [FromBody]仅适用于json数据(我相信),这可以解释为什么您的更新示例有效...等等。但是因为模型绑定器现在正在寻找JSON,所以你必须添加引号并最终得到错误的答案。application/x-www-form-urlencoded
。所以它看起来像这样:
[HttpPost]
public async Task<IActionResult> Add([FromForm] string data)
$.ajax({
type: "POST",
url: "/Items/Add",
data: "=" + item,
contentType: "application/x-www-form-urlencoded"
})
现在路线将匹配,模型活页夹会将data
视为表单,轻松将=item
默认为您的操作参数。
旁注:我怀疑你得到的媒体不受支持,而不是404。
答案 1 :(得分:-1)
首先,您需要格式化POST请求正文数据。它看起来像这样:
var dataObject = {
data: '=' + item,
}
$.ajax({
type: 'POST',
url: '/Items/Add',
dataType: 'json',
contentType: dataType,
data: dataObject,
success: function(result) {
console.log(result);
}
});
在你的行动中:
[HttpPost]
public async Task<IActionResult> Add([FromBody] string data)
{
}