Asp.Net MVC - лучший подход для "динамической" маршрутизации

Я пытаюсь придумать подход для создания "динамической" маршрутизации. Я имею в виду, что я хочу, чтобы я мог назначить контроллер и действие маршрута для каждого удара, а не напрямую отображать его.

Например, маршрут может выглядеть как этот "путь/{объект)", и когда этот путь попадает, выполняется поиск, обеспечивающий соответствующий контроллер/действие для вызова.

Я пробовал открыть механизмы для создания настраиваемого обработчика маршрутов, но документация/обнаружение на данный момент немного теневое (я знаю, его бета-версия - я бы больше не ожидал). Хотя, я не уверен, что даже лучший подход и, возможно, контроллер factory или даже контроллер/действие по умолчанию, выполняющее все сопоставления, могут быть лучшим маршрутом (без каламбура).

Любые советы будут оценены.

Ответ 1

Вы всегда можете использовать синтаксис catch all (я не знаю, правильно ли это имя).

Маршрут: routeTable.MapRoute( "Path", "{*path}", new { controller = "Pages", action = "Path" });

Действие контроллера определяется как: public ActionResult Path(string path)

В действии для контроллера у вас будет путь, поэтому просто нужно пролить его и проанализировать.

Для вызова другого контроллера вы можете использовать RedirectToAction (я думаю, что это более правильный способ). При перенаправлении вы можете настроить постоянное перенаправление для него. Или используйте что-то вроде этого:

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

Однако этот метод требует запуска в IIS или IIS Expres. Casinni не поддерживает метод Server.Transfer.