从带查询字符串的URL重定向到不带查询字符串的相同URL

3
我有一个带有查询字符串的页面请求,比如说 http://www.xyz.net/Orders.aspx?OrderID=1。该页面在浏览器中显示。现在页面上有一个 asp:LinkButton,它应该允许用户打开不带查询字符串的页面(就像他直接在浏览器地址栏中输入 http://www.xyz.net/Orders.aspx 一样)。
我有两个想法:
1)使用 LinkButton 的 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(在 LinkButton 中指定的 PostbackURL) - 服务器将新请求的页面发送给浏览器
但是,正如所说的那样,结果并不相同。
我确信我试图解释两个选项之间差异的方式有些错误。但我不知道具体是哪里出了问题。
有人能解释一下真正的区别吗?我真的需要第二个选项的这个额外往返来实现我想要的吗?
提前感谢!
1个回答

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">

谢谢,它有效!但是为什么?为什么不是我问题中的第一个选项?难道PostBackUrl属性的LinkButton不是基本上做同样的事情吗:将页面请求的URL更改为没有QueryString的URL?我的代码中URL是硬编码的,而你的脚本当然更通用。但在我的特殊示例中,为什么结果不一样呢? - Slauma
@egrunin:请忘记我评论中的问题。我不理解POST和GET之间的区别。我实际上应该使用asp:HyperLink,而不是带有PostBackUrl的LinkButton。我现在已经看到,在后台代码中的一个重要的区别是,在HyperLink的情况下,IsPostBack==false,而在LinkButton的情况下,IsPostBack==true,这解释了完全不同的行为。但是使用asp:HyperLink基本上与您的解决方案相同。再次感谢您指导我朝着正确的方向! - Slauma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接