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.