0

假设我们有两个页面: pageX.aspxpageY.aspx。这些页面利用浏览器顶部的母版页,用户可以在其中选择更改网站的语言。这些语言选择采用图像按钮(国家标志)的形式,但它们不使用 PostbackUrl 属性。相反,他们只使用事件处理程序。一种这样的图像处理程序:

protected void imgbtnEnglish_Click(object sender, ImageClickEventArgs e)
{
    HttpCookie aCookie = new HttpCookie("language");
    aCookie.Value = "en-US";
    aCookie.Expires = DateTime.Now.AddDays(365);
    Response.Cookies.Add(aCookie);

    Response.Redirect(Request.RawUrl);
}

pageX.aspx包含一个具有属性的图像按钮PostbackUrl="pageY.aspx"。这个图像按钮的唯一目的是把我们带到pageY.aspx

当按下该图像按钮时,正如预期的那样,我们被带到pageY.aspx

现在这对我来说是个谜:当我在浏览器中按 BACK (不是控件或任何东西,只是好的旧后退按钮)时,我回到pageX.aspx,这很棒!......除了,似乎是主人顶部的页面认为我仍在pageY.aspx!因为即使我现在回到屏幕上的pageX.aspx,单击顶部的任何标志都会将我带回pageY.aspx

我唯一能从逻辑上推断的是,由于某种原因,由于它是一个 PostbackUrl,并且它将表单提交到服务器,“返回”只能在本地识别为发送的表单,而不是整个页面(包括母版页)。因此,通过“返回”,我实际上只是在表单中“返回”,而不是表单和母版页。

我为解决我的问题所做的就是使将我带到pageY.aspx的图像按钮不使用 PostbackUrl,而是使用带有一行的 Click 事件处理程序:Response.Redirect("pageY.aspx"); 当我这样做时,它工作正常。

我想了解为什么会发生这种情况,以及 Click 事件处理程序解决方案是否是最佳实践/正确解决方案,而不是使用 PostbackUrl 属性。

4

2 回答 2

1

当按下后退按钮时,浏览器从缓存中恢复页面以及最新的表单数据,例如文本框保留其输入的值。但是,Opera 尝试变得更智能一些,并且也恢复了 JavaScript 的最新状态。

设置 PostBackUrl 意味着,当单击按钮时,使用 JavaScript 更改表单操作并将表单发布到此新 URL。因此,当您在 Opera 中按下返回时,它会恢复页面以及对表单操作的 JavaScript 更改,这意味着所有后续提交都将转到这个新 URL。

我不喜欢使用 PostBackUrl,因为它只适用于启用 JavaScript。使用 Response.Redirect 服务器端和 Hyperlinks 客户端是更好的解决方案。

于 2012-06-15T14:37:14.370 回答
0

PostbackUrl 与 NavigateUrl

基本上使用 NavigateURL,您正在执行 POST。Response.Redirect 会做一个 GET。我不完全确定您为什么会看到这种特殊行为,但它很可能是您的浏览器。你使用的是什么浏览器?您尝试过哪些其他浏览器?

至于最好的方法是什么,我认为你最好忘记 ASP.NET 控件并这样做:

<a href="pageY.aspx"><img src="foo.png" /></a>
于 2012-06-15T08:29:47.223 回答