为什么不使用ActionLink URLEncode?

时间:2013-03-22 19:51:51

标签: asp.net-mvc url urlencode actionlink

我希望我的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”函数 - 再次,它应该自动处理。

1 个答案:

答案 0 :(得分:1)

将空格字符更改为%20 是网址编码的结果。对URL编码空格字符时,它不会转换为连字符。如果确实如此,那么当您编码URL时,您认为连字符会被转换为什么?

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

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

1。)限制你的projectname数据以禁止空格,并且只允许连字符(在数据输入期间可能使用连字符)。

2。)将slug分别存储在数据库中,例如projectslug

3。)创建一个扩展方法,为您“动态”执行此操作。

以下是使用the link that @RK911 referenced的#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() })