【发布时间】:2010-10-10 03:40:47
【问题描述】:
我的地图是:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with params
new { controller = "Home", action = "Index", id = "" } // Param defaults
);
如果我使用 URL http://localhost:5000/Home/About/100%2f200,则没有匹配的路由。
我将 URL 更改为 http://localhost:5000/Home/About/100 然后再次匹配路由。
是否有任何简单的方法来处理包含斜杠的参数?其他转义值(空格%20)似乎也有效。
编辑:
对 Base64 进行编码对我有用。它使 URL 变得丑陋,但现在没关系。
public class UrlEncoder
{
public string URLDecode(string decode)
{
if (decode == null) return null;
if (decode.StartsWith("="))
{
return FromBase64(decode.TrimStart('='));
}
else
{
return HttpUtility.UrlDecode( decode) ;
}
}
public string UrlEncode(string encode)
{
if (encode == null) return null;
string encoded = HttpUtility.PathEncode(encode);
if (encoded.Replace("%20", "") == encode.Replace(" ", ""))
{
return encoded;
}
else
{
return "=" + ToBase64(encode);
}
}
public string ToBase64(string encode)
{
Byte[] btByteArray = null;
UTF8Encoding encoding = new UTF8Encoding();
btByteArray = encoding.GetBytes(encode);
string sResult = System.Convert.ToBase64String(btByteArray, 0, btByteArray.Length);
sResult = sResult.Replace("+", "-").Replace("/", "_");
return sResult;
}
public string FromBase64(string decode)
{
decode = decode.Replace("-", "+").Replace("_", "/");
UTF8Encoding encoding = new UTF8Encoding();
return encoding.GetString(Convert.FromBase64String(decode));
}
}
编辑1:
最后发现,最好的方法是为我需要选择的每个项目保存一个格式良好的字符串。那好多了,因为现在我只编码值而从不解码它们。所有特殊字符变为“-”。我的很多数据库表现在都有这个附加列“URL”。数据很稳定,所以我可以走这条路。我什至可以检查“URL”中的数据是否唯一。
编辑2:
还要注意空格字符。在 VS 集成网络服务器上看起来不错,但在 iis7 Properly url encode space character 上有所不同
【问题讨论】:
-
Gath Adams 建议对任何可以包含斜杠的参数进行 Base64 编码。他还更详细地解释了这个问题:博客条目:gathadams.com/2009/01/06/…
-
您还可以想出一些其他方法来掩盖斜线,例如,按照惯例将其替换为其他内容。我知道。这也很丑陋,但至少 URL 保持可读性。
-
我注意到正斜杠和点会给我错误。我做了一个快速助手,用“-slash-”和“-dot-”替换它们。想知道为什么常规的 Url.Encode/Decode 不能解决问题。另外,为什么转义字符会出错?
-
哇,伙伴! Base64 编码也包括斜线字符!这不是您可以依赖的解决方案。
-
这不是路由的编码问题;这显然是 .NET Uri 类中的一个错误。根据 [我对 URI RFC 的阅读],路径中的编码斜杠不应被视为段分隔符。 MVC 路由没有机会正确处理它,因为 Uri 类(错误地)在路由甚至看到斜杠之前就对其进行解码。请参阅 RFC 的第 2.2 和 2.4 节。 labs.apache.org/webarch/uri/rfc/rfc3986.html#reserved
标签: c# asp.net-mvc asp.net-mvc-routing urlencode