2011-12-01 130 views
2

我需要添加一個http://mysite/categoryname路線,所以我說ASPNET MVC路由問題

routes.MapRoute(
    "Categories", 
    "{CategoryName}", 
    new { controller = "News", action = "Category", CategoryName = "" }, 
    new string[] { "MyProj.Controllers" } 
     ); 

的問題是,如果我

前加入
routes.MapRoute(
    "Default", // Route name 
    "{controller}/{action}/{id}", // URL with parameters 
    new { controller = "News", action = "Index", id = UrlParameter.Optional }, 
    new string[] { "MyProj.Controllers" } 
     ); 

首頁去錯誤的,因爲它在進入分類路線;如果我添加在最後位置的分類航線它從未進入和http://mysite/category_name給了我404

我到底做錯了什麼?

回答

5

您有幾種選擇在這裏:

更改您的新聞類路線包括硬路徑:

routes.MapRoute(
    "Categories", 
    "category/{CategoryName}", 
    new { controller = "News", action = "Category", CategoryName = "" }, 
    new string[] { "MyProj.Controllers" } 
     ); 

更改默認路由包括硬盤路徑:

routes.MapRoute(
    "Default", // Route name 
    "site/{controller}/{action}/{id}", // URL with parameters 
    new { controller = "News", action = "Index", id = UrlParameter.Optional }, 
    new string[] { "MyProj.Controllers" } 
    ); 

推出自己的自定義路由類

參見http://hanssens.org/post/ASPNET-MVC-Subdomain-Routing.aspx爲一個不相關的例子。

1

無論你如何做到這一點,當你添加類別時,你顯然會冒着踩在網站上的其他頁面的風險 - 例如,如果你有一個名爲/帳戶的網站部分,然後有人創建一個類別名爲「account」,應該發生什麼?

這就是說,有一個比寫自己的路由類簡單的答案。您可以在類別路線中使用正則表達式,並將其作爲第一條規則。例如,如果只有2個類別的網站上是夾克和毛衣:基於在正則表達式

routes.MapRoute(
    "Categories", 
    "{CategoryName}", 
    new { controller = "News", action = "Category" }, 
    new { CategoryName = "(jackets|sweaters)" } 
); 

最後一個參數是一個RouteConstraint,所以路線將按照路由後它包括如果路徑既不/夾克衫或/毛衣。

顯然,你想比這更強大的,所以你可以創建構建正則表達式在應用程序啓動的方法:

routes.MapRoute(
    "Categories", 
    "{CategoryName}", 
    new { controller = "News", action = "Category" }, 
    new { CategoryName = "(" + String.Join("|", categories) + ")" } 
); 

categories這裏將需要你提供的東西 - 一些數組或數據庫飼料您的應用中的類別名稱。