关于这个主题有几个讨论(最接近的可能在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);
}
每一条建议都表示赞赏。
答案 0 :(得分:8)
你的问题有点牵扯,我会解释一些背景故事:
传统的超链接(例如<a href="foo">
)在与原始文档相同的窗口视口中打开了链接。这是惯例,是用户点击链接时的期望。除非您确切知道用户期望的内容,否则永远不应该在新窗口,选项卡或文档内iframe弹出窗口或Ajax对话框中打开链接。
在标签式浏览器出现之前,带有target="_blank"
的超链接会导致它们在新窗口中打开。近年来,选项卡式浏览器通过在新选项卡中打开任务栏防止任务栏垃圾邮件 - 但这是用户首选项。浏览器选项卡不会通过任何公共API公开给浏览器,因此您的应用程序永远不会知道target="_blank"
是否在新窗口,新选项卡或甚至同一窗口视口中打开(除非您监视客户端中的窗口事件) -script)。
我认为应用程序永远不会让用户感到惊讶,并且用户总是希望链接能够在同一个窗口中打开。
当XHTML1.x发布时,他们完全删除了target
属性,因为它最初用于框架(也在XHTML中删除),因为委员会认为_blank
功能正在滥用,因为XHTML可以在各种可能不支持多个窗口的设备上呈现(想想:具有糟糕网络浏览器的2005年版功能手机)。
...不幸的是他们把它带回了HTML5,哦。我想它确实有一些合法用途,但无论如何。
(这就是我为MVC抛弃Web Forms的原因,我强烈建议你也这样做。)
ASP.NET Web窗体通过将整个页面包装在<form>
元素中,然后将客户端脚本添加到所有控件元素(例如<asp:Hyperlink>
和<asp:Button>
来模拟WinForms。导致整个<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" />
。在这种情况下,我无法理解为什么你甚至需要它。
答案 1 :(得分:0)
如果你想开箱即用,总会有办法解决这个问题。
看看这篇SO帖子。 response-redirect-to-new-window。我采用了Extention Method的方式来运行它。是的,如果他们禁用javascript,它不会,但谁这样做?不是你的正常人,他们可能习惯于没有启用javascript的问题。
答案 2 :(得分: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())
结束子