2012-09-27 24 views
24

MVC4 WebAPI projemde yönlendirmeyi yapılandırmaya çalışıyorum.Sorgu dizesi parametre adı temelinde yönlendirme

Ben kendi adına ya da öylesine gibi onların türüne göre ürünler için arama yapabilmek istiyorum:

/api/products?name=WidgetX - WidgetX /api/products?type=gadget adlı tüm ürünlerini döndürür - yolları vardır

tipi gadget tüm ürünleri döndürür böyle yapılandırılmış:

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

sorun sorgu dizesi parametresi adı ilk güzergah kullanılır hep bu yüzden ne olursa olsun, ihmal gibi görünüyor olmasıdır sorgu dizesi parametresinin adı. Doğru yapmak için rotamı nasıl değiştirebilirim?

cevap

30

sorgu dizesi yönlendirme parametreleri olarak kullanılmaz çünkü sadece tek rota altındadır gerekenler:

GetProductsByName(string name) 
{} 

GetProductsByType(string type) 
{} 

Yönlendirme: Aşağıdaki gibi iki yöntem tanımlamak ardından

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

Ve mekanizma, giriş parametrelerinizle aynı olup olmadığına bakılmaksızın, sorgu dizgisinin adına göre URL'nizi doğru eyleminize yönlendirmek için akıllı akıllıdır. Tabii ön ekiyle tüm yöntemler

Get vardır üzerinde bu salt gerekebilir: http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-and-action-selection

0

Sen rotada sorgu parametreleri dahil gerekmez RouteParameter.Optional

+0

RouteParameter beni tabii ihtiyacını karşılamak olmaz ürünler/abc/gibi bir URL ile kullanmak olur. Sorgu dizesi parametrelerini kullanabilmem gerekir. – rickythefox

4

için string.Empty değiştirmeyi deneyin. Yalnızca ApiControllers tümü üzerinde HTTP Yöntemleri kapsayacak şekilde basit bir yol haritası olmalıdır:

Eğer gerçek yoluna bir parametre taşımak istiyorsanız
routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

rotaları ayarlamanız gereken sadece zaman hangi sen Yapmıyor gibisin. Sonra GET http yöntemi olurdu iki alana göre arama:

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

açıkça o zaman farklı amaçlar için farklı kontrolcü kullanılarak düşünmek gerekir her seferinde bir alana göre arama yapmak istiyorsanız. Yani, tek bir Get(string type) yöntemine sahip SearchProductByTypeController. Rota daha sonra/api/SearchProductByTypeController? Type = aygıt

+0

Teşekkürler, bazen sorun kodda değil, mimaride. ;) – rickythefox

+1

'SearchProductByTypeController' nedir? : P –

0

Denetleyicilerin iyi olduğundan emin misiniz? Yani, paramların adı.

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

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