Json发布了WebApi与MVC的多参数

时间:2015-04-28 17:58:12

标签: c# json asp.net-mvc asp.net-web-api

我们正在从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参数。

请注意,这不是我们的实际代码和提问的简化版本。可能会有一些拼写错误,但一切都符合我们的测试并且正常运行。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

WebAPI 仅支持通过POST发送的一个参数。这没关系,因为您可以将所有内容都包装在对象中。

在你的jQuery $.ajax帖子中,你实际上已经发送了一个参数。

var data = JSON.stringify({ badge: '123', salary: '100000' });

这会创建一个对象,其中包含两个属性badgesalary

您需要将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;}
}