Web Api参数始终为空

为什么当我用下面的ajax调用下面的Post方法时,参数总是为空?

public IEnumerable<string> Post([FromBody]string value) { return new string[] { "value1", "value2", value }; } 

以下是通过ajax调用Web API方法:

  function SearchText() { $("#txtSearch").autocomplete({ source: function (request, response) { $.ajax({ type: "POST", contentType: "application/json; charset=utf-8", url: "api/search/", data: "test", dataType: "text", success: function (data) { response(data.d); }, error: function (result) { alert("Error"); } }); } }); } 
 $.ajax({ url: '/api/search', type: 'POST', contentType: 'application/x-www-form-urlencoded; charset=utf-8', data: '=' + encodeURIComponent(request.term), success: function (data) { response(data.d); }, error: function (result) { alert('Error'); } }); 

基本上,你可以只有一个标量types的参数,用[FromBody]属性装饰,你的请求需要使用application/x-www-form-urlencoded ,POST有效载荷应该是这样的:

 =somevalue 

请注意,与标准协议相反,参数名称缺失。 您只发送价值。

您可以阅读更多关于Web Api中的模型绑定在this article工作原理。

但是,当然,这种黑客入侵是一件有病的事情。 你应该使用视图模型:

 public class MyViewModel { public string Value { get; set; } } 

然后摆脱[FromBody]属性:

 public IEnumerable<string> Post(MyViewModel model) { return new string[] { "value1", "value2", model.Value }; } 

然后使用JSON请求:

 $.ajax({ url: '/api/search', type: 'POST', contentType: 'application/json; charset=utf-8', data: JSON.stringify({ value: request.term }), success: function (data) { response(data.d); }, error: function (result) { alert('Error'); } }); 

对于JSON内容types的[FromBody]属性,不能使用简单的types。 虽然Visual Studio中的默认string是来自body的string,但是这是针对application / x-www-form-urlencoded内容types的。

将string值作为属性放在基本模型类上,反序列化器将工作。

 public class SimpleModel() { public string Value {get;set;} } public IEnumerable<string> Post([FromBody]SimpleModel model) { return new string[] { "value1", "value2", model.Value }; } 

更改您要发送的JSON:

 {"Value":"test"} 

无论何时我们调用web api动作,并且从[body]参数中input参数前缀=例如

 public string GetActiveEvents([FromBody] string XMLRequestString) { } 

调用上面的web api动作

  1. URI

  2. 2。

用户代理:提琴手

内容types:application / x-www-form-urlencoded

主机:localhost:54702

内容长度:936

  1. 请求正文=数据

我希望这会给出清晰的想法。

我刚刚和这个.NET Core Web API有过一段时间。 所以希望能够节省时间:对于我来说,实际的问题很简单 – 我没有转换成正确的types(注意,@达林斯答案使用虚拟机而不是string)。

模板中的默认types是string 。 我以为因为我们发送string化的JSON,我们会看到一个JSONstring,但事实并非如此。 我必须把它做成正确的types。

例如,这失败了

 [EnableCors("AllowAll")] [HttpPost] public HttpResponseMessage Post([FromBody]string value) { // Do something with the blog here.... var msg = new HttpResponseMessage(System.Net.HttpStatusCode.OK); return msg; } 

但是,这工作。

 [EnableCors("AllowAll")] [HttpPost] public HttpResponseMessage Post([FromBody]Blog value) { // Do something with the blog here.... var msg = new HttpResponseMessage(System.Net.HttpStatusCode.OK); return msg; } 

Ajax调用

 function HandleClick() { // Warning - ID's should be hidden in a real application // - or have covering GUIDs. var entityData = { "blogId": 2, "url": "http://myblog.com/blog1", "posts": [ { "postId": 3, "title": "Post 1-1", "content": "This is post 1 for blog 1", "blogId": 2 }, { "postId": 4, "title": "Post 1-2", "content": "This is post 2 for blog 1", "blogId": 2 } ] }; $.ajax({ type: "POST", url: "http://localhost:64633/api/blogs", async: true, cache: false, crossDomain: true, data: JSON.stringify(entityData), contentType: "application/json; charset=utf-8", dataType: "json", success: function (responseData, textStatus, jqXHR) { var value = responseData; }, error: function (responseData, textStatus, errorThrown) { alert('POST failed.'); } }); }