我遇到了一个我似乎无法弄清楚的问题。我正在进行以下ajax调用:
var dataArray = { table: "Products" };
$.ajax({
url: uri,
type: "POST",
cache: false,
datatype: "json",
data: dataArray
})
.done(function( msg ) {
alert( "Data Saved");
})
.fail(function () {
alert("error");
});
我遇到的问题是,这似乎并没有将我在dataArray中的内容发送到我的Web API控制器,并且不断回复以下响应:
{"Message":"No HTTP resource was found that matches the request URI 'http://myURI'.","MessageDetail":"No action was found on the controller 'MYController' that matches the request."}
令我困惑的是我可以像这样做一个GET,它可以很好地返回数据。此外,如果我只是flatout将查询字符串附加到uri,如
http://myURI?table=Products
然后POST工作正常。我可以这样做,但我很好奇我在上面的方式做错了什么。谢谢!
这就是我的控制器中的内容。我基本上只是想验证我现在可以接受它。
public void Post(string table)
{
string beingHit = "We did it!";
}
答案 0 :(得分:0)
问题不一定是您没有将数据发送到Web API。 Web API无法识别它。
在决定哪些Action匹配请求以及如何绑定参数时,Web API(来自the documentation on asp.net)默认应用以下规则:
默认情况下,Web API使用以下规则绑定参数:
- 如果参数是“简单”类型,Web API会尝试从URI获取值。简单类型包括.NET基元类型(int,bool,double等),以及TimeSpan,DateTime,Guid,decimal和string,以及具有可以从字符串转换的类型转换器的任何类型。 (稍后将详细介绍类型转换器。)
- 对于复杂类型,Web API尝试使用媒体类型格式化程序从邮件正文中读取值。
在您的情况下,您尝试绑定“简单”类型参数(string
)。你已经看到它通过查询字符串工作。但是,如果您尝试将其作为请求正文的一部分提交。默认情况下,Web API无法识别它。
为了让Web API能够识别请求正文中的参数,您需要使用FromBody
属性在Action签名中指明这一点:
public void Post([FromBody] string table)
{
string beingHit = "We did it!";
}
这将告诉Web API查看param值的请求体(请注意,您只能在Action中使用它作为一个参数,因此对于像这样的简单类型,最好将它们包含在查询字符串,而[FromBody]
非常适合绑定请求正文中包含的复杂类型为Json)。