2012-06-05 9 views
7

Esiste un modo per passare i parametri di querystring a un controller ASP.NET MVC4 Web Api senza utilizzare le convenzioni OData descritte qui?Passare i parametri di querystring senza utilizzare le convenzioni OData?

http://www.asp.net/web-api/overview/web-api-routing-and-actions/paging-and-querying

devo alcuni metodi di repository costruiti usando Dapper che non supportano IQueryable e vogliono essere in grado di impaginare manualmente senza utilizzare le convenzioni OData, ma ogni volta che provo a farlo il modo in cui ASP.NET tradizionale Ottengo errori "route not found".

Per esempio, ecco un itinerario:

context.Routes.MapHttpRoute(
      name: "APIv1_api_pagination", 
      routeTemplate: "api/v1/{controller}/{id}", 
      defaults: new { area = AreaName, controller = "category", offset = 0, count = 100}); 

Ed ecco la firma per abbinare

public class CategoryController : ApiController 
{ 
    // GET /api/<controller> 
    public HttpResponseMessage Get(int id, int offset = 0, int count = 0) 

E ogni volta che mi passa la seguente query:

http://localhost/api/v1/category/1?offset=10

ottengo il seguente errore:

No action was found on the controller 'Category' that matches the request.

Qualche suggerimento su come utilizzare correttamente querystrings in ASP.NET MVC4 Web Api?

+1

Credo che questo potrebbe essere un bug in WebAPI. Puoi provare a cambiare il parametro del tuo metodo di azione per non avere valori predefiniti (ed emettere una richiesta con tutti i valori richiesti nella stringa della query). – marcind

+0

Sicuramente Marcind, darò una prova. – Aaronontheweb

risposta

2

In questo caso, la questione stavo correndo in è stato il fatto che ho avuto più sovraccarichi per ottenere sulla mia istanza del controller WebAPI. Quando ho rimosso quelli (e ridotto tutto a un metodo Get con più parametri opzionali e controllo-flusso all'interno del metodo stesso), tutto ha funzionato come previsto.

10

Quando si inizia a utilizzare querystring, si chiama effettivamente il metodo del controller con i relativi parametri. Quello che preferisco di cambiare il router come:

context.Routes.MapHttpRoute(
     name: "APIv1_api_pagination", 
     routeTemplate: "api/v1/{controller}/{action}/{id}", 
     defaults: new { area = AreaName, controller = "category", offset = 0, count = 100}); 

e quindi modificare il metodo in

public HttpResponseMessage Items(int id, int offset = 0, int count = 0); 

D'ora in poi ogni volta che si esegue una query come

http://localhost/api/v1/category/Items?id=1&offset=10&count=0 

verrà eseguito.

Un altro metodo mi è venuto in mente mentre scrivevo questo. Non so se funziona, ma cercare di cambiare il router come

context.Routes.MapHttpRoute(
     name: "APIv1_api_pagination", 
     routeTemplate: "api/v1/{controller}/{id}/{offset}/{count}", 
     defaults: new { area = AreaName, controller = "category", offset = RouteParameter.Optional, count = RouteParameter.Optional}); 
+0

In realtà ho usato la seconda opzione e funziona, ma rende l'URI non intuitivo e non "hackerabile" – Aaronontheweb

Problemi correlati