web-dev-qa-db-ja.com

クエリ文字列パラメーター名に基づくルーティング

MVC4 WebAPIプロジェクトでルーティングを構成しようとしています。

名前やタイプに基づいて製品を検索できるようにしたい:

/api/products?name=WidgetX-WidgetXという名前のすべての製品を返します/api/products?type=gadget-ガジェットタイプのすべての製品を返します

ルートは次のように構成されます。

config.Routes.MapHttpRoute(
    name: "Get by name",
    routeTemplate: "api/products/{name}",
    defaults: new { controller = "ProductSearchApi", action = "GetProductsByName", name = string.Empty }
);

config.Routes.MapHttpRoute(
    name: "Get by type",
    routeTemplate: "api/products/{type}",
    defaults: new { controller = "ProductSearchApi", action = "GetProductsByType", type = string.Empty }
);

問題は、クエリ文字列パラメータの名前が無視されるように見えるため、クエリ文字列パラメータの名前に関係なく、最初のルートが常に使用されることです。ルートを修正して正しく設定するにはどうすればよいですか?

25
rickythefox

必要なのは、クエリ文字列がルーティングパラメータとして使用されないため、以下の1つのルートのみです。

config.Routes.MapHttpRoute(
    name: "Get Products",
    routeTemplate: "api/products",
    defaults: new { controller = "ProductSearchApi" }
);

そして、以下のような2つのメソッドを定義します。

GetProductsByName(string name)
{}

GetProductsByType(string type)
{}

ルーティングメカニズムはsmartであり、入力パラメーターと同じかどうかにかかわらず、クエリ文字列の名前に基づいてURLを正しいアクションにルーティングします。もちろん、接頭辞を持つすべてのメソッドはGetです

これを読む必要があるかもしれません: http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-and-action-selection

30
cuongle

ルートにクエリパラメータを含める必要はありません。すべてのApiControllerでHttpメソッドをカバーするために、単純なルートマップが1つだけあるはずです。

_routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);
_

ルートを調整する必要があるのは、実際には実行していないように見えるパラメータを実際のパスに移動する場合のみです。次に、2つのフィールドで検索するGET httpメソッドは次のようになります。

_public IEnumerable<Product> Get(string name, string type){
    //..your code will have to deal with nulls of each parameter
}
_

一度に1つのフィールドで明示的に検索する場合は、異なる目的で異なるコントローラーを使用することを検討する必要があります。つまり、単一のGet(string type)メソッドを持つSearchProductByTypeControllerです。ルートは/ api/SearchProductByTypeController?type = gadgetになります

4
Nick

コントローラーは大丈夫ですか?つまり、パラメータの名前。

    public string GetProductsByName(string name)
    {
        return "Requested name: " + name;
    }

    public string GetProductsByType(string type)
    {
        return "Requested type: " + type;
    }
0
laszlokiss88

string.EmptyRouteParameter.Optionalを変更してみてください

0
hagensoft