2013-02-08 57 views
10

我似乎无法得到这个工作...我有一些jQuery的像这样的在客户端上:jQuery的岗位空的,而不是JSON来的ASP.NET Web API

$.ajax({ 
    type: "POST", 
    url: "api/report/reportexists/", 
    data: JSON.stringify({ "report":reportpath }), 
    success: function(exists) { 
     if (exists) { 
      fileExists = true; 
     } else { 
      fileExists = false; 
     } 
    } 
}); 

在我的网站。 API控制器我有这样的方法:

[HttpPost] 
public bool ReportExists([FromBody]string report) 
{ 
    bool exists = File.Exists(report); 
    return exists; 
} 

我只是检查,看是否有文件放在服务器上,并为返回一个布尔它是否确实与否。我要发送的报告字符串是UNC路径,所以reportpath看起来像'\\ some \ path \'。

我可以触发脚本,并在ReportExists方法中创建一个断点,但报表变量始终为空。

我在做什么错?

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

更新:另一个线索可能 - 如果我删除[FromBody],那么我的断点根本就没有被打 - '没有找到与请求相匹配的http资源'。我正在看的示例显示[FromBody]不需要...?

+1

'$ .ajax'会更适合这种情况,因为您可能还需要包含'contentType:“application/json”'作为'$ .ajax'选项 – 2013-02-08 19:12:48

+0

请确保检查您的ModelState是否有错误以防在绑定参数时出现问题。 – 2013-02-08 20:40:46

回答

23

所以我发现这个问题,和解决方案。所以,首先。 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] attibute,但除此之外这是很标准的。真正的问题(对我来说)是这个职位。

在提琴手,请求身体看起来像这样“=%5C%5Croot%5Cdata%5Creport.html”

This后真的有答案,并链接到this文章这也是非常有益的。

+0

尼斯链接,谢谢:) – 2013-08-05 04:43:20

+0

+1000如果我可以。唯一的职位,完全解决了我的问题。 – 2015-08-31 05:47:03

+0

是的,当你有一个简单的数据类型,而不使用DTO或模型时,这是有效的。我终于放弃了理论上应该发挥作用的一切,只是完全像这个答案一样工作。 – JohnWrensby 2016-09-10 13:20:50

10

jQuery.ajax()默认情况下,将contentType设置为application/x-www-form-urlencoded。您可以改为发送请求application/json。此外,你应该把你的数据作为一个字符串,它会得到模型绑定到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; 
     } 
    } 
}); 
+1

是的,内容类型通常是问题。 – 2013-06-20 23:27:09

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); 
      } 
     }); 
    } 

Serverside集团:

[HttpPost] 
    public Product[] AddNewProduct([FromBody]Product prod) 
    { 
     new List<Product>(products).Add(prod); 
     return products; 
    } 
+1

我对普通的JSON对象进行了上手操作,不需要stringify! – 2014-06-27 13:05:29

+0

谢谢,真的很感谢,经过多次搜索,终于为我工作了! – 2014-07-24 08:30:28

0

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

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中的对象与您的Contr的参数名称相匹配ollers 恰好为