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



exemple asp net mvc (1)

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

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

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

Dans l'action pour le contrôleur, vous aurez un chemin, alors il suffit de le renverser et d'analyser.

Pour appeler un autre contrôleur, vous pouvez utiliser un RedirectToAction (je pense que c'est plus correct). Avec la redirection, vous pouvez configurer une redirection permanente pour cela. Ou utilisez un 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 won't work with 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 sur un IIS Expres Casinni ne supporte pas une méthode Server.Transfer

J'essaie de trouver une approche pour créer un routage "dynamique". Ce que je veux dire, exactement, c'est que je veux pouvoir assigner le contrôleur et l'action d'une route pour chaque coup plutôt que de l'assigner directement.

Par exemple, une route peut ressembler à ceci "chemin / {objet}" et lorsque ce chemin est atteint, une recherche est effectuée fournissant le contrôleur / action approprié à appeler.

J'ai essayé de découvrir les mécanismes de création d'un gestionnaire d'itinéraire personnalisé, mais la documentation / découvrabilité est un peu louche en ce moment (je sais, sa version bêta - je n'en attendrais plus). Bien que, je ne suis pas sûr si c'est même la meilleure approche et peut-être une usine de contrôleur ou même un contrôleur / action par défaut qui effectue tous les mappages peut être le meilleur itinéraire (sans jeu de mots) pour aller.

Tout avis sera le bienvenu.





routes