2

关于这个主题有几个讨论(最接近的可能是Redirecting new tab on button click.(Response.Redirect) in asp.net C#),但没有一个适合我的需要。这是我的情况:

编码 <asp:ImageButton ID="SearchButton"
runat="server" OnClick="SearchButton_Click" OnClientClick="target='_blank';"/>

允许我处理“代码隐藏”中的事件(以处理此重定向的 URL),如果此标记位于“常规”.aspx 页面中,并且代码中的事件处理程序 SearchButton_Click 一切正常。

我的情况与此不同,因为此代码驻留在 .ascx(用户控件)元素中,该元素在“顶级”页面上动态加载。相同的代码导致当前页面被此“搜索页面”替换,甚至无法使用浏览器的后退按钮返回到原始上下文。

请注意,我更愿意在 C# 中将其处理为

protected void SearchButton_Click(object sender, EventArgs e)
{
    string what = queryText.Text;
    Response.Redirect(baseUrl + what);
}

每一个建议都表示赞赏。

4

3 回答 3

8

你的问题有点牵扯,我会解释一些背景故事:

标签和窗口,以及为什么你不应该对浏览器做出任何假设或要求

传统上,超链接(例如<a href="foo">)在与原始文档相同的窗口视口中打开链接。这是约定,也是用户单击链接时所期望的。除非您确切地知道用户期望什么,否则您永远不应该在新窗口、选项卡或文档内 iframe 弹出窗口或 Ajax 对话框中打开链接。

在选项卡式浏览器出现之前,超链接target="_blank"会导致它们在新窗口中打开。近年来,选项卡式浏览器通过在新选项卡中打开它们来防止任务栏垃圾邮件 - 但这是用户偏好。浏览器选项卡不会通过任何公共 API 暴露给浏览器,因此您的应用程序永远不会知道是否target="_blank"在新窗口中打开、新选项卡或什至相同的窗口视口(除非您在客户端脚本中监视窗口事件)。

我认为应用程序永远不应该让用户感到惊讶,并且用户总是希望一个链接在同一个窗口中打开一些东西。

当 XHTML1.x 发布时,他们target完全删除了该属性,因为它最初是为框架设计的(在 XHTML 中也被删除了),因为委员会认为该_blank功能被滥用了,并且因为 XHTML 可以在各种设备上呈现可能不支持多个窗口(想想:2005 年的功能手机和糟糕的网络浏览器)。

...不幸的是,他们把它带回了 HTML5,哦,好吧。我想它确实有一些合法的用途,但无论如何。

ASP.NET Web 窗体事件(例如 _Click)

(这就是为什么我放弃了 MVC 的 Web 表单,我强烈建议你也这样做)。

ASP.NET Web 窗体通过将整个页面包装在一个<form>元素中来模拟 WinForms,然后将客户端脚本添加到所有控件元素,例如<asp:Hyperlink><asp:Button>这会导致整个<form>将 POST 提交回服务器,从而重新创建表单并在处理期间引发这些事件。这是一个特别巧妙的设计,如果被误导的话。幸运的是,它已被 MVC 淘汰,但我离题了。

...这意味着当您在服务器代码中<asp:Hyperlink>使用_Click处理程序时,这意味着您正在获取<a onclick="__doPostback()">而不是<a href="URL to redirect to" />,因此它提供了非常糟糕的用户体验,使事情变得脆弱(因为不在<form>元素内的数据不会被保存) , 并且意味着您可能会遇到这样的问题,其中不清楚(从客户端的角度)执行逻辑的位置:逻辑上,链接应该由客户端执行,而不是服务器。

响应.重定向

Response.Redirect 是向客户端发送 HTTP 3xx 重定向并结束页面进一步处理的快捷方式。它发回这个重定向而不是完整的页面响应。HTTP 重定向只能告诉浏览器跟随它到新位置,没有其他选项可以指定。

结论

将这些东西拼凑在一起,您会发现无法<asp:Hyperlink onclick="delegate() { Response.Redirect("someUrl") }" />someUrl新的浏览器选项卡中加载。

我建议您直接使用<a href="someUrl" />而不使用任何服务器端逻辑。在这种情况下,我不明白为什么你甚至需要这样做。

于 2013-05-31T00:49:11.007 回答
0

如果你开箱即用,总有办法解决这个问题。

看看这个 SO 帖子。响应重定向到新窗口。我采用了扩展方法,它的工作方式。是的,如果他们禁用 javascript,它不会,但谁这样做呢?不是你的普通人,他们可能已经习惯了不启用 javascript 的问题。

于 2013-10-11T21:22:54.500 回答
0

或者,您可以这样做:

Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim url As String = "Page2.aspx"
Dim sb As New StringBuilder()
sb.Append("<script type = 'text/javascript'>")
sb.Append("window.open('")
sb.Append(url)
sb.Append("');")
sb.Append("</script>")
ClientScript.RegisterStartupScript(Me.GetType(), _
          "script", sb.ToString())

结束子

于 2021-03-18T21:35:09.613 回答