如何在 WebAPI 控制器中接收多个 JSON 对象和一个 Uri 参数

How to receive multiple JSON object and an Uri Parameter in WebAPI Controller

我在试用 ASP.NET Web API2 时遇到了以下情况。我有一个 WebAPI2 控制器:

[HttpPost]
[Route("api/service/receiver/{date}")]
public IHttpActionResult receiver([FromUri]  string date, [FromBody List<car> cars)

}

现在我可以用下面的方法调用它 jQuery:

<script>
    var carsData = [{ "model": "Audi" }, { "model": "BMW" }, { "model": "Audi" }];

    var uri = 'api/service/receiver/20180107';

    $.ajax({
        type: "POST",
        url: uri,
        contentType: "application/json; charset=utf-8",
        data: JSON.stringify(carsData),
        dataType: "json",
        success: function (data) {
            alert(data);
        },
        failure: function (errMsg) {
            alert(errMsg);
        }
    });
</script>

这很好用,但我不知道如何 post 多个复杂对象或一个复杂 JSON 对象和多个附加参数。

我试过了:

[HttpPost]
[Route("api/service/receiver/{date}")]
public IHttpActionResult receiver([FromUri]  string date, [FromBody List<car> cars, [FromBody] List<company> companies)

}

还有

[HttpPost]
[Route("api/service/receiver/{date}")]
public IHttpActionResult receiver([FromUri]  string date, [FromBody List<car> cars, string company)

}

然后在 jQuery 调用中我更改了 data

data: JSON.stringify({ cars: carsData, companies: compData }),

还有

data: JSON.stringify({ cars: carsData, company: "theCompany" }),

但后来我收到了 404 或 null。这怎么能做到?

首先,"FromBody"是指来自HTTP请求的body。基本上,接收到的请求的 body 被转换为 object (默认情况下通过反序列化 JSON )。 MVC.NET 将占用整个 body 并生成一个 object。这就是你不能有两个 [FromBody].

的原因

根据您的 jQuery,您尝试做的是传递 { cars: carsData, companies: compData }{ cars: carsData, company: "theCompany" },这两个 object 作为 [=31= 发送].这些 object 中的每一个都分别具有两个属性(carscompanies)和(carscompany)。由于您将这些 object 作为一个整体传递给 body,MVC 也需要将 body 反序列化为一个完整的字符串。

您将不得不制作一个新的 class:

class MyCarData {
    public List<car> cars { get; set; }
    public List<company> companies { get; set; }
}

然后您可以在您的控制器中使用 [FromBody] MyCarData 来访问它作为一个整体。