Asp.net mvc 处理'/';链接中的链接
我正在读一些字符串,这些字符串中有Asp.net mvc 处理'/';链接中的链接,asp.net-mvc,string,hyperlink,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 解决这个问题的好办法是什么?我的第一个想法是将每个/转换为-,但随后我遇到了一个问题/开销,即必须跟踪哪些代码被转换,以便在
/
,最常见的例子是日期/数字,如05/06、07/08等
我正在使用ASP.NET MVC2,并通过从DB读取的这些字符串生成链接,这就是问题所在
显然,链接到:
www.mysite.com/yearperiod/05/06/detail
将不会与指向的链接相同
www.mysite.com/yearperiod/2005/detail
解决这个问题的好办法是什么?我的第一个想法是将每个/
转换为-
,但随后我遇到了一个问题/开销,即必须跟踪哪些代码被转换,以便在写回数据库时,我不会无意中将有效的-
转换为//code>(如果有意义的话)
编辑:想想看,我不知道如何跟踪每个转换的/
。。。嗯
edit1:给定以下字符串:“2001/2-水果”
但是,如果我从视图中调用linkhelper,则渲染的链接显示为:
查看来源:
渲染链接:
http://localhost:XXXX/Period/2001/2+-+水果
而我需要它作为:
http://localhost:XXXX/Period/2001%2f2+-+水果
edit2:浏览器(在chrome中测试)正在自动将%2f
转换为/
。现在怎么办
edit3:哦。。。看起来IE行为正常(按要求)。。。嗯
- IE正确显示链接(已编码),单击后链接仍保持编码状态
- Firefox显示解码的链接,单击后进行编码
- Chrome显示已解码的链接以及单击后的解码
为什么不使用
Server.UrlEncode
。您可以对所有字符串进行URL编码
string strDatePeriod = Server.UrlEncode("05/06");
要将其转换回原始字符串,只需使用Server.UrlDecode
string origStr = Server.UrlDecode(strDatePeriod);
如果数据库中的实体正在输出字符串“05/06”,则该实体还必须具有某种唯一标识符,例如主键整数。您不能将其作为URL的一部分,使上面的示例成为:
www.mysite.com/yearperiod/123/05-06/detail
然后,您就可以将斜杠转换为破折号,再将其转换为心形内容,而无需担心将其转换回心形内容,因为实际的数据库查找是在ID号(“123”部分)中执行的,而不是在日期字符串中执行的
如果查看StackOverflow的URL,它们会执行类似的操作:
stackoverflow.com/questions/3648634/dealing-with-es-in-links
3648634是用于执行查找的此问题的数据库ID,“处理链接中的es”部分仅用于用户友好的描述性URL和搜索引擎优化
下面是一个ToFriendlyUrl()方法,它可以生成这些外观美观、风格独特的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();
}
}
公共静态类URLCoder
{
公共静态字符串ToFriendlyUrl(此UrlHelper,
字符串(urlToEncode)
{
urlToEncode=(urlToEncode??).Trim().ToLower();
StringBuilder url=新的StringBuilder();
foreach(urlToEncode中的字符)
{
开关(ch)
{
案例“”:
url.Append('-');
打破
案例“&”:
url.Append(“和”);
打破
案例'\'':
打破
违约:
如果((ch>='0'&&ch='a'&&ch有趣地提示了处理它的方法,只需从链接中完全删除斜杠http://stackoverflow.com/questions/3648634/dealing-with-es-in-links
这应该不是问题。如果您使用的是firefox,那么您将在源代码中看到转换后的源代码,以及在状态栏中看到的源代码当你用斜杠悬停它时,但当你点击它时,它会给你编码的字符串。如果有机会,你能在这里发布你的扩展方法吗?如果你愿意,它能做的只是服务器.UrlEncode()
,不幸的是,当我点击链接时(它将%2f
转换回//code>)它没有给我编码的字符串…我只能在视图中使用该代码吗?我正在尝试在我的Pagelink助手类中使用它。应该为服务器导入哪个命名空间。
我以为它是System.Web
你可以直接通过HttpContext.Current.Server.UrlEncode
和HttpContext.Current.Serve调用它r、 UrlDecode
来自命名空间系统。Web
请查看我的编辑,问题出在/
服务器上。UrlDecode
似乎在工作,但当它被渲染时,斜杠被转换回来了?哇,这是一个更好的解决方案…真不敢相信我没有想到使用它,现在看起来很明显rting back是我所担心的,但是依赖id会更好,这样我就可以对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) %>