【问题标题】:How To Use WebAPI 2 and RouteAttribute to POST Complex Data如何使用 Web API 2 和路由属性发布复杂数据
【发布时间】:2016-11-02 02:19:05
【问题描述】:

我有一个如下的 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 网站。

【问题讨论】:

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


    【解决方案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
    

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

    【讨论】:

      猜你喜欢
      • 2017-03-24
      • 1970-01-01
      • 1970-01-01
      • 2014-02-07
      • 2014-04-19
      • 2015-03-29
      • 2014-05-28
      • 1970-01-01
      • 2015-07-19
      相关资源
      最近更新 更多