我想为我的 CMS 中的页面创建自定义 slug,以便用户可以创建自己的 SEO-url(如 Wordpress)。
我曾经在 Ruby on Rails 和 PHP 框架中通过“滥用”404 路由来做到这一点。当找不到请求的控制器时调用此路由,使我能够将用户路由到我的动态页面控制器以解析 slug(如果没有找到页面,我将它们重定向到真正的 404)。这样,仅查询数据库以检查请求的 slug。
但是,在 MVC 中,只有当路由不符合/{controller}/{action}/{id}
.
为了仍然能够解析自定义 slug,我修改了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
为每个请求完全查询表。因为重载的显示方法 ( public ViewResult Show(Page p)
) 不起作用,我还必须再次检索页面,因为我只能传递页面 ID。
- 有没有更好的方法来解决我的问题?
- 是否可以将 Page 对象而不是页面 ID 传递给我的 Show 方法?