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
Comme ça:
routes.MapRoute("Name", "tag/{*tags}", new { controller = ..., action = ... });
ActionResult MyAction(string tags) {
foreach(string tag in tags.Split("/")) {
...
}
}
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();
}
Cela s'appelle fourre-tout :
tag/{*tags}
Juste au cas où quelqu'un viendrait à cela avec MVC dans .NET 4.0, vous devez faire attention où 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.