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)
) не работает, я также должен получить страницу во второй раз, потому что я могу только передать идентификатор страницы.