1

我希望我的 MVC 网址是这样的:

http://www.site.com/project/id/projectname

例子:

http://www.site.com/project/5/new-website

我的控制器是:

public ActionResult Details(int id, string projectname)

我的任何操作链接是:

@Html.ActionLink("click here", "Details", "Project", new { id = project.ProjectID, projectname = project.ProjectName })

我的路线是:

routes.MapRoute(
    "Project",
    "project/{id}/{projectname}",
    new { controller = "Project", action = "Details", id = "", projectname = "" }
    );

当然,系统在那里有足够的信息,知道项目名称将是 URL 的一部分,所以它应该对链接进行 UrlEncode 并因此用连字符替换空格?但它没有,所以空格变成 %20

我不确定我在哪里定制这个?我是否覆盖 Html.ActionLink?在每次编辑时在数据库中存储一个“URL-ready”版本的名称——这似乎是一种浪费,当它应该在运行中自动完成时。而且我不想每次使用 Html.ActionLink 时都必须调用“FriendlyURL”函数——同样,它应该被自动处理。

4

1 回答 1

1

将空格字符更改%20 URL 编码的结果。当您对空格字符进行 URL 编码时,它不会转换为连字符。如果是这样,那么您认为连字符在 URL 编码时会转换为什么?

正如@RK911 指出的那样,您想要做的是创建一个slug

有几种方法可以做到这一点:

1.) 限制您的projectname数据以禁止使用空格,并且只允许使用连字符(在数据输入期间可能使用对其进行验证)。

2.) 将 slug 单独存储在您的数据库中,例如projectslug.

3.)创建一个扩展方法,它将为您“即时”执行此操作。

这是使用@RK911 引用的链接的#3 示例:

public static class SlugExtensions
{
    public static string AsSlug(this string phrase) 
    { 
        string str = phrase.RemoveAccent().ToLower(); 
        // invalid chars           
        str = Regex.Replace(str, @"[^a-z0-9\s-]", ""); 
        // convert multiple spaces into one space   
        str = Regex.Replace(str, @"\s+", " ").Trim(); 
        // cut and trim 
        str = str.Substring(0, str.Length <= 45 ? str.Length : 45).Trim();   
        str = Regex.Replace(str, @"\s", "-"); // hyphens   
        return str; 
    } 

    private static string RemoveAccent(this string txt) 
    { 
        byte[] bytes = System.Text.Encoding.GetEncoding("Cyrillic").GetBytes(txt); 
        return System.Text.Encoding.ASCII.GetString(bytes); 
    }
}

@Html.ActionLink("click here", "Details", "Project",
    new { id = project.ProjectID,
    projectname = project.ProjectName.AsSlug() })
于 2013-03-23T06:06:53.253 回答