2011-09-22 20 views
35

Necesito una implementación en la que pueda obtener infinitos parámetros en mi controlador ASP.NET. Será mejor si te doy un ejemplo:Infinite URL Parameters para ASP.NET MVC Route

Supongamos que tendré siguientes direcciones:

example.com/tag/poo/bar/poobar 
example.com/tag/poo/bar/poobar/poo2/poo4 
example.com/tag/poo/bar/poobar/poo89 

Como se puede ver, se pondrá número infinito de etiquetas después de example.com/tag/ y la barra será una delimitador aquí.

En el controlador me gustaría hacer esto:

foreach(string item in paramaters) { 

    //this is one of the url paramaters 
    string poo = item; 

} 

¿Hay alguna manera conocida para lograr esto? ¿Cómo puedo llegar a los valores del controlador? Con Dictionary<string, string> o List<string>?

NOTA:

La pregunta no está bien explicado OMI, pero hice mi mejor esfuerzo para adaptarse a él. . en Siéntase libre de modificarlo

Respuesta

54

De esta manera:

routes.MapRoute("Name", "tag/{*tags}", new { controller = ..., action = ... }); 

ActionResult MyAction(string tags) { 
    foreach(string tag in tags.Split("/")) { 
     ... 
    } 
} 
+1

hmm, parece tan ordenado. Lo voy a intentar. – tugberk

+0

¿cuál es la función de {* tags} allí? Especialmente, *. – tugberk

+7

Eso es un parámetro catch-all. http://msdn.microsoft.com/en-us/library/cc668201.aspx#handling_a_variable_number_of_segments_in_a_url_pattern – SLaks

25

La captura todo lo que le dará a la cadena de texto. Si desea una forma más elegante de manejar los datos, siempre puede usar un manejador de ruta personalizado.

public class AllPathRouteHandler : MvcRouteHandler 
{ 
    private readonly string key; 

    public AllPathRouteHandler(string key) 
    { 
     this.key = key; 
    } 

    protected override IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     var allPaths = requestContext.RouteData.Values[key] as string; 
     if (!string.IsNullOrEmpty(allPaths)) 
     { 
      requestContext.RouteData.Values[key] = allPaths.Split('/'); 
     } 
     return base.GetHttpHandler(requestContext); 
    } 
} 

Registre la ruta del controlador.

routes.Add(new Route("tag/{*tags}", 
     new RouteValueDictionary(
       new 
       { 
        controller = "Tag", 
        action = "Index", 
       }), 
     new AllPathRouteHandler("tags"))); 

Obtenga las etiquetas como una matriz en el controlador.

public ActionResult Index(string[] tags) 
{ 
    // do something with tags 
    return View(); 
} 
5

Sólo en caso de que alguien está llegando a esto con MVC en .NET 4.0, hay que tener cuidado donde a definir sus rutas. Fui felizmente a global.asax y agregué las rutas como se sugiere en estas respuestas (y en otros tutoriales) y no llegué a ninguna parte. Mis rutas todas de manera predeterminada a {controller}/{action}/{id}. Agregar más segmentos a la URL me dio un error 404. Luego descubrí el archivo RouteConfig.cs en la carpeta App_Start. Resulta que este archivo es llamado por global.asax en el método Application_Start(). Por lo tanto, en .NET 4.0, asegúrese de agregar allí sus rutas personalizadas. This article lo cubre maravillosamente.

Cuestiones relacionadas