Risposta, reindirizza a una nuova finestra


118

Voglio fare un Response.Redirect("MyPage.aspx")ma aprirlo in una nuova finestra del browser. L'ho già fatto senza utilizzare il metodo dello script di registrazione JavaScript. Non riesco proprio a ricordare come?

Risposte:


114

Ho appena trovato la risposta e funziona :)

È necessario aggiungere quanto segue al collegamento / pulsante lato server:

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

Il mio intero codice del pulsante è simile a:

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

Nel lato server OnClick faccio un Response.Redirect("MyPage.aspx");e la pagina si apre in una nuova finestra.

L'altra parte che devi aggiungere è correggere la destinazione del modulo altrimenti ogni collegamento si aprirà in una nuova finestra. Per farlo, aggiungi quanto segue nell'intestazione della finestra 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>

e

<body onload="fixform()">

2
No, in quanto utilizza javascript per modificare l'obiettivo del modulo. Invece la pagina verrebbe inviata normalmente.
— Toby Mills

Inoltre potresti avere una violazione della sicurezza se desideri reindirizzare a una pagina al di fuori della tua directory virtuale.
— Drejc

1
In qualche modo nel mio caso non funziona. Sto aprendo la stessa pagina nella nuova finestra e sto scrivendo la risposta a quella pagina. Ma quando mantengo il metodo fixform () nella pagina master, viene visualizzato un errore che dice che il documento è nullo. Non sono sicuro del motivo per cui sta ancora cercando di trovare una soluzione. Anche se ho trovato una soluzione temporanea utilizzando onClientClick = "aspnetForm.target = '';" proprietà per altri pulsanti in quella pagina.
— JPReddy

1
Ho appena provato questo e invece OnClientClick="aspnetForm.target ='_blank';"ho dovuto usareOnClientClick="document.getElementById('Form').target ='_blank';"
— colincameron

Sì, ha funzionato per me, ma sta aprendo la pagina in una nuova scheda non in una nuova finestra. Come posso aprire la mia pagina in una nuova finestra?
— Shilpa Soni

61

Puoi usarlo come metodo di estensione

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

Con questo si ottiene un bel sovrascrittura sull'oggetto Response effettivo

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

1
cosa devo inviare per il primo atto?
— Raghuveera

Amico, questa è una soluzione fantastica che funziona davvero! Grazie.
— Klaus Nji

Ottima soluzione riutilizzabile! L'unico aspetto negativo è il fatto che la nuova finestra è bloccata dal blocco popup.
— MeanGreen

Il primo argomento è il tuo oggetto Response corrente.
— Futureproof

Grazie per il feedback!
— Sasa Tancev

26

Poiché Response.Redirect è avviato sul server, non puoi farlo utilizzando quello.

Se puoi scrivere direttamente nel flusso di risposta, potresti provare qualcosa del tipo:

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

3
Questo funziona, ma poi la pagina in cui si trova il mio pulsante cambia, è come se fossero interessati CSS o DIVS.
— Etienne

la nuova finestra si apre ogni volta che si va avanti e indietro.
— devXen

26

Controlla il tuo URL tramite il gestore dell'evento clic:

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

Poi:

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

Il blocco popup blocca l'URL in qualsiasi altro modo intorno a questo ??
— Rafay

3
window.open in questo esempio verrà sempre trattato come un "popup" poiché viene avviato dal codice e non da un'azione dell'utente. se window.open viene chiamato quando l'utente fa clic su un elemento, ciò dovrebbe eludere l'azione popup bloccata dal browser.
— steve

@steve, questa è una soluzione eccellente e molto semplice. Ho usato il tuo approccio a Response.Redirect a un popup.
— Sunil

14

Il trucco del fixform è semplice, ma:

  1. Potresti non avere accesso al codice di ciò che viene caricato nella nuova finestra.

  2. Anche se lo fai, dipendi dal fatto che si carica sempre, senza errori.

  3. E dipendi dal fatto che l'utente non farà clic su un altro pulsante prima che l'altra pagina abbia la possibilità di caricare ed eseguire fixform.

Suggerirei di farlo invece:

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

E imposta fixform sulla stessa pagina , in questo modo:

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

11

Puoi anche usarlo in code behind in questo modo

