Response.Redirect到新窗口

123

我想使用 Response.Redirect("MyPage.aspx") 在一个新的浏览器窗口中打开页面。我之前曾经做过这样的事情,但是没有使用JavaScript注册脚本方法。我只是不记得怎么做了?

21个回答

116

我刚刚找到了答案,它有效 :)

你需要在服务器端的链接/按钮中添加以下内容:

OnClientClick="aspnetForm.target ='_blank';"

我的整个按钮代码看起来像这样:

<asp:LinkButton ID="myButton" runat="server" Text="Click Me!" 
                OnClick="myButton_Click" 
                OnClientClick="aspnetForm.target ='_blank';"/>

在服务器端的OnClick事件中,我执行了Response.Redirect("MyPage.aspx");,并且页面会在新窗口中打开。
你需要添加的另一部分是修复表单的目标,否则每个链接都会在新窗口中打开。为此,请在弹出窗口的头部添加以下内容。
<script type="text/javascript">
    function fixform() {
        if (opener.document.getElementById("aspnetForm").target != "_blank") return;
        opener.document.getElementById("aspnetForm").target = "";
        opener.document.getElementById("aspnetForm").action = opener.location.href;
    }
</script>

并且

<body onload="fixform()">

2
不行,因为这会使用JavaScript来更改表单的目标。相反,页面将像正常提交一样。 - Toby Mills
1
在我的情况下,某种原因它不起作用。我正在新窗口中打开相同的页面,并将响应写入该页面。但是当我在主页面中使用fixform()方法时,它会抛出错误,指出文档为空。不确定为什么它会抛出异常,仍在尝试找到解决方案。虽然我已经通过在该页面上的其他按钮上使用onClientClick="aspnetForm.target='';"属性提出了一个临时解决方案。 - JPReddy
1
我刚刚尝试了一下,发现不能使用 OnClientClick="aspnetForm.target ='_blank';",而是要使用 OnClientClick="document.getElementById('Form').target ='_blank';" - colincameron
是的,它对我起作用了,但它会在新标签页中打开页面而不是在新窗口中。我该如何在新窗口中打开我的页面? - Shilpa Soni
@ShilpaSoni 这取决于浏览器设置,除非使用模态框或消息框,否则您无法在代码中强制打开新窗口而不是新标签页。据我所知,没有其他方法。 - eddie_cat
显示剩余5条评论

63

你可以将其用作扩展方法。

public static class ResponseHelper
{ 
    public static void Redirect(this HttpResponse response, string url, string target, string windowFeatures) 
    { 

        if ((String.IsNullOrEmpty(target) || target.Equals("_self", StringComparison.OrdinalIgnoreCase)) && String.IsNullOrEmpty(windowFeatures)) 
        { 
            response.Redirect(url); 
        } 
        else 
        { 
            Page page = (Page)HttpContext.Current.Handler; 

            if (page == null) 
            { 
                throw new InvalidOperationException("Cannot redirect to new window outside Page context."); 
            } 
            url = page.ResolveClientUrl(url); 

            string script; 
            if (!String.IsNullOrEmpty(windowFeatures)) 
            { 
                script = @"window.open(""{0}"", ""{1}"", ""{2}"");"; 
            } 
            else 
            { 
                script = @"window.open(""{0}"", ""{1}"");"; 
            }
            script = String.Format(script, url, target, windowFeatures); 
            ScriptManager.RegisterStartupScript(page, typeof(Page), "Redirect", script, true); 
        } 
    }
}

使用这个方法可以很好地覆盖实际的响应对象

Response.Redirect(redirectURL, "_blank", "menubar=0,scrollbars=1,width=780,height=900,top=10");

1
我需要发送什么作为第一个参数? - Raghuveera
老兄,这是一个真正可行的绝妙解决方案!谢谢你。 - Klaus Nji
1
优秀的可重用解决方案!唯一的缺点是新窗口被弹出拦截器阻止。 - MeanGreen
第一个参数是您当前的 Response 对象。 - Futureproof
感谢您的反馈! - Sasa Tancev

28

通过单击事件处理程序构建您的URL:

string strUrl = "/some/url/path" + myvar;

那么:

ScriptManager.RegisterStartupScript(Page, Page.GetType(), "popup", "window.open('" + strUrl + "','_blank')", true);

