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]。。。?

jQuery向ASP.NET Web API发布null而不是JSON

所以我找到了问题和解决方案。所以,第一件事。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。成功了!