你的问题有点牵扯,我会解释一些背景故事:
标签和窗口,以及为什么你不应该对浏览器做出任何假设或要求
传统上,超链接(例如<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" />
而不使用任何服务器端逻辑。在这种情况下,我不明白为什么你甚至需要这样做。