我们正在从MVC迁移到WepApi来提供我们的数据。以下是我们如何更改控制器的示例。
MVC:
OfficeController : Controller
{
[HttpPost]
public IEnumerable<Employee> SetSalary(string badge, string salary)
{
return new List<Employee>();
}
}
的WebAPI
OfficeApiController : ApiController
{
[HttpPost]
public IEnumerable<Employee> SetSalary(string badge, string salary)
{
return new List<Employee>();
}
}
我们正在从客户端发送数据,如下所示:
var data = JSON.stringify({ badge: '123', salary: '100000' });
// MVC
$.ajax({
type: 'POST',
contentType: "application/json; charset=utf-8",
dataType: 'json',
data: data,
url: 'Office/SetSalary',
});
// WebApi
$.ajax({
type: 'POST',
contentType: "application/json; charset=utf-8",
dataType: 'json',
data: data,
url: 'ActionApi/OfficeApi/SetSalary',
});
MVC控制器工作正常;但是对于webapi,我们收到以下消息:
{"Message":"No HTTP resource was found that matches the request URI.","MessageDetail":"No action was found on the controller 'OfficeApiController ' that matches the request."}
如果我们的帖子只有一个参数,那么一切都可以正常使用WebApi
如果我们将徽章和工资放在一个类中并将post参数更改为该类,那么一切正常。
如果我们将它们作为两个参数提交但是在webform中,那么一切正常。
当我们提交Json并且控制器有两个参数而不是一个具有这些参数作为属性的类时,webapi才会失败。
我们知道WebApi是针对Rest的,它应该得到/ pot / delete / update一个资源,但我无法弄清楚为什么它无法解析两个Json参数。
请注意,这不是我们的实际代码和提问的简化版本。可能会有一些拼写错误,但一切都符合我们的测试并且正常运行。
感谢您的帮助。
答案 0 :(得分:2)
WebAPI 仅支持通过POST发送的一个参数。这没关系,因为您可以将所有内容都包装在对象中。
在你的jQuery $.ajax
帖子中,你实际上已经发送了一个参数。
var data = JSON.stringify({ badge: '123', salary: '100000' });
这会创建一个对象,其中包含两个属性badge
和salary
。
您需要将WebAPI代码更改为
[HttpPost]
public IEnumerable<Employee> SetSalary([FromBody]SalaryData data)
{
// do stuff
}
然后将SalaryData
类声明为
public class SalaryData
{
public string Badge {set; get;}
public string Salary {set; get;}
}