如何在asp.net mvc中的url中添加页面标题? (网址生成)

时间:2010-02-01 05:26:52

标签: asp.net-mvc url routing seo

如何动态创建网址/链接,例如: www.restaurant.com/restaurant/restaurant-name-without-some-characters-like-space-coma-etc/132

我可以使用哪些关键字来搜索有关此主题的文章? (如何在asp.net mvc中生成和处理这种URL)

有一些问题: 如何生成链接? (在db中存储slu ??) 如果slug不是规范的话,是否重定向?

编辑:显然他们被称为slugs

4 个答案:

答案 0 :(得分:6)

您必须使用以下内容。

Routes.MapRoute(
    "Post",
    "posts/{id}/{*title}",
    new { controller = "Posts", action = "view" }
);

一个简单的扩展方法:

public static class UrlExtensions
{

    public static string ResolveSubjectForUrl(this HtmlHelper source, string subject)
    {
        return Regex.Replace(Regex.Replace(subject, "[^\\w]", "-"), "[-]{2,}", "-");
    }

}

答案 1 :(得分:4)

我总是在数据库中存储slugs以及它们引用的任何实体。所以对于博客文章,你会在“posts”表中有一个“slug”字段。

要在ASP.Net中处理它MVC很简单 - 你只需使用一个常规路径来捕获参数中的slug(甚至可能只是使用{id}),然后你的控制器会查找数据库中的slug ,加载实体,并正常显示。

虽然您可以使用简单的RegEx来替换空间以及诸如此类的东西来生成您的slu ,,但实际上这很快就会崩溃。您需要考虑标题中可能出现的各种字符。迈克尔卡普兰的博客与这个目的密切相关; he's shared a function会从字符串中删除变音符号。

因此,您的“生成slug”算法通常应采用以下形式:

  1. 修剪前导/尾随空格字符串
  2. 使用Michael Kaplan的功能或等效的
  3. 剥离变音符号
  4. 用于规范化的字符串小写
  5. 用短划线替换所有非单词字符

答案 2 :(得分:2)

执行此操作的一种方法是在字符串

上执行以下操作
 string cleanString = originalString.ToLower().Replace(" ", "-"); // ToLower() on the string thenreplaces spaces with hyphens
 cleanString = Regex.Replace(cleanString, @"[^a-zA-Z0-9\/_|+ -]", ""); // removes all non-alphanumerics/underscore/hyphens

现在您可以将cleanString(用于标题,名称等)传递到ActoinLink / Url.Action参数中,它会很有效。

该模式取自http://snipplr.com/view/18414/string-to-clean-url-generator/

如果一些正则表达式英雄可以加入并提供一个更好的那个,那么我不是100%使用正则表达式模式。从测试Regex开始,它与空格不匹配,但这不应该是一个问题,因为第一行用连字符替换所有空格。

<强>更新

要使用此代码,您需要设置路线以接受额外参数。

我们将以博客文章标题为例。

        routes.MapRoute(
            "",                                              // Route name
            "View/{ID}/{Title}",                           // URL with parameters
            new { controller = "Articles", action = "View"}  // Parameter defaults
        );

在ASP.NET MVC视图中,您可以执行以下操作:

  <%= Html.ActionLink("View Article", "View", "Articles", new { ID = article.ID, Title = Html.SanitizeTitle(article.Title) }, null) %>

在上一个示例中,我使用SanitizeTitle作为HTML helper

public static string SanitizeTitle(this HtmlHelper html, string originalString)
{
     string cleanString = originalString.ToLower().Replace(" ", "-"); // ToLower() on the string then replaces spaces with hyphens
     cleanString = Regex.Replace(cleanString, @"[^a-zA-Z0-9\/_|+ -]", ""); // removes all non-alphanumerics/underscore/hyphens
     return cleanString;
}

答案 3 :(得分:2)

我今天刚刚问了一个relevant question关于生成slug的问题,名为/ slugify标题。

当使用slug获取URL时,您可以创建一个同时包含ID(和其他必需参数)和slug的操作,并简单地忽略该slug。

public ActionResult Foobar(int id, string slug)
{
    //-- Do Something
}

或更优雅,使用地图路线忽略您网址后面的试用字符串并映射到Foobar(int id)