web-dev-qa-db-fra.com

Paramètres d'URL infinis pour la route ASP.NET MVC

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:

Supposons que j'aurai les URL 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 un nombre infini de balises après example.com/tag/ et la barre oblique seront un délimiteur ici.

Sur le contrôleur, je voudrais faire ceci:

foreach(string item in paramaters) { 

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

}

Existe-t-il un moyen connu d'y parvenir? Comment puis-je obtenir les valeurs du contrôleur? Avec Dictionary<string, string> ou List<string>?

REMARQUE:

La question n'est pas bien expliquée à l'OMI mais j'ai fait de mon mieux pour l'adapter. . N'hésitez pas à le modifier

38
tugberk

Comme ça:

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

ActionResult MyAction(string tags) {
    foreach(string tag in tags.Split("/")) {
        ...
    }
}
58
SLaks

Le catch all 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")));

Obtenez les balises sous forme de tableau dans le contrôleur.

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

Cela s'appelle fourre-tout :

tag/{*tags}
12
Anton Gogolev

Juste au cas où quelqu'un viendrait à cela avec MVC dans .NET 4.0, vous devez faire attention vous définissez vos itinéraires. J'allais avec plaisir à global.asax Et j'ajoutais des itinéraires comme suggéré dans ces réponses (et dans d'autres tutoriels) et je n'arrivais nulle part. Mes itinéraires ont tous par défaut été {controller}/{action}/{id}. L'ajout de segments supplémentaires à l'URL m'a donné une erreur 404. Ensuite, 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(). Donc, dans .NET 4.0, assurez-vous d'y ajouter vos itinéraires personnalisés. Cet article le couvre magnifiquement.

5
DavidHyogo