ASP.NET MVC: Kierowanie niestandardowych ślimaków bez wpływu na wydajność

Chciałbym tworzyć niestandardowe ślimaki dla stron w moim CMS, aby użytkownicy mogli tworzyć własne adresy URL SEO (takie jak Wordpress).

Robiłem to w Ruby on Rails i frameworkach PHP, „nadużywając” trasy 404. Ta trasa została wywołana, gdy nie można znaleźć żądanego kontrolera, umożliwiając mi skierowanie użytkownika do mojegodynamiczny kontroler stron analizować slug (skąd przekierowałem je do prawdziwego 404, jeśli nie znaleziono strony). W ten sposób baza danych została tylko zapytana, aby sprawdzić żądany ślimak.

Jednak w MVC trasa catch-all jest wywoływana tylko wtedy, gdy trasa nie pasuje do domyślnej trasy/{controller}/{action}/{id}.

Aby móc nadal analizować niestandardowe ślimaki, zmodyfikowałemRouteConfig.cs plik:

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

To rozwiązuje mój problem, ale wymagaPages tabela do pełnego zapytania dla każdego żądania. Ponieważ przeciążona metoda pokazu (public ViewResult Show(Page p)) nie działa. Muszę też pobrać stronę po raz drugi, ponieważ mogę tylko przekazać identyfikator strony.

Czy jest lepszy sposób na rozwiązanie mojego problemu?Czy jest możliwe przekazanie obiektu strony do mojej metody Show zamiast identyfikatora strony?

questionAnswers(2)

yourAnswerToTheQuestion