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

StackOverflow https://stackoverflow.com/questions/385570

  •  23-08-2019
  •  | 
  •  

Вопрос

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

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

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

Буду признателен за любой совет.

Это было полезно?

Решение

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

Маршрут: 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 не поддерживает сервер.Метод передачи

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top