【问题标题】:Adding [FromBody] attribute causes 404添加 [FromBody] 属性会导致 404
【发布时间】:2018-02-07 19:46:50
【问题描述】:

我有一个带有简单字符串参数的操作,我使用 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 + "'" 以便在操作中通过该值,但是“=”仍然是数据的一部分,所以我不明白文档中 = 前缀的全部含义.

【问题讨论】:

  • 也许应该是{data: '='+item} ???
  • 项目是 JSON 还是字符串?
  • item 只是一个字符串值。

标签: ajax asp.net-core asp.net-core-mvc asp.net-core-2.0


【解决方案1】:

我不确定这里的 text/plain 内容类型,但您的问题可以通过做 2 件事来解决:

  1. [FromBody] 更改为[FromForm] - [FromBody] 仅适用于 json 数据(我相信),这可以解释为什么您的更新示例有效......有点。但由于模型绑定器现在显式查找 JSON,因此您必须添加引号并最终得到错误的答案。
  2. 将内容类型更改为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 默认为您的操作参数。

旁注:我怀疑您得到的是不受支持的 415 媒体,而不是 404。

【讨论】:

  • idk,Vivaldi 说 404 Not Found。正如您所说,这现在可以正常工作,item 进入操作时没有“=”。
【解决方案2】:

首先你需要格式化 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)
   {

   }

【讨论】:

  • 仍然是 404。如果是数据格式问题,我希望 data 在操作中为空,但仍然可以访问操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-12
  • 2018-08-28
  • 1970-01-01
  • 2012-04-13
相关资源
最近更新 更多