Response.Redirect到新窗口


118

我想做一个,Response.Redirect("MyPage.aspx")但是要在新的浏览器窗口中打开它。我之前没有使用JavaScript注册脚本方法就已经这样做了。我只是不记得如何?

Answers:


114

我刚刚找到了答案,它可以工作:)

您需要将以下内容添加到服务器端链接/按钮:

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");然后在新窗口中打开页面。

您需要添加的另一部分是修复表单的目标,否则每个链接都将在新窗口中打开。为此,在POPUP窗口的标题中添加以下内容。

<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

另外,如果您想重定向到虚拟目录之外的页面,则可能会违反安全性。
Drejc

1
就我而言,它不起作用。我要在新窗口中打开同一页面,并将响应写入该页面。但是,当我在主页上保留fixform()方法时,会抛出错误,指出document为null。不知道为什么它还在尝试寻找解决方案。尽管我已经通过使用onClientClick =“ aspnetForm.target =”''提出了一个临时解决方案;“ 该页面上其他按钮的属性。
JPReddy 2010年

1
我已经尝试过了,而不是OnClientClick="aspnetForm.target ='_blank';"不得不使用OnClientClick="document.getElementById('Form').target ='_blank';"
colincameron 2012年

是的,它确实对我有用,但它是在新窗口中而不是新窗口中打开页面。如何在新窗口中打开页面?
Shilpa Soni 2014年

61

您可以使用它作为扩展方法

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对象进行很好的覆盖

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

1
我要发送的第一个参数是什么?
Raghuveera

杜德(Dude),这是一个切实可行的出色解决方案!谢谢。
2014年

优秀的可重用解决方案!唯一的缺点是新窗口被弹出窗口阻止程序阻止了。
MeanGreen

第一个参数是您当前的Response对象。
Futureproof'3

感谢您的反馈!
Sasa Tancev

26

因为Response.Redirect是在服务器上启动的,所以您不能使用它来完成它。

如果您可以直接写入Response流,则可以尝试以下操作:

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

3
这项工作有效,但随后我的按钮所在的页面发生了更改,例如CSS或DIVS受到了影响。
Etienne

每次来回时都会弹出新窗口。
devXen11 2011年

26

通过点击事件处理程序构造您的网址:

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

然后:

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

弹出窗口阻止程序会阻止此URL的其他任何访问?
拉斐

3
在本示例中,因为window.open是由代码而非用户操作启动的,所以在此示例中,它将始终被视为“弹出窗口”。如果在用户单击某个元素时调用window.open,则应该避开浏览器阻止的弹出窗口操作。
2012年

@steve,这是一个非常出色且非常简单的解决方案。我使用了您的方法来响应。重定向到弹出窗口。
Sunil 2014年

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


4

如果您可以重新组织代码以使您不需要回发,则可以在按钮的PreRender事件中使用此代码:

protected void MyButton_OnPreRender(object sender, EventArgs e)
{
    string URL = "~/MyPage.aspx";
    URL = Page.ResolveClientUrl(URL);
    MyButton.OnClientClick = "window.open('" + URL + "'); return false;";
}

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 2014年

3

我总是使用此代码... 使用此代码

String clientScriptName = "ButtonClickScript";
Type clientScriptType = this.GetType ();

// Get a ClientScriptManager reference from the Page class.
ClientScriptManager clientScript = Page.ClientScript;

// Check to see if the client script is already registered.
if (!clientScript.IsClientScriptBlockRegistered (clientScriptType, clientScriptName))
    {
     StringBuilder sb = new StringBuilder ();
     sb.Append ("<script type='text/javascript'>");
     sb.Append ("window.open(' " + url + "')"); //URL = where you want to redirect.
     sb.Append ("</script>");
     clientScript.RegisterClientScriptBlock (clientScriptType, clientScriptName, sb.ToString ());
     }

此代码永远不会影响CSS类,因此父窗口完全不会受到影响!
Abhishek Shrivastava

