2012-09-27 16 views
24

MVC4 WebAPIプロジェクトでルーティングを設定しようとしています。クエリ文字列パラメータ名に基づくルーティング

が、私は自分の名前やそのような彼らのタイプに基づいて製品を検索することができるようにしたい:

/api/products?name=WidgetX - WidgetX /api/products?type=gadgetという名前のすべての製品を返す - ルートがある

型ガジェットのすべての製品を返します。

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

答えて

30

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

GetProductsByName(string name) 
{} 

GetProductsByType(string type) 
{} 

ルーティング:以下のような2つのメソッドを定義し、その後

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

そして、メカニズムはスマートあなたの正しいアクションにあなたのURLをルーティングするのに十分なクエリ文字列の名前に基づいて入力パラメータと同じかどうか。 http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-and-action-selection

0

は、あなたがルートであなたのクエリパラメータを含める必要はありませんRouteParameter.Optional

+0

RouteParameterは私のコースの要件を満たしていないだろう/製品/ ABCのようなURLを使用するだろう:もちろん接頭辞を持つすべてのメソッドにGet

は、あなたがこれを読んでする必要があるかもしれませんです。私は、クエリ文字列パラメータを使用できるようにする必要があります。 – rickythefox

4

ためstring.Emptyを変更してみてください。あなただけのApiControllersのすべてのHTTPメソッドをカバーする一つの簡単なルートマップがあるはずです:

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 
} 

あなたが明示的に一度に一つのフィールドで検索する場合、あなたは異なる目的のために異なるコントローラを使用して考えなければなりません。すなわち、単一のGet(string type)方法を有するSearchProductByTypeControllerである。そのルートは/ api/SearchProductByTypeControllerですか?type = gadget

+0

ありがとう、ときには、問題はコードではなくアーキテクチャにあります。 ;) – rickythefox

+1

'SearchProductByTypeController'はどのようなリソースですか? :P –

0

コントローラは大丈夫ですか?私は、paramsの名前を意味します。

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

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