10 votes

Asp.Net MVC - Meilleure approche pour le routage "dynamique"

Je suis en train d'essayer de trouver une approche pour créer un routage "dynamique". Ce que je veux dire, c'est que je veux pouvoir attribuer le contrôleur et l'action d'une route pour chaque requête plutôt que de les mapper directement.

Par exemple, une route peut ressembler à ceci "chemin/{objet}" et lorsqu'elle est atteinte, une recherche est effectuée pour fournir le contrôleur / l'action approprié(e) à appeler.

J'ai essayé de découvrir les mécanismes pour créer un gestionnaire de route personnalisé, mais la documentation / la découvrabilité est un peu floue pour le moment (je sais, c'est une version bêta - je ne m'attendrais pas à plus). Cependant, je ne suis pas sûr que ce soit la meilleure approche et peut-être qu'une usine de contrôleurs ou même un contrôleur / action par défaut qui effectue toutes les correspondances pourrait être la meilleure voie (sans jeu de mots).

Tout conseil serait apprécié.

3voto

Szymon Sasin Points 418

Vous pouvez toujours utiliser une syntaxe catch all (je n'ai aucune idée si le nom est correct).

Route: routeTable.MapRoute( "Chemin", "{*chemin}", new { controller = "Pages", action = "Chemin" });

L'action du contrôleur est définie comme suit : public ActionResult Chemin(string chemin)

Dans l'action du contrôleur, vous aurez un chemin, il vous suffit donc de le diviser et de l'analyser.

Pour appeler un autre contrôleur, vous pouvez utiliser une RedirectToAction (je pense que c'est une manière plus appropriée). Avec la redirection, vous pouvez mettre en place une redirection permanente pour cela. Ou utilisez quelque chose comme ça :

internal class MVCTransferResult : RedirectResult
    {
        public MVCTransferResult(string url) : base(url) 
        {
        }
        public MVCTransferResult(object routeValues) 
                : base(GetRouteURL(routeValues))
        {
        }

        private static string GetRouteURL(object routeValues)
        {
            UrlHelper url = new UrlHelper(
                new RequestContext(
                        new HttpContextWrapper(HttpContext.Current),
                        new RouteData()),
                        RouteTable.Routes);
            return url.RouteUrl(routeValues);
        }

        public override void ExecuteResult(ControllerContext context)
        {
            var httpContext = HttpContext.Current;

            // ASP.NET MVC 3.0
            if (context.Controller.TempData != null &&
                context.Controller.TempData.Count() > 0)
            {
                throw new ApplicationException(
                     "TempData ne fonctionnera pas avec Server.TransferRequest!");
            }
            // change to false to pass query string parameters 
            // if you have already processed them
            httpContext.Server.TransferRequest(Url, true);

            // ASP.NET MVC 2.0
            //httpContext.RewritePath(Url, false);
            //IHttpHandler httpHandler = new MvcHttpHandler();
            //httpHandler.ProcessRequest(HttpContext.Current);
        }
    }

Cependant, cette méthode nécessite de s'exécuter sur IIS ou un IIS Express, Casinni ne prenant pas en charge la méthode Server.Transfer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X