1
好吧,这对于MVC无疑是一个有力的论据。不要从代码中删除任何东西。离得很远。像这样的东西典型地代表着网络表单,令人毛骨悚然。
MrBoJangles

所有这些代码都可以压缩为一行。请参阅下面的shalu解决方案。效果完全相同,但没有所有不必要的膨胀。
Kasey Speakman

1

这是一个基于上述@takrl和@tom的答案的jQuery版本。注意:没有硬编码的形式(上面称为aspnetForm),也没有使用Firefox可能会发现问题的直接form.target引用:

<asp:Button ID="btnSubmit" OnClientClick="openNewWin();"  Text="Submit" OnClick="btn_OnClick" runat="server"/>

然后在SAME页面上引用的js文件中:

function openNewWin () {
    $('form').attr('target','_blank');
    setTimeout('resetFormTarget()', 500);
}

function resetFormTarget(){
    $('form').attr('target','');
}

1

我用Hyperlink代替LinkBut​​ton,它工作得很好,它具有Target属性,因此解决了我的问题。有使用Response.Write的解决方案,但是那弄乱了我的布局,而使用ScriptManager的解决方案在每次刷新或返回时都重新打开了窗口。所以这就是我解决的方法:

<asp:HyperLink CssClass="hlk11" ID="hlkLink" runat="server" Text='<%# Eval("LinkText") %>' Visible='<%# !(bool)Eval("IsDocument") %>' Target="_blank" NavigateUrl='<%# Eval("WebAddress") %>'></asp:HyperLink>

0

您可能要使用Page.RegisterStartupScript来确保JavaScript在页面加载时触发。


0

您可以像我在这里一样使用ajax 从asp.net代码后面打开新窗口http://alexandershapovalov.com/open-new-window-from-code-behind-in-aspnet-68/

protected void Page_Load(object sender, EventArgs e)
{
    Calendar1.SelectionChanged += CalendarSelectionChanged;
}

private void CalendarSelectionChanged(object sender, EventArgs e)
{
    DateTime selectedDate = ((Calendar) sender).SelectedDate;
    string url = "HistoryRates.aspx?date="
+ HttpUtility.UrlEncode(selectedDate.ToShortDateString());
    ScriptManager.RegisterClientScriptBlock(this, GetType(),
"rates" + selectedDate, "openWindow('" + url + "');", true);
}

0

前面的示例对我都不起作用,因此我决定发布解决方案。在按钮单击事件中,下面是代码。

Dim URL As String = "http://www.google/?Search=" + txtExample.Text.ToString
URL = Page.ResolveClientUrl(URL)
btnSearch.OnClientClick = "window.open('" + URL + "'); return false;"

我不得不修改其他人的response.redirect代码才能在新的浏览器中打开。


0

我使用了这种方法,它不需要您在弹出窗口上做任何事情(由于重定向到PDF文件,我没有访问权限)。它还使用类。

$(function () {
    //--- setup click event for elements that use a response.redirect in code behind but should open in a new window
    $(".new-window").on("click", function () {

        //--- change the form's target
        $("#aspnetForm").prop("target", "_blank");

        //--- change the target back after the window has opened
        setTimeout(function () {
            $("#aspnetForm").prop("target", "");
        }, 1);
    });
});

若要使用,请将“ new-window”类添加到任何元素。您无需向body标签添加任何内容。此功能设置新窗口并将其修复为相同的功能。


0

我这样做是通过将target =“ _ blank”放在linkbutton中

<asp:LinkButton ID="btn" runat="server" CausesValidation="false"  Text="Print" Visible="false" target="_blank"  />

然后在页面加载的代码背后,只需设置href属性:

btn.Attributes("href") = String.Format(ResolveUrl("~/") + "test/TestForm.aspx?formId={0}", formId)

0

的HTML

<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" OnClientClick = "SetTarget();" />

Javascript:

function SetTarget() {
 document.forms[0].target = "_blank";}

和代码背后:

Response.Redirect(URL); 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.