c# - Response.Redirect zu neuem Fenster




asp.net (17)

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

Wenn Sie direkt in den Antwortstream schreiben können, können Sie Folgendes versuchen:

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

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


Construct Ihre URL über Click-Event-Handler:

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

Dann:

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

Ich benutzte Hyperlink anstelle von LinkButton und es funktionierte gut, es hat die Target-Eigenschaft, so dass es mein Problem gelöst hat. Es gab die Lösung mit Response.Write, aber das war mein Layout verderben, und das mit ScriptManager, bei jeder Aktualisierung oder zurück war das Fenster wieder öffnen. 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>

Hier ist eine jQuery-Version, die auf der Antwort von @takrl und @tom basiert. Hinweis: Kein hardcoded Formid (oben aspnetForm genannt) und auch keine direkten form.target Referenzen, die Firefox als problematisch empfinden könnte:

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

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

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

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

Sie können ein neues Fenster von asp.net Code hinter Ajax öffnen, wie ich hier 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);
}

Der Fixform-Trick ist ordentlich, aber:

  1. Sie haben möglicherweise keinen Zugriff auf den Code, der im neuen Fenster geladen wird.

  2. Selbst wenn Sie das tun, sind Sie darauf angewiesen, dass es immer fehlerfrei lädt.

  3. Und Sie sind davon abhängig, dass der Benutzer nicht auf eine andere Schaltfläche klickt, bevor die andere Seite die Möglichkeit hat, fixform zu laden und auszuführen.

Ich würde vorschlagen, dies stattdessen zu tun:

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

Und richten Sie auf derselben Seite eine Fixform ein, die wie folgt aussieht:

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

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 schöne Überschreibung für das eigentliche Response-Objekt

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

Dies ist mit Response.Redirect nicht möglich, da es auf der Serverseite passiert und es Ihrem Browser nicht erlaubt, diese Aktion auszuführen. Was wäre im ersten Fenster übrig? Eine leere Seite?


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

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

Und rufen Sie einfach Response.Redirect ("yourPage.aspx"); hinter Knopf Ereignis.


Keines der vorherigen Beispiele funktionierte für mich, also entschied ich, meine Lösung zu posten. In der Schaltfläche klicken Ereignisse, hier ist 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 einer anderen Person ändern, um sie in einem neuen Browser zu öffnen.


Popup-Methode wird dem Besucher eine sichere Frage stellen.

Hier ist meine einfache Lösung: und arbeiten alle hier.

<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();"/>

Ich habe diesen Ansatz verwendet, es erfordert nicht, dass Sie etwas in dem Popup tun (auf das ich keinen Zugriff hatte, weil ich auf eine PDF-Datei umgeleitet habe). Es verwendet auch Klassen.

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

Um zu verwenden, fügen Sie die Klasse "neues Fenster" zu irgendeinem Element hinzu. Sie müssen dem body-Tag nichts hinzufügen. Diese Funktion richtet das neue Fenster ein und behebt es in der gleichen Funktion.


Ich tat dies, indem ich target = "_ blank" in den Linkbutton setzte

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

dann im pageload von codebehind einfach das Attribut href setzen:

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

Ich benutze immer diesen Code ... Benutze 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 ());
     }

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

Ich habe die Antwort gefunden und es funktioniert :)

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

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

Mein gesamter Tastencode sieht ungefähr so ​​aus:

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

Auf der Serverseite OnClick mache 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, besteht darin, das Ziel des Formulars zu korrigieren, andernfalls wird jeder Link in einem neuen Fenster geöffnet. Fügen Sie dazu in der Kopfzeile Ihres POPUP-Fensters Folgendes hinzu:

<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()">

Ich hatte vorher ein Problem mit dem Flimmern (viele Steuerelemente im Formular, Benutzersteuerelemente). Versucht fast alles. Das hat bei mir funktioniert:

Haben Sie versucht, dies in Ihre Formularklasse zu bringen?

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= 0x02000000; // WS_EX_COMPOSITED
            cp.ExStyle |= 0x00080000; // WS_EX_LAYERED
            return cp;
        }
    }

Und in Ihrem Konstruktor müssen Sie die doppelte Pufferung aktivieren, sonst wird es nicht funktionieren:

this.DoubleBuffered = true;
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

Es funktioniert nur, wenn Aero aktiviert ist, wenn es das Flackern nicht noch schlimmer machen kann.

und Sie können dies auch hinzufügen

  protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;

                cp.ExStyle |= 0x02000000; // WS_EX_COMPOSITED
            return cp;
        }
    } 

zu Ihrer UserControls-Klasse.





c# asp.net response.redirect