26

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

名前や種類に基づいて商品を検索できるようにしたいと思います。

/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 }
);

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

4

4 に答える 4

31

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

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

次に、次のような2つのメソッドを定義します。

GetProductsByName(string name)
{}

GetProductsByType(string type)
{}

ルーティングメカニズムは、入力パラメータと同じかどうかに関係なく、クエリ文字列の名前に基づいてURLを正しいアクションにルーティングするのに十分スマートです。もちろん、接頭辞が付いているすべてのメソッドはGet

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

于 2012-09-27T11:23:43.930 に答える
5

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

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

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

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

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

于 2012-09-27T11:04:39.223 に答える
0

に変更string.EmptyしてみてくださいRouteParameter.Optional

于 2012-09-27T10:56:32.143 に答える
0

コントローラに問題がないことを確認しますか?つまり、パラメータの名前です。

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

    public string GetProductsByType(string type)
    {
        return "Requested type: " + type;
    }
于 2012-09-27T11:06:11.423 に答える