2012-11-19 47 views
1

我已經設置了路由通過允許URL格式允許搜索引擎優化(和人類)友好的URL ~/{category}/{title}ASP NET MVC3路由通過枚舉

所有的路由經過其中有一種方法,內容控制器適當重定向。我也想要允許~/{category}這將帶你到一個過濾索引。

所有這一切都利用工作對我來說:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.MapRoute(
     "Category And Title", // Route name 
     "{category}/{title}", // URL with parameters 
     new { controller = "Content", action = "SeoRouting", title = UrlParameter.Optional }, // Parameter defaults 
     new { category = "People|IT|Personnel|Finance|Procedures|Tools"} 
     ); 

    routes.MapRoute(
     "Default", // Route name 
     "{controller}/{action}/{id}", // URL with parameters 
     new {controller = "Home", action = "Index", id = UrlParameter.Optional} // Parameter defaults 
     ); 

} 

但如果再類別改變,我需要改變他們在兩個地方。在Global.asax和enum中我們有類別。

在理想世界中,如果路徑的第一部分中的值與ContentCategory枚舉相匹配(不區分大小寫),並且默認路由不匹配,那麼我會使用第一條路徑。

這些類別將很少發生變化,所以這不是一件大事,但如果覺得它應該是可能的。

回答

10

對不起我的實際問題是什麼略有困惑,但你可以通過實際的枚舉生成正則表達式對象繞過「更改代碼在兩個地方」(排序):

routes.MapRoute(
    "Category And Title", // Route name 
    "{category}/{title}", // URL with parameters 
    new { controller = "Content", action = "SeoRouting", title = UrlParameter.Optional }, // Parameter defaults 
    new { category = getCategories() } 
    ); 

private static string getCategories() 
{ 
    var categories = Enum.GetNames(typeof(ContentCategory)); 
    return string.Join("|", categories); 
} 
+0

這就是問題,看起來像答案 - brillog! –