2

我有一个中继器。在中继器内部有一个按钮。在项目命令上我尝试

protected void rptPost_ItemCommand(object source, RepeaterCommandEventArgs e)
{
 int contentID = Int32.Parse(e.CommandArgument.ToString());//Its return 1
 string host = HttpContext.Current.Request.Url.ToString();//its return http://localhost:1377/Forum.aspx
 //string URL = "~/Modules/Forum/PostDetails.aspx?ID=" + contentID +"&BackUrl=" + host;//Need help hear its not work
 string URL = "~/Modules/Forum/PostDetails.aspx?ID="  + contentID ;//Its work
 Response.Redirect(URL); 

}

当我只尝试传递ID它的工作,但如果我尝试传递 multipal url 一个是ID,下一个是Current Page Url它无法找到页面。并且给出了page not found error。我无法理解问题。Url不支持作为参数传递,或者我错过了一些东西。谢谢。

4

1 回答 1

7

这是解决方案:

host = HttpUtility.UrlEncode(host)

这就是它起作用的原因:

您将主机 URL 作为 GET 参数传递。GET 参数是重定向的 GET URI 的一部分。URI 语法包括具有特殊含义的字符,特别是您使用冒号 (:) 和斜杠 (/),它们在 URI 字符串中具有特殊含义。在几乎所有情况下,不应将特殊字符用作 GET 参数数据值的一部分。

对于像您这样需要包含特殊字符的情况,开发了UrlEncoding。UrlEncoding 或 Percent-encoding 将 URI 中的特殊字符替换为使用百分号编码的值。作为 URI 查询处理的一部分,这些转义序列会自动转换回原始特殊字符。该类HttpUtility提供该UrlEncode方法作为转义输入字符串中所有特殊字符的便捷方式。

请注意,对通过 GET 参数传递的所有数据进行 URL 编码是个好主意,除非您可以完全控制正在传递的数据并且可以保证不需要编码。这可能是一个安全问题,因为如果您将用户输入传递给 GET 参数而没有对它进行第一个 URL 编码,攻击者可以包含新参数并以其他方式操纵您的 URI。

于 2012-04-18T04:43:55.890 回答