jQuery向ASP.NET Web API发布null而不是JSON
本文关键字:null JSON 发布 API ASP NET Web jQuery | 更新日期: 2023-09-27 17:58:18
我似乎无法让它工作。。。我在客户端上有一些类似的jQuery:
$.ajax({
type: "POST",
url: "api/report/reportexists/",
data: JSON.stringify({ "report":reportpath }),
success: function(exists) {
if (exists) {
fileExists = true;
} else {
fileExists = false;
}
}
});
在我的Web.API控制器中,我有一个这样的方法:
[HttpPost]
public bool ReportExists( [FromBody]string report )
{
bool exists = File.Exists(report);
return exists;
}
我只是检查一个文件是否存在于服务器上,并返回一个关于它是否存在的bool。我发送的报告字符串是UNC路径,因此报告路径看起来像"''''some''path"。
我可以正常地启动脚本,并在ReportExists方法中命中断点,但报表变量始终为null。
我做错了什么?
我还看到了一种使用.post和postJSON进行发布的方法。也许我应该用其中一个?如果是,我的格式是什么?
更新:如果我删除[FromBody],则我的断点根本不会被命中,这可能是一条额外的线索——"没有找到与请求匹配的http资源"。我看的例子表明不需要[FromBody]。。。?
所以我找到了问题和解决方案。所以,第一件事。contentType不能为"application/json",必须为空(我认为默认为application/x-www-form-urlencoded)。虽然看起来您必须发送json,但名称-值对中没有名称。使用JSON.stringify也会把这件事搞砸。所以完整的jQuery代码是这样的:
$.ajax({
type: "POST",
url: "api/slideid/reportexists",
data: { "": reportpath },
success: function(exists) {
if (exists) {
fileExists = true;
} else {
fileExists = false;
}
}
});
在Web.API方面,参数上必须有[FromBody]属性,但除此之外,这是非常标准的。(对我来说)真正的问题是帖子。
在Fiddler中,请求正文如下所示:"=%5C%%5Croot%5Cdata%5Creport.html"
这篇帖子确实有答案,并链接到这篇文章,这篇文章也很有帮助。
jQuery.ajax()
将contentType设置为application/x-www-form-urlencoded
。您可以改为在application/json
中发送请求。此外,您应该将数据作为字符串发送,它将为您的post方法获得与report
参数的模型绑定:
$.ajax({
type: "POST",
url: "api/report/reportexists/",
contentType: "application/json",
data: JSON.stringify(reportpath),
success: function(exists) {
if (exists) {
fileExists = true;
} else {
fileExists = false;
}
}
});
这对我有效,所有其他方法都无效:
function addProduct() {
var product = { 'Id': 12, 'Name': 'Maya', 'Category': 'newcat', 'Price': 1234 };
$.ajax({
type: "POST",
url: "../api/products",
async: true,
cache: false,
type: 'POST',
data: product,
dataType: "json",
success: function (result) {
},
error: function (jqXHR, exception) {
alert(exception);
}
});
}
服务器端:
[HttpPost]
public Product[] AddNewProduct([FromBody]Product prod)
{
new List<Product>(products).Add(prod);
return products;
}
如果使用MVC的FromBody
属性,MVC绑定器会将其视为可选参数。这意味着,即使只有一个FromBody
参数,也需要对参数名称进行显式处理。
你应该能够使用像这样简单的东西:
控制器:
[HttpPost]
public bool ReportExists( [FromBody]string report )
{
bool exists = File.Exists(report);
return exists;
}
Javascript:
$.ajax({
type: "POST",
url: "api/report/reportexists/",
data: { "report":reportpath },
success: function(exists) {
...
您必须确保jQuery中的数据对象与Controllers的参数名称完全匹配
$.post为我服务。从webapi中删除[FromBody],并在jquery客户端的$.post的url参数中给出url。成功了!