弹出窗口拦截器阻止了该URL,有其他方法可以解决吗? - Rafay
4
在这个例子中,由于它是由代码发起而不是用户操作,window.open将始终被视为“弹出窗口”。如果当用户单击一个元素时调用了window.open,则应该通过这种方式绕过浏览器阻止弹出窗口的操作。 - steve
@steve,这是一个非常好的且非常简单的解决方案。我使用了你的方法来将 Response.Redirect 到一个弹出窗口。 - Sunil

26

由于Response.Redirect是在服务器上启动的,因此无法使用它进行操作。

如果您可以直接编写到响应流中,可以尝试以下操作:

response.write("<script>");
response.write("window.open('page.html','_blank')");
response.write("</script>");

3
这个功能本来是可以正常工作的,但是当我所在页面中的按钮位置发生变化时,似乎CSS或DIVS也受到了影响。 - Etienne
每次来回切换时都会弹出新窗口。 - devXen

14

fixform技巧很妙,但是:

  1. 您可能无法访问加载到新窗口中的代码。

  2. 即使您可以访问,您也要依赖于它始终能够无错误地加载。

  3. 您还要依赖于用户在其他页面得到加载和运行fixform之前不会单击另一个按钮。

我建议改为这样做:

OnClientClick="aspnetForm.target ='_blank';setTimeout('fixform()', 500);"

在同一页上设置 fixform,看起来像这样:

function fixform() {
   document.getElementById("aspnetForm").target = '';
}

11

你也可以在后台代码中像这样使用

ClientScript.RegisterStartupScript(this.Page.GetType(), "",
  "window.open('page.aspx','Graph','height=400,width=500');", true);

2
这对我很有效,基本上是 Abhishek Shrivastava 上面解决方案的简短版本。但是需要注意一些问题。首先,这将触发弹出窗口拦截器。特别是,在启用弹出窗口拦截器的情况下,它在 Safari 5.0 中根本不起作用,因为 Safari 不会提示您已阻止的弹出窗口并且不允许您进行弹出窗口例外处理。其次,Chrome 忽略 window.open 的 page 参数。因此,即使使用 window.open('page.aspx','_blank');,它仍会在新窗口中打开它,并禁用导航栏和缺少导航按钮,而不是新标签页。 - Kasey Speakman

8

使用Response.Redirect是无法实现此功能的,因为它发生在服务器端,无法指示浏览器执行该操作。那么初始窗口中会剩下什么?一片空白的页面吗?


8

弹出方法将为访问者提供一个安全的问题。

这是我的简单解决方案:并且在任何地方都能正常工作。

<script type="text/javascript">
    function targetMeBlank() {
        document.forms[0].target = "_blank";
    }
</script>

<asp:linkbutton  runat="server" ID="lnkbtn1" Text="target me to blank dude" OnClick="lnkbtn1_Click" OnClientClick="targetMeBlank();"/>

我无法编辑您的帖子,因为它至少不是6个字符,但它不是'("href")',而是'["href"]'。 - Nickso

6
<asp:Button ID="btnNewEntry" runat="Server" CssClass="button" Text="New Entry"

OnClick="btnNewEntry_Click" OnClientClick="aspnetForm.target ='_blank';"/>

protected void btnNewEntry_Click(object sender, EventArgs e)
{
    Response.Redirect("New.aspx");
}

来源: http://dotnetchris.wordpress.com/2008/11/04/c-aspnet-responseredirect-open-into-new-window/

这篇文章介绍了如何在新窗口中打开ASP.NET应用程序中的重定向链接。它提供了一些简单的代码示例,演示了如何使用JavaScript来实现这个功能。如果您需要在ASP.NET网站中使用重定向链接并将其打开到新窗口中,那么这篇文章可能会对您有所帮助。

1
它说 aspnetForm 未定义。 - Naresh

4
你也可以使用以下代码在新标签页中打开新页面。
<asp:Button ID="Button1" runat="server" Text="Go" 
  OnClientClick="window.open('yourPage.aspx');return false;" 
  onclick="Button3_Click" />

只需要在按钮事件后调用 Response.Redirect("yourPage.aspx"); 即可。


该方法会触发_OnClientClick_和_onclick_两个事件。这意味着既会在新窗口中打开某个页面,同时也会在当前页面执行某些操作。 - Manivannan Nagarajan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接