ClientScript.RegisterStartupScript(this.Page.GetType(), "",
  "window.open('page.aspx','Graph','height=400,width=500');", true);

2
Questo funziona bene per me ed è fondamentalmente la versione breve della soluzione di Abhishek Shrivastava sopra. Tuttavia, ci sono un paio di avvertenze di cui essere a conoscenza. Innanzitutto, questo attiverà il blocco dei popup. In particolare, non funzionerà affatto in Safari 5.0 se il blocco dei popup è abilitato poiché Safari non richiede popup bloccati e non ti consente di fare eccezioni popup. In secondo luogo, Chrome ignora l'argomento della pagina in window.open. Quindi, anche se lo usi, window.open('page.aspx','_blank');lo apri comunque in una nuova finestra con la barra di navigazione disabilitata e i pulsanti di navigazione mancanti invece di una nuova scheda.
— Kasey Speakman

8

Ciò non è possibile con Response.Redirect poiché accade sul lato server e non è possibile indirizzare il browser a eseguire tale azione. Cosa rimarrebbe nella finestra iniziale? Una pagina vuota?


8

Il metodo popup darà una domanda sicura al visitatore.

ecco la mia semplice soluzione: e lavorando ovunque.

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

Non posso modificare il tuo post perché non è composto da almeno 6 caratteri, ma non è '("href")', è '["href"]'
— Nickso


4

Se puoi ri-strutturare il tuo codice in modo da non dover eseguire il postback, puoi utilizzare questo codice nell'evento PreRender del pulsante:

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

4

È inoltre possibile utilizzare il codice seguente per aprire una nuova pagina in una nuova scheda.

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

E chiama semplicemente Response.Redirect ("yourPage.aspx"); dietro l'evento pulsante.


Questo metodo attiva sia OnClientClick che onclick . Significava che qualche pagina è stata aperta nella nuova finestra così come alcune azioni sono state fatte nella stessa pagina
— Manivannan Nagarajan

3

Uso sempre questo codice ... Usa questo codice

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

Questo codice non influenzerà mai la classe CSS, quindi la finestra genitore non sarà affatto influenzata !!
— Abhishek Shrivastava

1
Bene, questo è certamente un argomento forte per MVC. Non togliere nulla al tuo codice. Lontano da esso. Sono cose come questa che caratterizzano i webform, blech.
— MrBoJangles

Tutto questo codice può essere condensato in una riga ... vedere la soluzione di shalu di seguito. È esattamente lo stesso effetto, ma senza tutto il gonfiore non necessario.
— Kasey Speakman

1

Ecco una versione di jQuery basata sulla risposta di @takrl e @tom sopra. Nota: nessun formid hardcoded (denominato aspnetForm sopra) e inoltre non utilizza riferimenti diretti form.target che Firefox potrebbe trovare problematici:

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

Quindi nel tuo file js referenziato nella STESSA pagina:

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

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

1

Ho usato Hyperlink invece di LinkButton e ha funzionato perfettamente, ha la proprietà Target quindi ha risolto il mio problema. C'era la soluzione con Response.Write ma questo stava rovinando il mio layout, e quella con ScriptManager, ad ogni aggiornamento o ritorno, riapriva la finestra. Quindi è così che l'ho risolto:

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

0

Potresti voler usare Page.RegisterStartupScript per assicurarti che javascript si attivi al caricamento della pagina.


0

puoi aprire una nuova finestra dal codice asp.net dietro usando ajax come ho fatto qui 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

Nessuno degli esempi precedenti ha funzionato per me, quindi ho deciso di pubblicare la mia soluzione. Negli eventi di clic del pulsante, ecco il codice sottostante.

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

Dovevo modificare il codice response.redirect di qualcun altro per aprirlo in un nuovo browser.


0

Ho usato questo approccio, non richiede di fare nulla sul popup (a cui non avevo accesso perché stavo reindirizzando a un file PDF). Utilizza anche le classi.

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

Per utilizzarlo, aggiungi la classe "nuova finestra" a qualsiasi elemento. Non è necessario aggiungere nulla al tag body. Questa funzione imposta la nuova finestra e la risolve nella stessa funzione.


0

L'ho fatto inserendo target = "_ blank" nel linkbutton

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

quindi nel codebehind pageload imposta l'attributo 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";}

E codice dietro:

Response.Redirect(URL); 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.