在链接中处理'/'es

时间:2010-09-06 02:02:29

标签: asp.net-mvc string hyperlink

我正在阅读许多字符串,其中/通过它们,最常见的例子是日期/数字,如05 / 06,07 / 08等。

我正在使用ASP.NET MVC2并从DB中读取这些字符串的链接,这就是问题所在。

显然是指向:

的链接

www.mysite.com/yearperiod/05/06/detail

的链接无效

www.mysite.com/yearperiod/2005/detail

这个问题的解决方案是什么?我的第一个想法是将每个/转换为-但是我遇到了必须跟踪哪些转换的问题/开销,以便在写回DB时我不要无意中将有效-切换为/(如果有意义的话)

编辑来想一想,我不知道如何跟踪每个转换后的/ ......嗯......

edit1:鉴于此字符串:“2001/2 - Fruit”

var encodedLinkText = HttpContext.Current.Server.UrlEncode(linkText); //result is "2001%2f2+-+Fruit"

但是如果我从我的视图中调用linkhelper,渲染的链接就会出现: 查看来源: <li><a href="2001%2f2+-+Fruit">2001/2 - Fruit</a></li> 渲染链接: http://localhost:XXXX/Period/2001/2+-+Fruit

虽然我需要它:

http://localhost:XXXX/Period/2001%2f2+-+Fruit

edit2 :浏览器(在Chrome中测试)会自动将%2f转换为/。现在怎么办?

edit3:呃哦......看起来IE表现得很好(根据需要)......嗯......

  • IE 正确显示链接(已编码),点击后仍保持编码状态。
  • Firefox 显示已解码的链接,点击后进行编码。
  • Chrome 会显示已解码的链接,点击后会解码。

2 个答案:

答案 0 :(得分:1)

为什么不使用Server.UrlEncode。您可以对所有字符串进行UrlEncode。

string strDatePeriod = Server.UrlEncode("05/06");

要将其转换回原始字符串,您只需使用Server.UrlDecode

即可
string origStr = Server.UrlDecode(strDatePeriod);

答案 1 :(得分:1)

如果数据库中的实体正在输出字符串'05 / 06',则该实体还必须具有某种唯一标识符,例如主键整数。您不能将其作为网址的一部分包含在内,以便您的上述示例变为:

www.mysite.com/yearperiod/123/05-06/detail

然后你可以将斜线转换为破折号到你的内容,而不必担心将它们转换回来,因为实际的数据库查找是在ID号('123'部分)而不是日期字符串中执行的。

如果您查看StackOverflow的URL,他们会执行类似的操作:

stackoverflow.com/questions/3648634/dealing-with-es-in-links

3648634是此问题的数据库ID,用于执行查找,“处理-es-in-links ”部分仅用于用户友好的描述性URL和搜索引擎优化。

这是一个ToFriendlyUrl()方法,它可以生成这些漂亮的SO样式的URL,而不必使用URL编码,这可能会使URL看起来很丑:

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(); 
    } 
}

您可以调整代码以处理其他特殊字符,例如&amp; ampersands&amp; ,但你应该得到一般的想法。您可以在视图中使用:

<%= Url.ToFriendlyUrl(item.Title) %>

简而言之,不要依赖于UrlEncoding,而是使用类似上面的FriendlyUrl实用程序,并包含实际数据库查找的数据库ID。

我在这个主题上撰写了一篇博文http://www.dominicpettifer.co.uk/Blog/34/asp-net-mvc-and-clean-seo-friendly-urls