Antwort. In neues Fenster umleiten

118

Ich möchte eine machen Response.Redirect("MyPage.aspx"), habe sie aber in einem neuen Browserfenster geöffnet. Ich habe dies zuvor ohne Verwendung der JavaScript-Registerskriptmethode getan. Ich kann mich einfach nicht erinnern wie?

hims056
quelle

Antworten:

114

Ich habe gerade die Antwort gefunden und es funktioniert :)

Sie müssen Ihrem serverseitigen Link / Ihrer serverseitigen Schaltfläche 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';"/>

Auf der Serverseite mache ich OnClick a Response.Redirect("MyPage.aspx");und die Seite wird in einem neuen Fenster geöffnet.

Der andere Teil, den Sie hinzufügen müssen, besteht darin, das Ziel des Formulars festzulegen. Andernfalls wird jeder Link in einem neuen Fenster geöffnet. 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()">
Miguel
quelle
2
Nein, da dies Javascript verwendet, um das Ziel des Formulars zu ändern. Stattdessen würde die Seite wie gewohnt gesendet.
Toby Mills
Außerdem kann es zu einer Sicherheitsverletzung kommen, wenn Sie zu einer Seite außerhalb Ihres virtuellen Verzeichnisses umleiten möchten.
Drejc
1
Irgendwie funktioniert es in meinem Fall nicht. Ich öffne dieselbe Seite im neuen Fenster und schreibe die Antwort auf diese Seite. Wenn ich jedoch die Methode fixform () auf der Masterseite behalte, wird der Fehler ausgegeben, dass das Dokument null ist. Ich bin mir nicht sicher, warum es immer noch versucht, eine Lösung zu finden. Obwohl ich mit onClientClick = "aspnetForm.target = '';" Eine temporäre Lösung gefunden habe. Eigenschaft für andere Schaltflächen auf dieser Seite.
JPReddy
1
Ich habe es gerade versucht und stattdessen musste OnClientClick="aspnetForm.target ='_blank';"ichOnClientClick="document.getElementById('Form').target ='_blank';"
colincameron
Ja, es hat bei mir funktioniert, aber es öffnet die Seite in einem neuen Tab, nicht in einem neuen Fenster. Wie kann ich meine Seite in einem neuen Fenster öffnen?
Shilpa Soni
61

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 eine nette Überschreibung des eigentlichen Antwortobjekts

Response.Redirect(redirectURL, "_blank", "menubar=0,scrollbars=1,width=780,height=900,top=10");
Sasa Tancev
quelle
1
Was muss ich für das erste Arrgument senden?
Raghuveera
Alter, das ist eine fantastische Lösung, die tatsächlich funktioniert! Danke dir.
Klaus Nji
Hervorragende wiederverwendbare Lösung! Der einzige Nachteil ist die Tatsache, dass das neue Fenster vom Popup-Blocker blockiert wird.
MeanGreen
Das erste Argument ist Ihr aktuelles Antwortobjekt.
Zukunftssicher
Danke für die Rückmeldung!
Sasa Tancev
26

Da Response.Redirect auf dem Server initiiert wird, können Sie dies nicht verwenden.

Wenn Sie direkt in den Antwort-Stream schreiben können, können Sie Folgendes ausprobieren:

response.write("<script>");
response.write("window.open('page.html','_blank')");
response.write("</script>");
JamesSugrue
quelle
3
Dies funktioniert, aber dann werden die Änderungen auf der Seite, auf der sich meine Schaltfläche befindet, wie CSS oder DIVS betroffen.
Etienne
Das neue Fenster öffnet sich jedes Mal, wenn Sie hin und her gehen.
devXen
26

Konstruieren Sie Ihre URL über den Click Event Handler:

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

Dann:

ScriptManager.RegisterStartupScript(Page, Page.GetType(), "popup", "window.open('" + strUrl + "','_blank')", true);
Steve
quelle
Popup-Blocker blockiert die URL irgendein anderes wa um dieses?
Rafay
3
window.open wird in diesem Beispiel immer als "popup" behandelt, da es durch Code und nicht durch eine Benutzeraktion initiiert wird. Wenn window.open aufgerufen wird, wenn der Benutzer auf ein Element klickt, sollte dies die blockierte Popup-Aktion des Browsers umgehen.
Steve
@ Steve, Dies ist eine ausgezeichnete und sehr einfache Lösung. Ich habe Ihren Ansatz für Response.Redirect zu einem Popup verwendet.
Sunil
14

Der Fixform-Trick ist ordentlich, aber:

  1. Möglicherweise haben Sie keinen Zugriff auf den Code, der in das neue Fenster geladen wird.

  2. Selbst wenn Sie dies tun, sind Sie darauf angewiesen, dass es immer fehlerfrei geladen wird.

  3. Und Sie sind darauf angewiesen, dass der Benutzer nicht auf eine andere Schaltfläche klickt, bevor die andere Seite die Möglichkeit erhält, fixform zu laden und auszuführen.

Ich würde stattdessen vorschlagen, dies zu tun:

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

Richten Sie das Fixform auf derselben Seite wie folgt ein :

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

Sie können auf diese Weise auch Code dahinter verwenden

ClientScript.RegisterStartupScript(this.Page.GetType(), "",
  "window.open('page.aspx','Graph','height=400,width=500');", true);
