假设我们有两个页面: pageX.aspx 和 pageY.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属性。
答案 0 :(得分:1)
当按下后退按钮时,浏览器将页面与最新的表单数据一起从缓存中恢复,例如文本框保留其输入的值。但是,Opera试图变得更聪明一些,并恢复JavaScript的最新状态。
设置PostBackUrl意味着,当单击该按钮时,将使用JavaScript和发布到此新URL的表单更改表单操作。因此,当您在Opera中按下它时,它会恢复页面以及对表单操作的JavaScript更改,这意味着所有后续提交都将转到此新URL。
我不喜欢使用PostBackUrl,因为它只适用于启用JavaScript。使用Response.Redirect服务器端和超链接客户端是更好的解决方案。
答案 1 :(得分:0)
基本上使用NavigateURL,您正在进行POST。 Response.Redirect会做一个GET。我不完全确定你为什么会看到这种特殊行为,但它很可能是你的浏览器。你使用的是什么浏览器?您尝试了哪些其他浏览器?
至于最好的方法是什么,我认为最好忘记ASP.NET控件并执行此操作:
<a href="pageY.aspx"><img src="foo.png" /></a>