17

我似乎无法让它工作......我在客户端上有一些这样的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;
}

我只是检查文件是否存在于服务器上,并返回一个关于它是否存在的布尔值。我发送的报告字符串是一个 UNC 路径,所以报告路径看起来像 '\\some\path\'。

我可以很好地触发脚本,并在我的 ReportExists 方法中打断点,但报告变量始终为空。

我究竟做错了什么?

我还看到了一种使用 .post 和 postJSON 发布的方法。也许我应该使用其中之一?如果是这样,我的格式是什么?

更新: 可能还有一条线索——如果我删除 [FromBody],那么我的断点根本不会被命中——“没有找到与请求匹配的 http 资源”。我正在查看的示例表明不需要 [FromBody] ......?

4

5 回答 5

26

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

这篇文章确实有答案,并且链接到这篇文章也很有帮助。

于 2013-02-11T20:25:40.287 回答
13

jQuery.ajax()默认情况下将 contentType 设置为application/x-www-form-urlencoded. application/json您可以改为发送请求。此外,您应该将数据作为字符串发送,它会将模型绑定到report您的 post 方法的参数:

$.ajax({
    type: "POST",
    url: "api/report/reportexists/",
    contentType:  "application/json",
    data: JSON.stringify(reportpath),
    success: function(exists) {
        if (exists) {
            fileExists = true;
        } else {
            fileExists = false;
        }
    }
});
于 2013-02-08T19:55:37.540 回答
6

这对我有用,所有其他方法都没有:

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;
    }
于 2014-06-27T13:01:37.877 回答
0

如果您使用 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 中的数据对象与您的控制器的参数名称完全匹配。

于 2014-12-16T16:02:24.643 回答
-1

$.post 为我服务。从 webapi 中删除 [FromBody] 并在 jquery 客户端中 $.post 的 url 参数中给出 url。有效!

于 2014-09-10T07:09:18.397 回答