在ASP.NET MVC中为URL slugs添加ID和标题

wyc*_*ean 31 asp.net-mvc routes

如果缺少部分URL,如何将ASP.NET MVC中的请求重定向到其正确的规范版本?

使用Stack Overflow作为示例,站点将问题标题添加到其路径的末尾,但使用路径中的问题ID来实际查找问题.如果省略标题,您将被重定向到正确的URL.

例如,访问URL:

stackoverflow.com/questions/9033 
Run Code Online (Sandbox Code Playgroud)

将重定向到

stackoverflow.com/questions/9033/hidden-features-of-c
Run Code Online (Sandbox Code Playgroud)

这是如何运作的?

Sun*_*oot 39

首先创建一条路线:

routes.MapRoute( 
    "ViewProduct", 
    "Products/{id}/{productName}", 
    new { controller = "Product", action = "Details", id = "", productName = "" } 
);
Run Code Online (Sandbox Code Playgroud)

然后像这样创建Action方法:

public ActionResult Details(int? id, string productName) 
{ 
    Product product = ProductRepository.Fetch(id); 

    string realTitle = UrlEncoder.ToFriendlyUrl(product.Title); 
    string urlTitle = (productName ?? "").Trim().ToLower(); 

    if (realTitle != urlTitle)
    { 
        string url = "/Products/" + product.Id + "/" + realTitle; 
        return new PermanentRedirectResult(url);
    } 

    return View(product); 
}
Run Code Online (Sandbox Code Playgroud)

您基本上将URL中的实体标题与存储在数据库中的实体标题进行比较,如果它们不匹配则执行301永久重定向.确保它是"永久"重定向(301状态代码)而不是临时重定向(302).这样,搜索引擎会将其视为URL的永久更改,并相应地更新其索引,如果在搜索引擎索引后实体的标题发生更改(例如某人更改了产品名称),则可能会发生这种情况.

另外需要注意的是,如果你的标题允许任何自由文本,你需要删除任何对URL无效的字符,并使其对人类和搜索引擎更具可读性,因此代码中的UrlEncoder.ToFriendlyUrl方法以上,实施如下:

public static class UrlEncoder 
{ 
    public static string ToFriendlyUrl (this UrlHelper helper, 
        string urlToEncode) 
    { 
        urlToEncode = (urlToEncode ?? "").Trim().ToLower(); 

        StringBuilder url = new StringBuilder(); 

        foreach (char ch in urlToEncode) 
        { 
            switch (ch) 
            { 
                case ' ': 
                    url.Append('-'); 
                    break; 
                case '&': 
                    url.Append("and"); 
                    break; 
                case '\'': 
                    break; 
                default: 
                    if ((ch >= '0' && ch <= '9') || 
                        (ch >= 'a' && ch <= 'z')) 
                    { 
                        url.Append(ch); 
                    } 
                    else 
                    { 
                        url.Append('-'); 
                    } 
                    break; 
            } 
        } 

        return url.ToString(); 
    } 
}
Run Code Online (Sandbox Code Playgroud)

因此,当您将URL写入视图时,请务必使用此方法对标题进行编码,例如

<a href="/Products/@Model.Id/@Url.ToFriendlyUrl(Model.Title)">@Model.Title</a>
Run Code Online (Sandbox Code Playgroud)

我在这里写了一篇博客文章http://www.dominicpettifer.co.uk/Blog/34/asp-net-mvc-and-clean-seo-friendly-urls

  • Stackoverflow的创建者在这里展示了他对'ToFriendlyUrl'的实现:[http://stackoverflow.com/questions/25259/how-do-you-include-a-webpage-title-as-part-of-a-webpage- URL/25486#25486](http://stackoverflow.com/questions/25259/how-do-you-include-a-webpage-title-as-part-of-a-webpage-url/25486#25486) (3认同)