我正在阅读许多字符串,其中/
通过它们,最常见的例子是日期/数字,如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表现得很好(根据需要)......嗯......
答案 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