【问题标题】:Web API controller action arguments are always nullWeb API 控制器操作参数始终为空
【发布时间】:2016-05-12 18:48:50
【问题描述】:

我确实在这里看到了一些解决类似问题的线程,但不幸的是,没有任何东西可以解决我的问题(到目前为止)。

控制器方法

以下是我的控制器方法:

[EnableCors("AllowAll")]
[RouteAttribute("SearchBooks")]
[HttpGet("searchbooks/{key}")]
public async Task<object> SearchBooks(string key)
{
    using (var cmd = _ctx.Database.GetDbConnection().CreateCommand())
    {
        cmd.CommandText = "SearchBooks";
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add(new SqlParameter("@Key", SqlDbType.NVarChar) { Value = key });

        if (cmd.Connection.State == ConnectionState.Closed)
            cmd.Connection.Open();

        var retObj = new List<dynamic>();
        using (var dataReader = await cmd.ExecuteReaderAsync())
        {
            while (await dataReader.ReadAsync())
            {
                //Namespace for ExpandoObject: System.dynamic
                var dataRow = new ExpandoObject() as IDictionary<string, object>;

                for (var iFiled = 0; iFiled < dataReader.FieldCount; iFiled++)
                    dataRow.Add(dataReader.GetName(iFiled), dataReader[iFiled]);

                retObj.Add((ExpandoObject)dataRow);
            }
        }

        if (!retObj.Any())
            return JsonConvert.SerializeObject("No matching record found");
        else
            return JsonConvert.SerializeObject(retObj);
    }
}

当我检查控制台的输出时,它说

失败:Microsoft.AspNet.Server.Kestrel[13] 应用程序引发了未处理的异常。 System.Data.SqlClient.SqlException (0x80131904):过程或函数“SearchBooks”需要参数“@Key”,但未提供。

我在本地创建了另一个网站,专门用于测试 CORS 问题(效果很好)。我通过AJAX调用上述方法,方式如下:

<script type='text/javascript'>
$.ajax({
  type: "POST",
  url: "http://localhost:5000/api/bookstore/SearchBooks",
  data: { 'key': 'van' },
  dataType: 'json',
  contentType:"application/json",
  success: function (res) {
    $("#response").html(res);
  },
  error: function (err) {

  }
});
</script>  

问题是控制器方法SearchBooks中参数key的值始终是null

但如果我创建一个model(下)

型号

public class SearchViewModel{
  public string SearchKey {get; set;}
}

然后如果我修改我的AJAX 以将值传递给这个model,如下所示,一切正常!

<script type='text/javascript'>
  var searchModel={
    key: 'van'
  }

  $.ajax({
    type: "POST",
    data: JSON.stringify(searhModel),
    url: "http://localhost:5000/api/bookstore/searchbooks",
    contentType:"application/json",
    success: function (res) {
      $("#response").html(res);
    },
    error: function (err) {

    }
});
</script>

请帮忙!

【问题讨论】:

  • 您至少可以尝试正确格式化您的代码吗?你的第一个块是不可读的。
  • 试图重新格式化第一个代码 sn-p 但它仍然看起来不是很整洁:( 抱歉
  • 我稍微编辑了一下,@NiladriSarkar
  • 非常感谢 Uwe Keim。现在看起来很漂亮!
  • 在您的第二次尝试中,您应该在 javascript 中有 var searchModel = { searchKey: 'van' }。然后,由于您要发送 json,请使用@Santosh 的答案中的操作方法签名public async Task&lt;object&gt; SearchBooks([FromBody] SearchViewModel model) {

标签: javascript c# ajax asp.net-core asp.net-web-api2


【解决方案1】:

在您的 ajax 调用中使用 type: "GET"

你的网址应该是这样的 url: "http://localhost:5000/api/bookstore/SearchBooks/van" 最后删除data

最终代码:

  $.ajax({
  type: "GET",
  url: "http://localhost:5000/api/bookstore/SearchBooks/van",
  dataType: 'json',
  contentType:"application/json",
  success: function (res) {
    $("#response").html(res);
  },
  error: function (err) {

  }
});

【讨论】:

    【解决方案2】:

    当参数有 [FromBody] 时,Web API 使用 Content-Type 标头来选择格式化程序。

    public async Task<object> SearchBooks([FromBody]string key){
    
    }
    

    请参考Parameter Binding in ASP.NET Web API

    【讨论】:

    • @CodeCaster:更新答案
    • 实际上我已经尝试过[FromBody],但这对我不起作用。
    • @NiladriSarkar:你能在调试模式下点击 SearchBooks 方法吗?
    • @NiladriSarkar:看起来像数据库问题而不是 webapi 问题
    • 这不是数据库问题,因为来自JavaScript 的模型绑定并将其作为JSON.stringify(model) 传递可以正常工作。问题是当我传递 data: {'key': 'van'} 之类的参数时。
    【解决方案3】:

    根据您的问题,您的 json 格式似乎无效,当您使用 stringify 时,它会生成有效的 json,因此可以正常工作。所以尝试在你的ajax调用中从'key'中删除qouts。例如

    <script type='text/javascript'>
    $.ajax({
      type: "POST",
      url: "http://localhost:5000/api/bookstore/SearchBooks",
      data: { key: 'van' },
      dataType: 'json',
      contentType:"application/json",
      success: function (res) {
        $("#response").html(res);
      },
      error: function (err) {
    
      }
    });
    </script>
    

    【讨论】:

      猜你喜欢
      • 2013-01-15
      • 1970-01-01
      • 1970-01-01
      • 2017-08-09
      • 2014-08-06
      • 2013-01-18
      • 2014-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多