2012-03-30 43 views
7

Let decir que tengo dos métodos en MVC controlador de API 4 Web:parámetros de URL en MVC 4 Web API

public IQueryable<A> Get() {} 

Y

public A Get(int id) {} 

y la siguiente ruta:

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

Esto funciona como se esperaba Adición de una un parámetro más, por ejemplo:

public IQueryable<A> Get(int p) {} 

public A Get(int id, int p) {} 

conduce a la situación cuando MVC devuelve 404 para la petición siguiente:

GET /controller?p=100 

O

GET /controller/1?p=100 

con el mensaje "No se encontró acción en el controlador 'controlador' que coincide con la solicitud "

Espero que la URL parame ters deben ser conectados por MVC sin problemas, pero no es cierto. ¿Es esto un error o una mala interpretación de cómo los mapas MVC solicitan acción?

+0

[aquí] (http: // foros. asp.net/t/1774984.aspx/2/10) se describe el mismo problema, pero sin ninguna conclusión se espera este comportamiento –

+0

PS. debido al mismo problema, la sintaxis de OData en URL no funcionará si hay más de un método asignado al verbo HTTP. –

+0

¿Puedes mostrar tu ruta real y todos los métodos y firmas en tu controlador? –

Respuesta

8

Si piensa qué está intentando hacer y las rutas que intenta, se dará cuenta de que el segundo parámetro "p" en su caso también debe marcarse como un parámetro opcional.

que es su ruta debería definirse así:

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

Una vez hecho esto, la URL

/controlador p = 100 proyectará los

public IQueryable<A> Get(int p) {} 

? método y una URL como así:

/controller/1?p=100 

se asignarán a su método de

public A Get(int id, int p) {} 

, como se esperaba.

Para responder a sus preguntas ... no, esto no es un error, sino que está diseñado/esperado.

+0

Esto está bien, pero por lo que recuerdo cuando hace algún tiempo usé MVC 2, la forma común es simplemente especificar los parámetros del método, sin tocar la ruta. Ejemplo: [aquí] (http://stackoverflow.com/questions/627838/asp-net-mvc-getting-querystring-values) - y MVC debería llevar a cabo el trabajo de cableado de la parte de consulta de la URL para ingresar los parámetros. –

+0

@pborovik, Como dije antes, "si lo piensas", te darás cuenta de que debes especificar que el segundo parámetro también es opcional. No puede decir que el primer parámetro es opcional, pero el segundo no. Simplemente no tiene sentido. –

+0

@pborovik si definió "sobrecargas" para estos métodos, entonces el controlador API enviará a esos métodos en el caso de que no se proporcione el segundo parámetro. Pero en su caso solo tiene los dos métodos, por lo que el despachador no puede enviarse a ningún método de acción. –

0

En el WebApiConfig añadir nuevos valores predeterminados para la httproute

RouteParameter.Optional para las rutas adicionales que no funcionó para mí

config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}/{voucher}", 
      defaults: new { id = RouteParameter.Optional ,defaultroute1="",defaultroute2=""} 
     ); 
Cuestiones relacionadas