2

我正在对 url 中的参数进行编码,并将 a 标签的 href 设置如下:

href="javascript:var win=window.open('LayerPreview.aspx?tLNUMCswKSXpnGpQy1rWev26c5euEUa97eqiZYdDpMvDcKNbi6Z05Q3WC5DhG%2b8HJFGHAo%2fHiSFrtEEsHiConkpaT2aJ2WV0Hxxqo2l1bmkNdAotVVvI%2fT4JtE%2fc3dJ8MEAhM3NJZ15qk3fkW87q9A%3d%3d','','width=800,height=600,resizable=no','true');"

但是点击链接的时候,在LayerPreview.aspx的Page_Load中,查询字符串已经被修改了,即原来的:

tLNUMCswKSXpnGpQy1rWev26c5euEUa97eqiZYdDpMvDcKNbi6Z05Q3WC5DhG%2b8HJFGHAo%2fHiSFrtEEsHiConkpaT2aJ2WV0Hxxqo2l1bmkNdAotVVvI%2fT4JtE%2fc3dJ8MEAhM3NJZ15qk3fkW87q9A%3d%3d'

变成:

tLNUMCswKSXpnGpQy1rWev26c5euEUa97eqiZYdDpMvDcKNbi6Z05Q3WC5DhG+8HJFGHAo%2fHiSFrtEEsHiConkpaT2aJ2WV0Hxxqo2l1bmkNdAotVVvI%2fT4JtE%2fc3dJ8MEAhM3NJZ15qk3fkW87q9A=%3d

显然,这搞砸了我的解码。

有任何想法吗?

谢谢,

卡尔。

编辑:我已经在使用 System.Web.HttpUtility.UrlEncode 和 System.Web.HttpUtility.Decode。

这是操作:

  1. 生成纯文本查询字符串。
  2. 加密查询字符串。
  3. 通过 System.Web.HttpUtility.UrlEncode 运行它。

在读取查询字符串时,我只是做相反的事情:

  1. 通过 System.Web.HttpUtility.UrlDecode 运行它。
  2. 解密查询字符串。
  3. 读取查询字符串。

这在我的网络应用程序中的其他任何地方都有效,但在为 window.open url 或任何其他 javascript 方法分配链接时无效。

4

4 回答 4

4

使用Uri.EscapeDataStringUri.UnescapeDataString而不是 Uri.EscapeUriString(URLEscape 与 EscapeUriString 相同)。

urlencode 和 urldecode 用于 url。urlencode 将空格转换为 + 并单独留下“/”,因为它假定这些是 url 中的有效字符(它们是)。urldecode 则相反,将 + 转换为空格。urldecode 不希望看到 + 被转换。我想它也不希望有效的 URL 中包含“==”。通常是一堆用“&”分隔的“x=y”。“=”连续两次没有意义,所以它只转换了一次。

但是您不希望 + 转换为空格并返回,您想要 %2b 或其他什么。您不是在转义 URL,而是在转义将在 url 中的数据字符串。在 .NET 中使用 Uri.EscapeDataString 和 Uri.UnescapeDataString。

(你的“加密”输出的是 0-9 az AZ + /,一共 64 个不同的字符,末尾有 ==。所以我们不要像 base64 那样称它为“加密”。原始数据是一些二进制的,所以我猜测那是加密数据。)

http://codeidol.com/csharp/csharpckbk2/Web/Escaping-and-Unescaping-Data-for-the-Web/

于 2009-05-07T15:22:40.343 回答
3

您的字符串包含一些将被转义的字符,我相信这就是发生在您身上的事情。我认为您可能需要使用URLEncodeand URLDecode。您可以在 javascript 或服务器端执行此操作,具体取决于您如何获得该长字符串(加密文本?)。

于 2009-05-07T14:35:27.197 回答
1

我面临同样的问题。当我们使用window.openinhref属性打开窗口时会出现此问题。

window.open如果您尝试从 javascript调用相同的问题,则不会发生相同的问题。

解决此问题的方法是在使用 inwindow.open函数之前将您的 url 解码两次 href attribute

所以请按照以下步骤

  • 生成纯文本查询字符串。

  • 加密查询字符串。

  • 运行它System.Web.HttpUtility.UrlEncode

  • 再次运行它System.Web.HttpUtility.UrlEncode

于 2011-11-18T17:15:07.720 回答
0

您的原始查询参数包含许多百分比符号。我的猜测是这些再次被解释(连同以下 2 或 3 个字符,在谷歌搜索 URL 编码)。如果确实如此,请查看您是否可以以某种方式转义 % 符号,或“编码”它们。

于 2009-05-07T14:35:53.357 回答