ASP.NET MVC 3 - 自定义SEO友好路线

šlj*_*ker 5 routes asp.net-mvc-2

我已经定义了以下路线:

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

当我调用这个方法时:

Url.Action("Details", "Boo", new { id = article.Id, title = article.Title })
Run Code Online (Sandbox Code Playgroud)

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

我想创建一个新的路由,它将小写所有字符并替换其中一些字符.

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

规则:

Uppercase -> lowercase    
' ' -> '-'
'Š' -> 's'
etc.
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激!

Dar*_*rov 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

将注册如下:

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

现在你所要做的就是在SEOify我离开的功能中实现你的SEO要求.顺便说一句,你可以从StackOverflow为问题标题的方式中获得灵感.