2012-09-27 17 views
24

Sto provando a configurare il routing nel mio progetto WebCI MVC4.Routing basato sul nome parametro stringa di query

Voglio essere in grado di cercare i prodotti in base al loro nome o il loro tipo in questo modo:

/api/products?name=WidgetX - restituisce tutti i prodotti denominati WidgetX /api/products?type=gadget - restituisce tutti i prodotti di tipo gadget

I percorsi sono configurato in questo modo:

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

il problema è che il nome del parametro di stringa di query sembra essere ignorato in modo che il primo percorso è sempre quello utilizzato, a prescindere il nome del parametro della stringa di query. Come posso modificare il percorso per farlo correttamente?

risposta

30

Quello che vi serve è solo un solo percorso di seguito perché stringa di query non viene utilizzato come parametri di instradamento:

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

E, quindi definire due metodi come di seguito:

GetProductsByName(string name) 
{} 

GetProductsByType(string type) 
{} 

Routing meccanismo è intelligente abbastanza per indirizzare l'url all'azione corretta in base al nome della stringa di query, lo stesso con i parametri di input. Naturalmente su tutti i metodi con prefisso sono Get

Potrebbe essere necessario leggere questo: http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-and-action-selection

0

provare a cambiare string.Empty per RouteParameter.Optional

+0

RouteParameter mi renderebbe utilizzare gli URL come/prodotti/ABC che non sarebbe ovviamente soddisfare il requisito. Devo essere in grado di utilizzare i parametri della stringa di query. – rickythefox

4

Non è necessario includere i parametri di query del percorso. Ci dovrebbe essere solo una mappa del percorso semplice per coprire i metodi HTTP su tutti i ApiControllers:

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

L'unica volta che è necessario regolare i percorsi è che se si desidera spostare un parametro nel percorso reale, che si non sembra che stia facendo Quindi il metodo GET http per la ricerca di due campi potrebbe essere:

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

Se si desidera cercare in modo esplicito da un campo in un momento allora si dovrebbe pensare di utilizzare i controller diversi per scopi diversi. Vale a dire, un SearchProductByTypeController che ha un singolo metodo Get(string type). Il percorso sarebbe quindi/api/SearchProductByTypeController? Type = gadget

+0

Grazie, a volte il problema non è nel codice ma nell'architettura. ;) – rickythefox

+1

Che tipo di risorsa è un 'SearchProductByTypeController'? : P –

0

Sei sicuro che i controller siano ok? Voglio dire, il nome dei param.

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

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