Как динамически разрешить контроллер с маршрутизацией конечной точки? - PullRequest
0 голосов
/ 14 января 2019

Обновление до ядра 2.2 asp.net в моем хобби-проекте появилась новая система маршрутизации, на которую я хочу перейти. Ранее я реализовал пользовательский IRouter, чтобы иметь возможность динамически устанавливать контроллер для запроса. Путь входящего запроса может быть любым. Я сопоставляю запрос с таблицей базы данных, содержащей слагов, и она ищет соответствующий тип класса контейнера данных для разрешенного слага. После этого я определяю тип контроллера, который может обработать запрос, и устанавливаю значения RouteData для текущего HttpContext и передаю его реализации по умолчанию для IRouter, и все работает нормально.

Индивидуальная реализация IRouter:

public async Task RouteAsync(RouteContext context)
    {
        var requestPath = context.HttpContext.Request.Path.Value;
        var page = _pIndex.GetPage(requestPath);

        if (page != null)
        {
            var controllerType = _controllerResolver.GetController(page.PageType);
            if (controllerType != null)
            {
                var oldRouteData = context.RouteData;
                var newRouteData = new RouteData(oldRouteData);

                newRouteData.Values["pageType"] = page.PageType;
                newRouteData.Values["controller"] = controllerType.Name.Replace("Controller", "");
                newRouteData.Values["action"] = "Index";

                context.RouteData = newRouteData;

                await _defaultRouter.RouteAsync(context);
            }
        }
    }

Контроллер для обработки страниц определенного типа.

public class SomePageController : PageController<PageData>
{
    public ActionResult Index(PageData currentPage)
    {
        return View("Index", currentPage);
    }
}

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

...