如何使用WebAPI 2和RouteAttribute来发布复杂数据

时间:2016-11-01 14:15:10

标签: jquery ajax asp.net-web-api

我有一个WebAPI 2控制器,如下所示(此处简化):

[RoutePrefix("api/Hierarchy")]
public class HierarchyController : ApiController {

  [HttpPost]
  [Route("LevelFiltered")]
  public async Task<GCAResponse<List<SelectableFilterItem>>> GetSomething() {
    ...
  } // GetSomething
} // HierarchyController

当我使用jQuery ajax调用调用该函数时,如下所示......

$.ajax({
  url: $scope.URLs.Test,
  contentType: "application/json",
  cache: false,
  type: "POST",
  dataType: "json"
}).done(function (data, textStatus, jqXHR) {
  alert("here");
}).fail(function (jqXHR, textStatus, errorThrown) {
  alert(errorThrown);
}).always(function () {

}); // ajax

......它有效。

但是,当我只是添加一个整数属性并传递它时,我得到404错误。

[HttpPost]
[Route("LevelFiltered")]
public async Task<GCAResponse<List<SelectableFilterItem>>> GetSomething(int id) {
  ...
} // GetSomething

客户来电:

$.ajax({
  url: $scope.URLs.Test,
  contentType: "application/json",
  cache: false,
  type: "POST",
  dataType: "json",
  data: JSON.stringify({ "id": 1 })
}).done(function (data, textStatus, jqXHR) {
  alert("here");
}).fail(function (jqXHR, textStatus, errorThrown) {
  alert(errorThrown);
}).always(function () {

}); // ajax

我知道我可以在路线中传递ID:

[Route("LevelFiltered/{id}")]

我用原始对象做到了这一点。但是,我真正的签名需要如下:

public async Task<GCAResponse<List<SelectableFilterItem>>> GetSomething(FilterViewTypes filterType, string parentID, FilterSelections filters)

其中filterType是枚举,filters是带数组的复杂对象。

我已经尝试过互联网上每篇文章的内容,但没有取得任何成功。我必须关闭或无参数版本不起作用。如果我的所有属性都是原始对象,我只需将它们添加到URL上。

那么如何从客户端将多个复杂对象传递给Web API 2控制器。这是一个MVC 5网站。

1 个答案:

答案 0 :(得分:1)

好的,通过给朋友打电话来弄明白。

显然,您只能通过WebAPI传递1个(One,Uno,Hana,Single)复杂对象。因此,我将3个所需参数包装到单个对象(模型)中并传递了那么长时间。请注意,您不必在ajax调用中传递WebAPI签名属性名称。这意味着我的属性被称为input,但它不在下面的ajax调用中。

所以你可以从头开始,这里是更新的WebAPI控制器:

[RoutePrefix("api/Hierarchy")]
public class HierarchyController : ApiController  {

  [HttpPost]
  [Route("LevelFiltered")]
  public async Task<GCAResponse<List<SelectableFilterItem>>> GetUsersFilteredHierarchyItems(LevelFilterParameters input) {
    ...
  }
}

除了将3个参数合并为1,我调用LevelFilterParameters并放在我的Model文件夹中之外,没有任何改变。这是班级:

public class LevelFilterParameters {
  public FilterViewTypes FilterType { get; set; }
  public string ParentID { get; set; }
  public FilterSelections Filters { get; set; }
}

以下是更新后的JavaScript调用:

$.ajax({
  url: $scope.URLs.Test,
  contentType: "application/json",
  cache: false,
  type: "POST",
  dataType: "json",
  data: JSON.stringify({ FilterType: 1, ParentID: null, Filters: UsersFilters })
}).done(function (data, textStatus, jqXHR) {
  alert("here");
}).fail(function (jqXHR, textStatus, errorThrown) {
  alert(errorThrown);
}).always(function () {

}); // ajax

像冠军一样工作。谢谢凯尔。