123 Stimmen

Response.Redirect to new window

Ich möchte eine Response.Redirect("MyPage.aspx") aber in einem neuen Browserfenster öffnen lassen. Ich habe das schon einmal gemacht, ohne die JavaScript-Registerskript-Methode zu verwenden. Ich kann mich nur nicht erinnern, wie?

116voto

Ich habe gerade die Antwort gefunden und es funktioniert :)

Sie müssen Ihrem serverseitigen Link/Button Folgendes hinzufügen:

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

Mein gesamter Schaltflächencode sieht ungefähr so aus:

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

In der serverseitigen OnClick-Anweisung führe ich eine Response.Redirect("MyPage.aspx"); und die Seite wird in einem neuen Fenster geöffnet.

Der andere Teil, den Sie hinzufügen müssen, ist das Ziel des Formulars zu fixieren, da sonst jeder Link in einem neuen Fenster geöffnet wird. Fügen Sie dazu Folgendes in die Kopfzeile Ihres POPUP-Fensters ein.

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

und

<body onload="fixform()">

63voto

Sasa Tancev Punkte 635

Sie können dies als Erweiterungsmethode verwenden

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); 
        } 
    }
}

Damit erhalten Sie einen netten Override auf das eigentliche Response-Objekt

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

28voto

steve Punkte 1685

Bauen Sie Ihre Url über einen Click-Event-Handler auf:

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

Dann:

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

26voto

JamesSugrue Punkte 14661

Da Response.Redirect auf dem Server initiiert wird, können Sie es nicht damit machen.

Wenn Sie direkt in den Antwortstrom schreiben können, könnten Sie etwas wie folgt versuchen:

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

14voto

tom Punkte 141

Der Trick mit der festen Form ist ganz nett, aber:

  1. Sie haben möglicherweise keinen Zugang zu dem Code was in dem neuen Fenster geladen wird.

  2. Selbst wenn Sie das tun, sind Sie abhängig von dass es immer fehlerfrei lädt. frei.

  3. Und Sie verlassen sich auf die Tatsache, dass dass der Benutzer nicht auf ein anderes Schaltfläche klickt, bevor die andere Seite eine die Möglichkeit hat, Fixform zu laden und auszuführen.

Ich würde vorschlagen, stattdessen dies zu tun:

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

Und richten Sie fixform auf dem gleiche Seite und sieht so aus:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X