我想爲我的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