我有一个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网站。
答案 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
像冠军一样工作。谢谢凯尔。