8

ここで説明されている OData 規則を使用せずに、クエリ文字列パラメーターを ASP.NET MVC4 Web Api コントローラーに渡す方法はありますか?

http://www.asp.net/web-api/overview/web-api-routing-and-actions/paging-and-querying

IQueryable をサポートしない Dapper を使用して構築されたいくつかのリポジトリ メソッドがあり、OData 規則を使用せずに手動でページ分割できるようにしたいのですが、従来の ASP.NET の方法で実行しようとすると、「ルートが見つかりません」というエラーが発生します。

たとえば、ルートは次のとおりです。

context.Routes.MapHttpRoute(
           name: "APIv1_api_pagination",
           routeTemplate: "api/v1/{controller}/{id}",
           defaults: new { area = AreaName, controller = "category", offset = 0, count = 100});

そして、これが一致する署名です

public class CategoryController : ApiController
{
    // GET /api/<controller>
    public HttpResponseMessage Get(int id, int offset = 0, int count = 0)

そして、次のクエリを渡すたびに:

http://localhost/api/v1/category/1?offset=10

次のエラーが表示されます。

要求に一致するコントローラー「カテゴリー」でアクションが見つかりませんでした。

ASP.NET MVC4 Web Api でクエリ文字列を正常に操作する方法について何か提案はありますか?

4

2 に答える 2

11

クエリ文字列の使用を開始すると、実際にはパラメーターを使用してコントローラーの正確なメソッドを呼び出します。ルーターを次のように変更することをお勧めします。

context.Routes.MapHttpRoute(
       name: "APIv1_api_pagination",
       routeTemplate: "api/v1/{controller}/{action}/{id}",
       defaults: new { area = AreaName, controller = "category", offset = 0, count = 100});

次に、メソッドを次のように変更します

public HttpResponseMessage Items(int id, int offset = 0, int count = 0);

これからは、次のようにクエリするたびに

http://localhost/api/v1/category/Items?id=1&offset=10&count=0

それは実行されます。

これを書いているときに別の方法が頭に浮かびました。うまくいくかどうかわかりませんが、ルーターを次のように変更してみてください

context.Routes.MapHttpRoute(
       name: "APIv1_api_pagination",
       routeTemplate: "api/v1/{controller}/{id}/{offset}/{count}",
       defaults: new { area = AreaName, controller = "category", offset = RouteParameter.Optional, count = RouteParameter.Optional});
于 2012-06-05T09:27:06.790 に答える
3

この場合、私が直面していた問題は、WebApi コントローラー インスタンスで GET に複数のオーバーロードがあったという事実でした。それらを削除すると (そして、すべてを 1 つの Get メソッドに凝縮し、オプションのパラメーターとメソッド自体の内部に制御フローを追加すると)、すべてが期待どおりに機能しました。

于 2012-06-10T19:32:29.953 に答える