【问题标题】:Why doesn't ActionLink URLEncode?为什么 ActionLink URLEncode 不编码?
【发布时间】:2013-03-12 19:21:49
【问题描述】:

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

【问题讨论】:

标签: asp.net-mvc url urlencode actionlink


【解决方案1】:

将空格字符更改为%20是 URL 编码的结果。当您对空格字符进行 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() })

【讨论】:

    猜你喜欢
    • 2013-01-21
    • 2012-10-06
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    • 2013-01-19
    • 2017-01-09
    相关资源
    最近更新 更多