2008-12-05 16 views
10

Estoy buscando información sobre enrutamiento en MVC con C#. Actualmente soy muy consciente de los conceptos básicos de enrutamiento en MVC, pero lo que estoy buscando es algo difícil de encontrar.Enrutamiento MVC - Pregunta de nombres de parámetros

Efectivamente, lo que quiero encontrar es una forma de definir una ruta única que tome un solo parámetro.

Los ejemplos comunes que he encontrado en línea se basa en el ejemplo

routes.MapRoute(
    "Default", 
    "{controller}.mvc/{action}/{id}" 
    new { controller = "Default", action="Index", id=""}); 

Mediante la cartografía de esta ruta, puede asignar a cualquier acción en cualquier controlador, pero si quieres pasar nada en la acción, el parámetro de método debe llamarse "id". Quiero encontrar una forma de evitar esto si es posible, para no tener que especificar rutas constantemente solo para usar un nombre de parámetro diferente en mis acciones.

¿Alguien tiene alguna idea o ha encontrado una forma de evitar esto?

Respuesta

0

Es posible construir las rutas como quiera

routes.MapRoute(
    "Default", 
    "{controller}.mvc/{action}/{param1}/{param2}/{param3}" 
    new { controller = "Default", action="Index", param1="", param2="", param3=""}); 

Además, look at this post, que contiene todo tipo de muestras en la sección de comentarios

+1

Un poco perdiendo el punto ... que quiere tener básicamente {controlador} .mvc/{acción}/{*} donde estrella es cualquier nombre de parámetro. –

+0

Sí, gracias Timothy. Eso es correcto. Tal vez no dije la pregunta muy bien. – Jimmeh

+0

No estoy seguro de lo que quiere, quizás puede intentar usar * Para cada valor En requestContext.RouteData.Values ​​* y ellos quering * value.Key * y * value.Value * –

5

no creo que se puede hacer exactamente lo que está preguntando. Cuando MVC invoca una acción, busca parámetros en las rutas, solicita parámetros y la cadena de consulta. Siempre busca coincidir con el nombre del parámetro.

Quizás una buena cadena de consulta antigua satisfaga sus necesidades.

~/mycontroller/myaction/?foobar=123 

123 pasará a esta acción:

public ActionResult MyAction(int? foobar) 
3

Sé que esto es de hace siglos, pero espero que todavía ayuda a alguien. Hice la misma pregunta antes. Creo que esto es lo que estás buscando. Una respuesta citada de mi pregunta: "El bit {* pathInfo} se llama slug. Básicamente es un comodín que dice" todo después de que este punto se rellena en un parámetro llamado pathInfo ". Por lo tanto, si tiene" {resource} .axd/{* pathInfo} "y una url como esta: http://blah/foo.axd/foo/bar/baz/bing luego se crean dos parámetros, uno llamado resource, que contendría foo y otro llamado pathInfo que contiene foo/bar/baz/bing."

+0

No es realmente una respuesta a la pregunta, pero +1 para the * -option – mhu

7

Si usted quiere tener un nombre de parámetro diferente y mantener la misma variable de enrutamiento, utilice el FromUri atributo de este modo:

public ActionResult MyView([FromUri(Name = "id")] string parameterThatMapsToId) 
{ 
    // do stuff 
} 

En sus rutas, todo lo que necesita es:

routes.MapRoute(
    "Default", 
    "{controller}.mvc/{action}/{id}" 
    new { controller = "Default", action="Index", id=""}); 
+0

¿No es solo para Web API, no MVC? – SilverlightFox

+0

@SilverlightFox tienes razón, desafortunadamente, solo api web. Parece que mvc 5 tiene un enrutamiento de atributos que podría ayudar. – Curtis

0

Aunque todavía no puede usar el atributo FromUri, puede utilizar el atributo Route, como

[Route("~/Policy/PriorAddressDelete/{sequence}")] 
public ActionResult PriorAddressDelete(int sequence) 
{ 
    Policy.RemoveScheduledPriorAddressItem(sequence); 
    return RedirectToAction("Information", new { id = Policy.Id }); 
} 

Técnicamente esto agrega una nueva ruta, pero al menos no satura su routeconfig. Pone la definición de ruta justo donde se usa, lo cual me gusta (menos buscar cosas).

Recuerde, con el fin de utilizar atributos de enrutamiento, este debe estar en el archivo de routeconfig anteriores sus rutas definidas:

routes.MapMvcAttributeRoutes(); 
Cuestiones relacionadas