添加[FromBody]属性会导致404

时间:2018-02-07 19:46:51

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

我有一个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 + "'"以便在操作中输入值,但是“=”仍然是数据的一部分,所以我没有得到=前缀的全部内容文档。

2 个答案:

答案 0 :(得分:1)

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

  1. [FromBody]更改为[FromForm] - [FromBody]仅适用于json数据(我相信),这可以解释为什么您的更新示例有效...等等。但是因为模型绑定器现在正在寻找JSON,所以你必须添加引号并最终得到错误的答案。
  2. 将内容类型更改为application/x-www-form-urlencoded
  3. 所以它看起来像这样:

    [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)
   {

   }