在我的网络应用程序中,我的参数可以包含各种疯狂的字符(俄语字符,斜杠,空格等),因此不能总是在URL中表示为。 以快乐的方式发送它们将在大约50%的情况下起作用。像空格这样的东西已经在某处编码了(我猜是在Html.BuildUrlFromExpression中)。其他的东西(比如“/”和“*”)不是。
现在我不知道该怎么做了,因为如果我自己编码,我的编码将再次被部分编码并最终出错。如果我不对它们进行编码,则某些字符将无法通过。
我所做的是手动.replace()我遇到问题的人物。
这当然不是一个好主意。
想法?
- 编辑 -
我知道我可以使用多种编码/解码库。
它看起来像mvc框架已经在尝试为我做,但不完全。
<a href="<%=Html.BuildUrlFromExpression<SearchController>(c=>c.Search("", 1, "a \v/&irdStr*ng"))%>" title="my hat's awesome!">
会渲染我
<a href="/Search.mvc/en/Search/1/a%20%5Cv/&irdStr*ng" title="my hat's awesome!">
注意正斜杠,星号和&符号不会被转义。 为什么有些人逃脱而其他人没有逃脱?我怎么能正确地逃避这个?
我做错了什么还是框架?
答案 0 :(得分:2)
应使用Uri.EscapeDataString
转义参数:
string url = string.Format("http://www.foo.bar/page?name={0}&address={1}",
Uri.EscapeDataString("adlknad /?? lkm#"),
Uri.EscapeDataString(" qeio103 8182"));
Console.WriteLine(url);
Uri uri = new Uri(url);
string[] options = uri.Query.Split('?','&');
foreach (string option in options)
{
string[] parts = option.Split('=');
if (parts.Length == 2)
{
Console.WriteLine("{0} = {1}",parts[0],
Uri.UnescapeDataString(parts[1]));
}
}
答案 1 :(得分:1)
正如其他人所提到的,如果您首先对字符串进行编码,则可以解决问题。
MVC框架正在编码它知道需要编码的字符,但保留那些有效的URL字符(例如&amp;%?* /)。这是因为它们是有效的URL字符,尽管它们是URL中的特殊字符,可能无法实现您所追求的结果。
答案 2 :(得分:0)
您是否尝试使用Server.UrlEncode()
方法进行编码,并使用Server.UrlDecode()
方法进行解码?
使用它来传递物品我没有任何问题。
答案 3 :(得分:0)
Server.URLEncode或HttpServerUtility.UrlEncode
我现在看到你在说什么 - 我没有意识到这个问题是针对MVC的。看起来像MVC框架的那一部分的限制 - 特别是BuildUrlFromExpression正在进行一些URL编码,但是它知道还需要一些这些标点作为框架URL的一部分。
而且不幸的是,URLEncoding不产生不变量,即
URLEncode(x) != URLEncode(URLEncode(x))
那不是很好。然后你可以对你的变量进行预编码,它们不会被双重编码。
可能有一个ASP.NET MVC框架的最佳实践。我想你可以做的另一件事是编码到base64或URLEncode-invariant。
答案 4 :(得分:0)
尝试使用Microsoft Anti-Cross Site Scripting library。它包含几种编码方法,它们编码所有字符(包括#和其他语言中的字符)。至于解码,浏览器应该很好地处理编码的Url,但是如果你需要手动解码Url,请使用Uri.UnescapeDataString
希望有所帮助。
答案 5 :(得分:0)
出于安全原因,禁止在URL的路径部分中转发正斜杠和点(尽管它以单声道工作)。
答案 6 :(得分:0)
Html.BuildUrlFromExpression需要修复,然后将此上游提交给MVC项目...或者在传递给BuildUrlFromExpression之前对字符串进行编码,并在另一侧返回时对其进行解码。
它可能不容易修复,因为IIS可能事先正在处理url字符串的解码...可能需要对实用程序方法中的替代路径字符进行更高级的编码/解码,并代表您进行解码出。
答案 7 :(得分:0)
我在这上面看过类似的帖子。对我而言,它看起来像是MVC中的一个缺陷。该函数将更恰当地命名为“BuildUrlFromEncodedExpression”。更糟糕的是,被调用的函数需要解码其输入参数。育。
如果编码BuildUrlFromExpression()的字符和调用者编码的字符之间有任何重叠(我认为,为了简单起见,我认为可能只编码任何非字母数字),那么你就有可能出现令人讨厌的错误。