【发布时间】: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<object> SearchBooks([FromBody] SearchViewModel model) {。
标签: javascript c# ajax asp.net-core asp.net-web-api2