2010-09-06 60 views
1

我在许多串读“/” ES这通过他们有/“ES打交道,最常见的例子是日期/号码,如05/06,07/08等与链接

我正在使用ASP.NET MVC2并从这些字符串生成链接读出数据库,这是问题所在。

显然一个链接:

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

将无法​​工作相同为纽带,以

www.mysite.com/yearperiod/2005/detail

什么是一个很好的解决这个问题?我的第一个想法是将每个/转换为-,但随后我遇到了必须跟踪哪些已转换的问题/开销,以便在写回DB时,我不会无意中将有效的-切换为

编辑/(如果是有道理的):来想起来,我不知道如何跟踪每个转换/ ...... hmmmm .....

EDIT1:鉴于此字符串:“2001/2 - 水果”

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显示链接解码后,点击解码后。
+0

有趣暗示的方式,使与它的交易,简单地从链路去除斜线完全'http://stackoverflow.com/questions/3648634/处理与ES中的链接' – baron 2010-09-06 02:03:14

+0

它不应该是一个问题。如果您使用的是Firefox,您将在源代码中看到的是转换后的代码,以及当您将它悬停在斜杠上时在状态栏中看到的内容,但是当您单击它时,它会为您提供编码的字符串。 – 2010-09-06 04:08:33

+0

如果有机会,你可以在这里发布你的扩展方法吗? – 2010-09-06 04:09:18

回答

1

如果你的数据库中的实体输出字符串'05/06' 是实体必须也有某种唯一的标识符,比如主键整数。你不能包括作为URL的一部分,所以你上面的例子就变成:

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

然后你就可以将你的斜线飞奔到你的心内容,无需担心转换他们回来,因为实际的数据库查询在身份证号码('123'部分)中执行,而不是日期字符串。

如果你看看StackOverflow上的网址,他们做同样的事情:

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

3648634对这个问题是用来进行查找,对数据库ID的“交易,与-ES-在 - 链接'部分仅仅是为了用户友好的描述性URL和搜索引擎优化。

下面是可以产生这些好看的,SO风格,网址,而不必诉诸于URL编码ToFriendlyUrl()方法,它可以使的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(); 
    } 
} 

你可以调整的代码来处理其他特殊字符如&&号&,但您应该了解一般想法。您可以在视图中使用像这样:

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

所以,简而言之,不relly的URL编码,但使用FriendlyUrl工具像上面的,并包括实际的数据库查询数据库ID 。

我已经写了一篇博客文章在这个问题她http://www.dominicpettifer.co.uk/Blog/34/asp-net-mvc-and-clean-seo-friendly-urls

+0

哇,这是一个更好的解决方案...不能相信我没有考虑使用它,现在看起来如此明显!转换回来是我所担心的,但依靠id会更好,然后我可以做任何我想要的网址,而不必担心“唯一性”。感谢您的回答! – baron 2010-09-08 01:23:12

1

为什么不使用Server.UrlEncode。你可以UrlEncode你所有的字符串。

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

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

string origStr = Server.UrlDecode(strDatePeriod); 
+0

我只能在视图中使用该代码吗?我试图在我的Pagelink助手类中使用它。应该为'Server.'导入哪个命名空间。我认为它是'System.Web' – baron 2010-09-06 02:45:57

+0

,你可以直接通过命名空间'HttpContext.Current.Server.UrlEncode'和'HttpContext.Current.Server.UrlDecode'来调用它。 System.Web' – 2010-09-06 03:11:05

+0

请参阅我的编辑,'/'是问题,'Server.UrlEncode'似乎正在工作,但是当它被渲染时,斜杠被转换回来? – baron 2010-09-06 03:51:21