我想为我的CMS中的页面创建自定义slu so,所以用户可以创建自己的SEO-urls(如Wordpress)。ASP.NET MVC:路由自定义slu without而不影响性能
我曾经在Ruby on Rails和PHP框架中通过“滥用”404路由来做到这一点。当找不到请求的控制器时调用此路由,使我能够将用户路由到我的动态页面控制器来解析slug(如果没有找到页面,我将它们重定向到真正的404)。这样数据库只被查询来检查请求的slu。。
但是,在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
表来为每个请求完全查询。由于重载显示方法(public ViewResult Show(Page p)
)不起作用,我还必须再次检索该页面,因为我只能传递页面ID。
- 有没有更好的方法来解决我的问题?
- 是否可以将页面对象传递给我的Show方法而不是页面ID?
仅在应用程序启动时才初始化它吗?只是在旁注:'db.Dispose();'?编辑:对不起,我没有很好地阅读你的问题。也许你可以把页面放到全局缓存中? – Silvermind 2012-07-15 18:10:38
感谢您指出正确的方向!该功能的确只在启动时调用。我想我正在看它,就好像它是一种解释型语言(如PHP)。 考虑到这是代码只在启动时执行我估计性能影响可以忽略不计。 但是,我仍然不确定这是否应该走,或者如果这已经可以通过使用内置功能实现。我还想知道是否可以通过模型而不是ID(问题2)。 – christiaanderidder 2012-07-15 18:22:38