与母版页相关的回发 URL

本文关键字:URL 母版页 | 更新日期: 2023-09-27 18:37:11

假设我们有两个页面: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,并且它将表单提交到服务器,因此"返回"仅在本地识别已发送的表单,而不是整个页面(包括母版页)。 因此,通过"返回",我实际上只是在窗体中"返回",而不是窗体 AND 母版页。

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

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

与母版页相关的回发 URL

当按下后退按钮时,浏览器从缓存中恢复页面以及最新的表单数据,例如文本框保留其输入的值。然而,Opera试图变得更聪明一点,并恢复了JavaScript的最新状态。

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

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

PostbackUrl vs NavigateUrl

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

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

<a href="pageY.aspx"><img src="foo.png" /></a>