【问题标题】:Json post with multi parameter to WebApi vs MVC带有多参数的 Json 发布到 WebApi vs MVC
【发布时间】:2015-04-29 06:09:10
【问题描述】:

我们正在从 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 参数更改为该类,那么一切正常。

如果我们将它们作为两个参数提交但在网络表单中,那么一切正常。

webapi 仅在我们提交 Json 并且控制器具有两个参数而不是具有这些参数作为属性的单个类时才会失败。

我们知道 WebApi 是用于 Rest 的,它应该获取/pot/delete/update 一个资源,但我不知道为什么它不能解析两个 Json 参数。

请注意,这不是我们的实际代码,而是用于提问的简化版本。可能有一些错字,但在我们的测试中一切都符合要求并运行良好。

感谢您的帮助。

【问题讨论】:

  • 开箱即用,Web API 不支持 POST 正文中的多个参数。典型的解决方案是将其包装到单个类中。可以通过其他方式完成,但是 AFAIK,您需要覆盖默认的 HttpParameterBinding。
  • 您可以尝试在 url 本身中为 webapi 发送参数吗? ActionApi/OfficeApi/SetSalary/{badge}/{salary}

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


【解决方案1】:

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

在您的 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;}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    • 2017-06-05
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 2015-08-10
    相关资源
    最近更新 更多