2011-09-22 4 views
35

J'ai besoin d'une implémentation où je peux obtenir des paramètres infinis sur mon contrôleur ASP.NET. Ce sera mieux si je vous donne un exemple:Paramètres d'URL infinis pour ASP.NET MVC Route

Supposons que je vais avoir urls suivantes:

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

Comme vous pouvez le voir, il obtiendra nombre infini de balises après example.com/tag/ et slash sera un délimiteur ici.

Sur le contrôleur, je voudrais faire:

foreach(string item in paramaters) { 

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

} 

Y at-il moyen connu pour y parvenir? Comment puis-je atteindre les valeurs du contrôleur? Avec Dictionary<string, string> ou List<string>?

REMARQUE:

La question n'est pas bien expliqué l'OMI, mais j'ai essayé de mon mieux pour l'adapter. . dans Ne hésitez pas à ruser

Répondre

54

Comme ceci:

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

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

hmm, semble tellement soignée. Je vais essayer. – tugberk

+0

Quel est le rôle de {* tags} là-bas? Notamment, *. – tugberk

+7

C'est un paramètre fourre-tout. http://msdn.microsoft.com/en-us/library/cc668201.aspx#handling_a_variable_number_of_segments_in_a_url_pattern – SLaks

25

Le fourre-tout vous donnera la chaîne brute. Si vous souhaitez une manière plus élégante de gérer les données, vous pouvez toujours utiliser un gestionnaire d'itinéraire personnalisé.

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); 
    } 
} 

Enregistrez le gestionnaire d'itinéraire.

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

Récupère les variables sous forme de tableau dans le contrôleur.

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

Juste au cas où quelqu'un vient à cela avec MVC dans .NET 4.0, vous devez être prudent vous définissez vos itinéraires. J'allais heureusement à global.asax et en ajoutant des routes comme suggéré dans ces réponses (et dans d'autres tutoriels) et n'obtenant nulle part. Mes itinéraires ont tous par défaut {controller}/{action}/{id}. Ajouter d'autres segments à l'URL m'a donné une erreur 404. Puis j'ai découvert le fichier RouteConfig.cs dans le dossier App_Start. Il s'avère que ce fichier est appelé par global.asax dans la méthode Application_Start(). Ainsi, dans .NET 4.0, assurez-vous d'y ajouter vos routes personnalisées. This article le couvre magnifiquement.