Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Web API控制器操作参数始终为空_Javascript_C#_Ajax_Asp.net Core_Asp.net Web Api2 - Fatal编程技术网

Javascript Web API控制器操作参数始终为空

Javascript Web API控制器操作参数始终为空,javascript,c#,ajax,asp.net-core,asp.net-web-api2,Javascript,C#,Ajax,Asp.net Core,Asp.net Web Api2,我确实看到一些线程在这里处理类似的问题,但不幸的是,没有什么可以解决我的问题(到目前为止) 控制器方法 以下是我的控制器方法: [EnableCors(“AllowAll”)] [路由属性(“搜索簿”)] [HttpGet(“searchbooks/{key}”)] 公共异步任务搜索簿(字符串键) { 使用(var cmd=_ctx.Database.GetDbConnection().CreateCommand()) { cmd.CommandText=“SearchBooks”; cmd.C

我确实看到一些线程在这里处理类似的问题,但不幸的是,没有什么可以解决我的问题(到目前为止)

控制器方法

以下是我的控制器方法:

[EnableCors(“AllowAll”)]
[路由属性(“搜索簿”)]
[HttpGet(“searchbooks/{key}”)]
公共异步任务搜索簿(字符串键)
{
使用(var cmd=_ctx.Database.GetDbConnection().CreateCommand())
{
cmd.CommandText=“SearchBooks”;
cmd.CommandType=CommandType.storedProcess;
Add(新的SqlParameter(“@Key”,SqlDbType.NVarChar){Value=Key});
if(cmd.Connection.State==ConnectionState.Closed)
cmd.Connection.Open();
var retObj=新列表();
使用(var dataReader=await cmd.ExecuteReaderAsync())
{
while(等待dataReader.ReadAsync())
{
//ExpandoObject的命名空间:System.dynamic
var dataRow=new ExpandoObject()作为IDictionary;
对于(变量iFiled=0;iFiled
当我检查控制台的输出时,它说

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

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


$.ajax({
类型:“POST”,
url:“http://localhost:5000/api/bookstore/SearchBooks",
数据:{'key':'van'},
数据类型:“json”,
contentType:“应用程序/json”,
成功:功能(res){
$(“#回复”).html(res);
},
错误:函数(err){
}
});
问题是控制器方法
SearchBooks
中参数
key
的值总是
null

但是如果我创建一个
模型
(如下)

型号

公共类SearchViewModel{
公共字符串搜索键{get;set;}
}
然后,如果我修改我的
AJAX
将值传递给这个
模型,就像下面所说的那样,一切正常


var搜索模型={
钥匙:“面包车”
}
$.ajax({
类型:“POST”,
数据:JSON.stringify(searhModel),
url:“http://localhost:5000/api/bookstore/searchbooks",
contentType:“应用程序/json”,
成功:功能(res){
$(“#回复”).html(res);
},
错误:函数(err){
}
});

请帮忙

当参数具有[FromBody]时,Web API使用内容类型标头选择格式化程序

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

}
公共异步任务搜索簿([FromBody]字符串键){
}
请在ajax调用中使用
键入:“GET”

你的url应该是这样的
url:http://localhost:5000/api/bookstore/SearchBooks/van“
最后删除
数据

最终代码:

  $.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) {

  }
});

根据您的问题,您的json格式似乎无效,当您使用stringify时,它会生成有效的json,因此工作正常。因此,在ajax调用中尝试从“key”中删除Qout。e、 g

<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>

$.ajax({
类型:“POST”,
url:“http://localhost:5000/api/bookstore/SearchBooks",
数据:{key:'van'},
数据类型:“json”,
contentType:“应用程序/json”,
成功:功能(res){
$(“#回复”).html(res);
},
错误:函数(err){
}
});

您能否至少尝试正确格式化您的代码?您的第一个块不可读。尝试重新格式化第一个代码段,但它看起来仍然不太整洁:(很抱歉,我编辑了一点,@NiladriSarkarThanks很多。它现在看起来很漂亮!在您的第二次尝试中,您应该有
var searchModel={searchKey:'van'}
在javascript中。然后,由于您发送的是json,请使用动作方法签名
公共异步任务SearchBooks([FromBody]SearchViewModel){
如@Santosh的答案所示。@CodeCaster:更新了答案实际上我尝试了
[FromBody]
已经存在,但这对我不起作用。@NiladriSarkar:你能在调试模式下点击SearchBooks方法吗?@NiladriSarkar:看起来是数据库问题而不是webapi问题这不是数据库问题,因为从
JavaScript
绑定模型并将其作为
JSON.stringify(model)传递
工作正常。问题是当我传递像
数据:{'key':'van'}
这样的参数时。