首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用WebAPI 2和RouteAttribute发布复杂数据

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

Stack Overflow用户
提问于 2016-11-01 14:15:10
回答 1查看 51关注 0票数 1

我有一个WebAPI 2控制器,如下所示(在这里简化):

代码语言:javascript
复制
[RoutePrefix("api/Hierarchy")]
public class HierarchyController : ApiController {

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

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

代码语言:javascript
复制
$.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

...It工作。

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

代码语言:javascript
复制
[HttpPost]
[Route("LevelFiltered")]
public async Task<GCAResponse<List<SelectableFilterItem>>> GetSomething(int id) {
  ...
} // GetSomething

客户电话:

代码语言:javascript
复制
$.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

我知道我可以在路线上通过:

代码语言:javascript
复制
[Route("LevelFiltered/{id}")]

我用原始的物体做过。然而,我真正的签名需要如下:

代码语言:javascript
复制
public async Task<GCAResponse<List<SelectableFilterItem>>> GetSomething(FilterViewTypes filterType, string parentID, FilterSelections filters)

其中filterType是一个枚举,过滤器是一个带有数组的复杂对象。

我试过互联网上的每一篇文章,但都没有成功。我必须接近,否则无参数版本将无法工作。如果我的所有属性都是原始对象,我只需将它们连接到URL上即可。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-01 18:19:05

好吧,打电话给朋友就知道了。

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

因此,您可以从头开始跟踪,下面是更新的WebAPI控制器:

代码语言:javascript
复制
[RoutePrefix("api/Hierarchy")]
public class HierarchyController : ApiController  {

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

除了将3个参数合并到我称为LevelFilterParameters并放在我的Model文件夹中的1之外,没有什么改变。这是一堂课:

代码语言:javascript
复制
public class LevelFilterParameters {
  public FilterViewTypes FilterType { get; set; }
  public string ParentID { get; set; }
  public FilterSelections Filters { get; set; }
}

下面是更新的javascript调用:

代码语言: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

就像冠军一样。谢谢你凯尔。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40361886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档