2010-03-19 114 views
2

我有一个带有QueryString的页面请求,比如http://www.xyz.net/Orders.aspx?OrderID=1。该页面显示在浏览器中。现在,页面上有一个asp:LinkButton,它应该使用户能够在不使用QueryString的情况下打开页面(就像他直接在浏览器的地址栏中输入http://www.xyz.net/Orders.aspx一样)。从带有QueryString的URL重定向到没有QueryString的同一个URL

我有两个想法:

1)使用的LinkBut​​ton的PostBackUrl属性:

<asp:LinkButton ID="LinkButton1" runat="server" Text="Select" 
    PostBackUrl="~/Orders.aspx" /> 

2)在事件处理程序使用 “的redirectUrl”:

<asp:LinkButton ID="LinkButton1" runat="server" Text="Select" 
    OnClick="LinkButton1_Click" /> 

.. .and ...

protected void LinkButton1_Click(object sender, EventArgs e) 
{ 
    Response.Redirect("~/Orders.aspx"); 
} 

在这两种情况下,浏览器的地址栏都显示http://www.xyz.net/Orders.aspx,但没有QueryString,因为我喜欢它。但在第一种情况下,页面根本不会改变。但它应该,因为我在代码隐藏中评估QueryString并根据QueryString是否存在来控制页面的外观。第二个选项按预期工作。

如果我没看错的第二个选项需要额外来回:

  • 浏览器发送请求到服务器
  • 在服务器端
  • 事件处理程序发送重定向URL到浏览器
  • 浏览器再次发送请求到服务器,但随着新的URL
  • 服务器发送新的请求的页面到浏览器

这是否正确?

而第一选项省略该列表中的前两个步骤的上方,从而节省了额外的往返并且导致:

  • 浏览器发送请求给服务器,但用新的URL(一项PostBackUrl指定在LinkBut​​ton的)
  • 服务器发送新的请求的页面到浏览器

但是,正如所说,结果是不一样的。

我敢肯定,我尝试解释两个选项之间的差异是错误的地方。但我不知道究竟在哪里。

有人能解释真正的区别吗?我真的需要第二个选项(2)来实现我想要的吗?

在此先感谢!

更新和解决方案

问题的作者(我)已经证明了这个问题,他不理解HTTP POST之间的区别和GET。有关解决方案,请参阅我在egrunin的回答中的评论。

回答

2

如果你不想打服务器,为什么不使用普通的HTML控件:

function stripQuerystring() 
{ 
    return window.location.protocol + "//" 
     + window.location.host + window.location.pathname; 
} 

<input type="button" 
    onclick="javascript:window.location = stripQuerystring();" 
    value="Click Me"> 
+0

谢谢,它的工作原理!但为什么?为什么不是我的问题中的第一个选项? LinkBut​​ton的'PostBackUrl'属性是否基本相同:将页面请求的URL更改为不使用QueryString的URL? URL是在我的代码中硬编码的,而你的脚本当然是更一般的。但在我的特例中:为什么结果不一样? – Slauma 2010-03-19 17:05:10

+0

@egrunin:忘记我评论中的问题。我不明白POST和GET之间的区别。我实际上应该做的是使用'asp:HyperLink'和'NavigateUrl'属性,而不是带有PostBackUrl的LinkBut​​ton。我现在已经看到,代码隐藏的重要区别在于,如果HyperLink为“IsPostBack == false”,而LinkBut​​ton为“IsPostBack == true”则解释完全不同的行为。但使用asp:HyperLink与您的解决方案基本相同。再次感谢您指点我正确的方向! – Slauma 2010-03-19 17:26:51