ASP.NET MVC: маршрутизация пользовательских слагов без ущерба для производительности

Я хотел бы создавать собственные слагы для страниц в моей CMS, чтобы пользователи могли создавать свои собственные SEO-URL (например, Wordpress).

Раньше я делал это в средах Ruby on Rails и PHP путем "злоупотребления". маршрут 404. Этот маршрут был вызван, когда запрошенный контроллер не был найден, что позволило мне направить пользователя к моемуdynamic pages controller проанализировать слаг (откуда я перенаправил их на реальный 404, если страница не найдена). Таким образом, база данных запрашивалась только для проверки запрошенного слага.

Однако в MVC универсальный маршрут вызывается только тогда, когда маршрут не соответствует маршруту по умолчанию/{controller}/{action}/{id}.

Чтобы все еще иметь возможность анализировать собственные слагы, я изменилRouteConfig.cs файл:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        RegisterCustomRoutes(routes);

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { Controller = "Pages", Action = "Index", id = UrlParameter.Optional }
        );
    }

    public static void RegisterCustomRoutes(RouteCollection routes)
    {
        CMSContext db = new CMSContext();
        List<Page> pages = db.Pages.ToList();
        foreach (Page p in pages)
        {
            routes.MapRoute(
                name: p.Title,
                url: p.Slug,
                defaults: new { Controller = "Pages", Action = "Show", id = p.ID }
            );
        }
        db.Dispose();
    }
}

Это решает мою проблему, но требуетPages таблица должна быть полностью запрошена для каждого запроса. Потому что перегружен метод show (public ViewResult Show(Page p)) не работает, я также должен получить страницу во второй раз, потому что я могу только передать идентификатор страницы.

Is there a better way to solve my problem? Is it possible to pass the Page object to my Show method instead of the page ID?

Ответы на вопрос(2)

Ваш ответ на вопрос