121

我想做一个Response.Redirect("MyPage.aspx"),但让它在新的浏览器窗口中打开。我之前没有使用 JavaScript 注册脚本方法就完成了这项工作。我就是想不起来怎么办?

4

20 回答 20

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

您需要添加的另一部分是修复表单的目标,否则每个链接都将在新窗口中打开。为此,请在 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()">
于 2008-09-19T19:39:17.437 回答
62

您可以将其用作扩展方法

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");
于 2011-02-10T18:50:08.530 回答
27

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

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

然后:

ScriptManager.RegisterStartupScript(Page, Page.GetType(), "popup", "window.open('" + strUrl + "','_blank')", true);
于 2011-08-15T23:26:37.607 回答
26

因为 Response.Redirect 是在服务器上启动的,所以您无法使用它来执行此操作。

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

response.write("<script>");
response.write("window.open('page.html','_blank')");
response.write("</script>");
于 2008-09-19T19:12:01.090 回答
14

fixform 技巧很简洁,但是:

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

  2. 即使你这样做了,你也依赖于它总是加载,没有错误的事实。

  3. 而且您取决于这样一个事实,即用户不会在另一个页面有机会加载和运行 fixform 之前单击另一个按钮。

我建议这样做:

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

并在同一页面上设置 fixform ,如下所示:

function fixform() {
   document.getElementById("aspnetForm").target = '';
}
于 2010-05-13T20:17:06.723 回答
11

您也可以像这样在后面的代码中使用

ClientScript.RegisterStartupScript(this.Page.GetType(), "",
  "window.open('page.aspx','Graph','height=400,width=500');", true);
于 2009-05-06T10:42:47.997 回答
8

这对于 Response.Redirect 是不可能的,因为它发生在服务器端,并且无法指示您的浏览器执行该操作。初始窗口中会留下什么?空白页?

于 2008-09-19T19:11:31.450 回答
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();"/>
于 2014-08-07T17:48:58.160 回答
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/

于 2011-06-03T02:17:47.827 回答
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;";
}
于 2011-07-25T13:08:40.083 回答
4

您还可以使用以下代码在新选项卡中打开新页面。

<asp:Button ID="Button1" runat="server" Text="Go" 
  OnClientClick="window.open('yourPage.aspx');return false;" 
  onclick="Button3_Click" />

只需调用 Response.Redirect("yourPage.aspx"); 按钮事件背后。

于 2013-07-27T21:58:50.260 回答
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 ());
     }
于 2010-08-26T18:14:41.893 回答
1

这是基于上面@takrl 和@tom 的答案的jQuery 版本。注意:没有硬编码的 formid(上面命名为 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','');
}
于 2012-05-04T15:32:23.050 回答
1

我使用超链接而不是链接按钮,它工作得很好,它有目标属性,所以它解决了我的问题。有 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>
于 2012-10-12T13:46:12.800 回答
0

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

于 2008-09-19T19:14:19.463 回答
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 代码才能在新浏览器中打开。

于 2013-11-08T17:17:06.823 回答
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 标记添加任何内容。此函数设置新窗口并将其固定在同一函数中。

于 2014-02-17T16:42:55.970 回答
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);
}
于 2010-10-07T15:00:59.047 回答
0

我通过将 target="_blank" 放在链接按钮中来做到这一点

<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)
于 2015-05-05T10:14:22.310 回答
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); 
于 2018-01-30T02:02:33.710 回答