2011-12-12 40 views
5

tôi đã xác định con đường sau:ASP.NET MVC 3 - tuyến đường thân thiện Tuỳ chỉnh SEO

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

Khi tôi gọi phương pháp này:

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

tôi nhận được URL sau:
http://localhost:57553/foo/1/Some%20text%20Š

Tôi muốn tạo một tuyến đường mới sẽ viết thường tất cả các ký tự và thay thế một số ký tự.

ví dụ:
http://localhost:57553/foo/1/some-text-s

Rules:

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

Bất kỳ trợ giúp sẽ được đánh giá cao!

Trả lời

6

Có vẻ như một ứng cử viên hoàn hảo cho một lộ trình tùy chỉnh:

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(); 
    } 
} 

mà sẽ được đăng ký như thế này:

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

Bây giờ tất cả các bạn phải làm là để thực hiện yêu cầu SEO của bạn trong SEOify chức năng mà tôi để lại. Bằng cách này, bạn có thể lấy cảm hứng từ cách StackOverflow does it cho các tiêu đề câu hỏi.

+0

Tuyệt vời! +1. Điều gì về tuyến đường tùy chỉnh so với người trợ giúp URL? Tôi tìm thấy giải pháp tương tự trên SO một vài năm trước đây (nhưng không thể tìm thấy nó bây giờ) và bây giờ tất cả mọi người đang gợi ý trợ giúp URL trên router tùy chỉnh? –

+0

@ šljaker, tôi không hiểu bạn đang hỏi gì khi bạn nói 'tuyến đường tùy chỉnh so với người trợ giúp URL'. Bạn có yêu cầu đó là tốt hơn: sử dụng một tuyến đường tùy chỉnh sẽ thực hiện điều này hoặc viết trợ giúp tùy chỉnh như Html.ActionLink, Url.Action, ...? Nếu đây là trường hợp sau đó một tuyến đường tùy chỉnh là tốt hơn nhiều khi bạn tập trung toàn bộ logic định tuyến của bạn và cách url của bạn trông giống như trong các tuyến đường mà là nơi này nên được thực hiện thay vì phân tán logic như vậy xung quanh codease của bạn. Việc sửa đổi nó dễ dàng hơn nhiều ở một vị trí duy nhất và tất cả người trợ giúp HTML chuẩn sẽ tự động sử dụng nó trên toàn bộ ứng dụng. –

+0

vâng, đó là điều tôi muốn biết! Cảm ơn! –

Các vấn đề liên quan