2012-06-05 14 views
7

¿Hay alguna forma de pasar los parámetros de la cadena de consulta a un controlador ASP.NET MVC4 Web Api sin utilizar las convenciones OData descritas aquí?¿Pasar los parámetros de la cadena de consulta sin utilizar las convenciones de OData?

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

que tienen algunos métodos de depósito construyen utilizando apuesto que no soportan IQueryable y quieren ser capaces de paginar manualmente sin necesidad de utilizar las convenciones OData, pero cada vez que intento hacerlo de la manera tradicional de ASP.NET Obtengo errores de "ruta no encontrada".

Por ejemplo, aquí es una ruta:

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

Y aquí está la firma para que coincida con

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

Y cuando paso la siguiente consulta:

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

consigo el siguiente error:

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

¿Alguna sugerencia sobre cómo trabajar con querystrings sanely en ASP.NET MVC4 Web Api?

+1

Creo que esto podría ser un error en WebAPI. ¿Podría intentar cambiar su parámetro de método de acción para no tener valores predeterminados (y emitir una solicitud con todos los valores requeridos en la cadena de consulta). – marcind

+0

Sure marcind, voy a intentar esto. – Aaronontheweb

Respuesta

2

En este caso, la cuestión estaba corriendo en el hecho de que tuve múltiples sobrecargas para recibir en mi instancia del controlador WebAPI. Cuando los eliminé (y condensé todo en un método Get con más parámetros opcionales y flujo de control dentro del método mismo) todo funcionó como se esperaba.

10

Cuando empiezas a usar la cadena de consulta, en realidad llamas al método exacto del controlador con sus parámetros. Lo que prefiero cambiar el router como:

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

y luego cambia de método en

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

A partir de ahora cada vez que se consulta como

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

se ejecutará.

Me vino a la mente otro método mientras escribía esto. No sé si funciona, pero tratar de cambiar su router como

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

De hecho, utilicé la segunda opción y funciona, pero hace que los URIs no sean intuitivos y no "pirateables" – Aaronontheweb

Cuestiones relacionadas