2016-11-01 10 views
1

を投稿するWebAPIの2及びRouteAttributeを使用するために、次のように私は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 

クライアントコール:

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

そして私は原始的なオブジェクトとすることを行っている:

$.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を渡すことができます知っています。しかし、実際の署名は次のようにする必要があります。

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

ここで、filterTypeは列挙型で、filtersは配列を持つ複雑なオブジェクトです。

私はここでインターネット上のすべての記事にする必要があり、何も成功していないことを試みた。私は近くにいなければならないか、パラメータのないバージョンは動作しません。私のすべてのプロパティがプリミティブなオブジェクトであれば、それらをURLに貼り付けるだけです。

どのようにして複数の複雑なオブジェクトをクライアント側からWeb API 2コントローラに渡すことができますか。これはMVC 5のWebサイトです。

答えて

1

さて、友人に電話して分かりました。

明らかに、WebAPI経由で1つの(1、Uno、Hana、Single)複雑なオブジェクトだけを渡すことができます。だから私は3つの目的のパラメータを単一のオブジェクト(モデル)にラップし、それを長く渡しました。 ajax呼び出しでWebAPI署名プロパティ名を渡す必要はありません。私のプロパティはinputと呼ばれていますが、以下のajaxコールには含まれていません。私はLevelFilterParametersと呼ばれ、私のModelフォルダに配置1への3つのパラメータをマージする以外に変更

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

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

ナッシング:だから、あなたが一緒に最初から以下のことができます

は、ここで更新WebAPIのコントローラです。ここでは、そのクラスがある:チャンピオンのような

$.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 

作品:

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

ここで更新されたJavaScriptの呼び出しがあります。ありがとう、カイル。

関連する問題