2011-03-09 55 views
7

我有一個網址建立索引的缺省路由控制器

,我想變成

那也可以是類似的東西- 參數是一個字符串。我嘗試過的路由設置是:

routes.MapRoute(
    "ControllerDefault", 
    "{controller}/{id}", 
    new { controller = "Page", action = "Index", id = UrlParameter.Optional } 
); 

但是,這會干擾MVC項目附帶的默認「id」路由。有沒有辦法達到這個目的?

+0

另外http://stackoverflow.com/questions/973205/asp-net-mvc-default-route – 2011-03-10 10:11:36

回答

15

您不需要失去默認路由。避免你的路線互相干擾的關鍵是要訂購它們,以便更具體的規則先於不太具體的規則。例如:

// Your specialized route 
routes.MapRoute(
    "Page", 
    "Page/{slug}", 
    new { controller = "Page", action = "Index" } 
); 

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

那麼你的PageController應該是這樣的:

using System.Web.Mvc; 

public class PageController : Controller 
{ 
    public string Index(string slug) 
    { 
     // find page by slug 
    } 
} 

這就是說,我會強烈建議你這樣做,而不是:

// Your specialized route 
routes.MapRoute(
    "Page", 
    "Page/{id}/{slug}", 
    new { controller = "Page", action = "Index", slug = UrlParameter.Optional } 
); 

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

和你的PageController :

using System.Web.Mvc; 

public class PageController : Controller 
{ 
    public string Index(int id) 
    { 
     // find page by ID 
    } 
} 

通過在頁面的開頭添加頁面ID(比如StackOverflow)或者在最後添加頁面ID,然後您可以忽略該段落,而是通過ID檢索您的頁面。如果用戶更改頁面名稱,這將爲您節省大量頭痛。我已經經歷了這一點,這是痛苦的;你基本上必須記錄你的網頁過去的所有名字,這樣你的訪問者/搜索引擎每次頁面重命名時都不會得到404。

希望這會有所幫助。

+0

我的問題是ID是一個GUID,這不是特別漂亮。所以:'http://www.roadkillwiki.org/ Page/12312-4133-434a23-4424fd-444/documentation'。看起來我需要另一個體面的ID列 – 2011-03-10 13:39:14

+1

有一些方法可以使GUID更漂亮/更友好[比如這個](http://www.singular.co.nz/blog/archive/2007/12 /20/shortguid-a-shorter-and-url-friendly-guid-in-c-sharp.aspx)將'c9a646d3-9c61-4cb7-bfcd-ee2522c8f633'縮小到'00 amyWGct0y_ze4lIsj2Mw',但我同意;這裏的'int'可能是最不干擾的方式。 – 2011-03-11 12:26:54

+0

感謝您的信息+鏈接,他們非常有幫助。我想我會堅持數字,因爲網址很整齊 – 2011-03-12 14:40:18

1

如果你不需要與項目模板來了一個默認路由可以建立一個這樣的:

routes.MapRoute(
    "ControllerDefault", 
    "{controller}/{pagename}", 
    new { controller = "Page", action = "Index" } 
); 

,比你的控制器,你將有一個動作:

 public ActionResult Index(string pagename) 
     { 
      //do something 
     }