web-dev-qa-db-fra.com

Response.Redirect dans une nouvelle fenêtre

Je veux faire un Response.Redirect("MyPage.aspx") mais le faire ouvrir dans une nouvelle fenêtre de navigateur Je l'ai déjà fait auparavant sans utiliser la méthode de script de registre JavaScript. Je ne me souviens plus comment?

115
Fouad

Je viens de trouver la réponse et ça marche :)

Vous devez ajouter les éléments suivants à votre lien/bouton côté serveur:

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

Le code de tout mon bouton ressemble à quelque chose comme:

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

Sur le côté serveur OnClick je fais un Response.Redirect("MyPage.aspx"); et la page est ouverte dans une nouvelle fenêtre.

Vous devez également définir la cible du formulaire, sinon tous les liens s'ouvriront dans une nouvelle fenêtre. Pour ce faire, ajoutez ce qui suit dans l’en-tête de votre fenêtre 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>

et

<body onload="fixform()">
112
Fouad

Vous pouvez l'utiliser comme méthode d'extension

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

Avec cela, vous obtenez une substitution Nice sur l'objet Response réel

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

Comme Response.Redirect est lancé sur le serveur, vous ne pouvez pas le faire avec cela. 

Si vous pouvez écrire directement dans le flux de réponse, vous pouvez essayer quelque chose comme:

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

Construisez votre URL via le gestionnaire d'événements click:

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

Ensuite:

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

L'astuce de fixform est soignée, mais:

  1. Vous n’avez peut-être pas accès au code De ce qui se charge dans la nouvelle fenêtre.

  2. Même si vous le faites, vous dépendez du fait que cela se charge toujours, sans erreur.

  3. Et vous dépendez du fait que l'utilisateur ne cliquera pas sur un autre bouton .__ avant que l'autre page ait une chance de charger et d'exécuter fixform.

Je suggérerais de faire ceci à la place:

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

Et configurez fixform sur la même page, ressemblant à ceci:

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

Vous pouvez également utiliser dans le code derrière de cette façon

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

la méthode popup donnera une question sécurisée au visiteur.

voici ma solution simple: et travailler partout.

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

Ce n'est pas possible avec Response.Redirect, car cela se produit côté serveur et vous ne pouvez pas demander à votre navigateur de prendre cette mesure. Que resterait-il dans la fenêtre initiale? Une page blanche?

8
John Sheehan
<asp:Button ID="btnNewEntry" runat="Server" CssClass="button" Text="New Entry"

OnClick="btnNewEntry_Click" OnClientClick="aspnetForm.target ='_blank';"/>

protected void btnNewEntry_Click(object sender, EventArgs e)
{
    Response.Redirect("New.aspx");
}

Source: http://dotnetchris.wordpress.com/2008/11/04/c-aspnet-responseredirect-open-into-new-window/

6
dpp

Vous pouvez également utiliser le code suivant pour ouvrir une nouvelle page dans un nouvel onglet.

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

Et appelez simplement Response.Redirect ("yourPage.aspx"); derrière l'événement de bouton.

4
Zohaib

Si vous pouvez restructurer votre code afin que vous n'ayez pas besoin de publier (postback), vous pouvez utiliser ce code dans l'événement PreRender du bouton:

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

J'utilise toujours ce code ...Utilisez ce 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 ());
     }
3

J'ai utilisé un lien hypertexte au lieu de LinkButton et cela a fonctionné correctement. Il possède la propriété Target, ce qui a résolu mon problème. Il y avait la solution avec Response.Write, mais cela gâchait ma présentation et celle avec ScriptManager, à chaque actualisation ou retour, rouvrait la fenêtre. Alors voici comment je l'ai résolu:

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

Voici une version de jQuery basée sur la réponse de @takrl et @tom ci-dessus. Remarque: pas de code codé en dur (nommé aspnetForm ci-dessus) et n'utilise pas non plus de références directes à la forme.target que Firefox pourrait trouver problématiques: 

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

Puis dans votre fichier js référencé sur la page SAME:

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

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

vous pouvez ouvrir une nouvelle fenêtre depuis asp.net code behind en utilisant ajax comme je l'ai fait ici 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
Alex Shapovalov

Aucun des exemples précédents ne fonctionnant pour moi, j'ai donc décidé d'afficher ma solution. Dans le bouton des événements, voici le code derrière. 

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

Je devais modifier le code response.redirect de quelqu'un d'autre pour l'ouvrir dans un nouveau navigateur.

0
crh225

HTML

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

Javascript:

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

ET codebehind:

Response.Redirect(URL); 
0
Tran Anh Hien

J'ai utilisé cette approche, elle ne nécessite aucune action de la fenêtre contextuelle (à laquelle je n'avais pas accès car je redirigeais vers un fichier PDF). Il utilise également des classes.

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

Pour l'utiliser, ajoutez la classe "new-window" à n'importe quel élément. Vous n'avez rien besoin d'ajouter à la balise body. Cette fonction configure la nouvelle fenêtre et la corrige dans la même fonction.

0
Ricketts

Je l'ai fait en mettant target = "_ blank" dans le lien

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

puis dans le codebehind pageload juste définir l'attribut href:

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

Vous souhaiterez peut-être utiliser le paramètre Page.RegisterStartupScript pour vous assurer que le javascript est activé au chargement de la page.

0
CodeRot