Asp.Net MVC - наилучший подход для “динамической” маршрутизации
-
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 не поддерживает сервер.Метод передачи