etw
quelle
2
Dies funktioniert gut für mich und ist im Grunde die Kurzversion von Abhishek Shrivastavas obiger Lösung. Es sind jedoch einige Einschränkungen zu beachten. Dies löst zunächst Popup-Blocker aus. Insbesondere funktioniert es in Safari 5.0 überhaupt nicht, wenn der Popup-Blocker aktiviert ist, da Safari Sie nicht zu blockierten Popups auffordert und Sie keine Popup-Ausnahmen machen können. Zweitens ignoriert Chrome das Seitenargument für window.open. Selbst wenn Sie es verwenden window.open('page.aspx','_blank');, wird es in einem neuen Fenster mit deaktivierter Navigationsleiste und fehlenden Navigationsschaltflächen anstelle einer neuen Registerkarte geöffnet.
Kasey Speakman
8

Dies ist mit Response.Redirect nicht möglich, da dies auf der Serverseite geschieht, und kann Ihren Browser nicht anweisen, diese Aktion auszuführen. Was würde im Anfangsfenster übrig bleiben? Eine leere Seite?

John Sheehan
quelle
8

Die Popup-Methode gibt dem Besucher eine sichere Frage.

Hier ist meine einfache Lösung: und überall arbeiten.

<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();"/>
Kursat Turkay
quelle
Ich kann Ihren Beitrag nicht bearbeiten, da er nicht mindestens 6 Zeichen enthält, aber nicht '("href")'. Es ist '["href"]'
Nickso
4

Wenn Sie Ihren Code so umstrukturieren können, dass Sie kein Postback durchführen müssen, können Sie diesen Code im PreRender-Ereignis der Schaltfläche verwenden:

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

Sie können auch den folgenden Code verwenden, um eine neue Seite in einer neuen Registerkarte zu öffnen.

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

Rufen Sie einfach Response.Redirect ("yourPage.aspx") auf. Ereignis hinter dem Knopf.

Zohaib
quelle
Diese Methode löst sowohl OnClientClick als auch Onclick aus . Bedeutete, dass eine Seite im neuen Fenster geöffnet wurde und einige Aktionen auf derselben Seite ausgeführt wurden
Manivannan Nagarajan
3

Ich benutze immer diesen Code ... Verwenden Sie diesen Code

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 ());
     }
Abhishek Shrivastava
quelle
Dieser Code wirkt sich niemals auf die CSS-Klasse aus, sodass das übergeordnete Fenster überhaupt nicht betroffen ist !!
Abhishek Shrivastava
1
Nun, dies ist sicherlich ein starkes Argument für MVC. Nichts von Ihrem Code wegzunehmen. Weit davon entfernt. Es sind solche Dinge, die für Webformulare typisch sind.
MrBoJangles
Der gesamte Code kann zu einer Zeile zusammengefasst werden ... siehe Shalus Lösung unten. Es ist genau der gleiche Effekt, aber ohne all das unnötige Aufblähen.
Kasey Speakman
1

Hier ist eine jQuery-Version, die auf der Antwort von @takrl und @tom oben basiert. Hinweis: Keine fest codierte Formid (oben aspnetForm genannt) und verwendet auch keine direkten form.target-Referenzen, die Firefox möglicherweise als problematisch empfindet:

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

Dann in Ihrer js-Datei, auf die auf der gleichen Seite verwiesen wird:

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

function resetFormTarget(){
    $('form').attr('target','');
}
Ben Barreth
quelle
1

Ich habe Hyperlink anstelle von LinkButton verwendet und es hat einwandfrei funktioniert. Es hat die Target-Eigenschaft, sodass mein Problem gelöst wurde. Es gab die Lösung mit Response.Write, aber das hat mein Layout durcheinander gebracht, und die mit ScriptManager öffnete bei jeder Aktualisierung oder Zurück das Fenster erneut. So habe ich es gelöst:

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

Möglicherweise möchten Sie das Page.RegisterStartupScript verwenden, um sicherzustellen, dass das Javascript beim Laden der Seite ausgelöst wird.

CodeRot
quelle
0

Sie können ein neues Fenster aus dem dahinter liegenden asp.net-Code mit Ajax öffnen, wie ich es hier getan habe. 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);
}
Yaplex
quelle
0

Keines der vorherigen Beispiele hat für mich funktioniert, daher habe ich beschlossen, meine Lösung zu veröffentlichen. In den Schaltflächenklickereignissen ist hier der Code dahinter.

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

Ich musste den response.redirect-Code eines anderen ändern, um ihn in einem neuen Browser zu öffnen.

crh225
quelle
0

Ich habe diesen Ansatz verwendet. Sie müssen im Popup nichts tun (auf das ich keinen Zugriff hatte, weil ich zu einer PDF-Datei umgeleitet habe). Es werden auch Klassen verwendet.

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

Fügen Sie zur Verwendung jedem Element die Klasse "new-window" hinzu. Sie müssen dem Body-Tag nichts hinzufügen. Diese Funktion richtet das neue Fenster ein und korrigiert es in derselben Funktion.

Ricketts
quelle
0

Ich habe dies getan, indem ich target = "_ blank" in den Linkbutton eingefügt habe

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

dann setzen Sie im Codebehind pageload einfach das href-Attribut:

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

HTML

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

Javascript:

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

UND Codebehind:

Response.Redirect(URL); 
Tran Anh Hien
quelle