2011-12-12 84 views
5

我已經定義了以下路線:當我把這種方法ASP.NET MVC 3 - 自定義搜索引擎友好的路線

routes.MapRoute(
    null, 
    "foo/{id}/{title}", 
    new { controller = "Boo", action = "Details" } 
); 

Url.Action("Details", "Boo", new { id = article.Id, title = article.Title }) 

我得到以下網址:
http://localhost:57553/foo/1/Some%20text%20Š

我想創建一個新的路線,將小寫所有字符並替換其中的一些。

例如
http://localhost:57553/foo/1/some-text-s

規則:

Uppercase -> lowercase  
' ' -> '-' 
'Š' -> 's' 
etc. 

任何幫助將不勝感激!

回答

6

似乎是一個自定義路由一個完美的候選人:

public class MyRoute : Route 
{ 
    public MyRoute(string url, object defaultValues) 
     : base(url, new RouteValueDictionary(defaultValues), new MvcRouteHandler()) 
    { 
    } 

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) 
    { 
     values = new RouteValueDictionary(values); 
     var title = values["title"] as string; 
     if (!string.IsNullOrEmpty(title)) 
     { 
      values["title"] = SEOify(title); 
     } 
     return base.GetVirtualPath(requestContext, values); 
    } 

    private string SEOify(string title) 
    { 
     throw new NotImplementedException(); 
    } 
} 

將要被登記這樣的:

routes.Add(
    "myRoute", 
    new MyRoute(
     "foo/{id}/{title}", 
     new { controller = "Boo", action = "Details" } 
    ) 
); 

現在,所有你需要做的是落實在SEOify你的SEO要求我離開的功能。順便說一句,您可以從StackOverflow does it的問題標題中獲得靈感。

+0

太棒了! +1。自定義路線與URL助手怎麼樣?幾年前,我發現了類似的解決方案(但現在找不到它),現在每個人都在自定義路由器上提供URL助手? –

+0

@šljaker,我不明白你說什麼,當你說'自定義路由與URL助手'。你問是哪個更好:使用自定義路線來執行此操作或編寫自定義幫助程序,如Html.ActionLink,Url.Action,...?如果是這種情況,那麼自定義路由會更好,因爲您集中整個路由邏輯以及您的url在應該完成這些任務的路由中的樣子,而不是將這些邏輯分散在您的代碼庫中。在單個位置修改它更容易,所有標準HTML助手都會在整個應用程序中自動使用它。 –

+0

是的,這就是我想知道的!謝謝! –