【问题标题】:C# URL QueryString TroubleC# URL QueryString 问题
【发布时间】:2012-01-02 21:54:40
【问题描述】:

我有一个 WP7 项目,我在其中使用以下代码。它通常可以正常工作,但是我得到了一个奇怪的结果,其中传递了一些特定的字符串。

Service = "3q%23L3t41tGfXQDTaZMbn%23w%3D%3D?f"

NavigationService.Navigate(new Uri("/Details.xaml?service=" + Service, UriKind.Relative));

下一页:

NavigationContext.QueryString.TryGetValue("service", out Service1);

Service1 现在 = 3q#L3t41tGfXQDTaZMbn#w==?f

为什么字符串变了?

【问题讨论】:

    标签: c# .net windows-phone-7 query-string


    【解决方案1】:

    字符串没有改变,但你以两种不同的方式看待它。

    3q#L3t41tGfXQDTaZMbn#w==?f 编码为URI 内容的方式是3q%23L3t41tGfXQDTaZMbn%23w%3D%3D?f。 (实际上,它是3q%23L3t41tGfXQDTaZMbn%23w%3D%3D%3Ff,但在这种情况下,您在接近结尾的? 没有正确转义到%3F 时逃脱了。

    您编写字符串的方式,期望接收它转义。

    您读取字符串的方式,未转义返回。

    一切都非常完美,真的。

    当您需要再次写入字符串时,只需再次转义即可:

    Service = Uri.EscapeDataString(Service1);
    

    【讨论】:

      【解决方案2】:

      在您的第一个代码 sn-p 中,字符串是 URL 编码的。

      在第二个代码 sn-p 中,字符串是 URL 解码的。

      它们本质上是相同的字符串,只是应用/删除了编码。

      例如:urlencoding # 你得到%23

      如需进一步阅读,请查看此wikipedia article on encoding

      由于 HttpUtility 不是 WP7 Silverlight 堆栈的一部分,我建议使用 Uri.EscapeUriString 转义任何尚未转义的 URI。

      【讨论】:

      • Uri.EscapeUriString 不合适,他们需要Uri.EscapeDataString。前者只是转义不能出现在 URI 中的字符,后者也转义 URI 中具有特殊含义的字符,所以这就是他们想要的。 (公平地说,MSDN 文档并不清楚两者之间的区别)。
      【解决方案3】:

      如果您希望字符串毫发无损地通过,您可能应该对字符串进行 URL 编码。

      【讨论】:

      • 很难知道他的期望。他只是注意到它发生了变化,而不是他想要哪个版本。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多