Réponse.Redirect vers une nouvelle fenêtre

118

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

hims056
la source

Réponses:

114

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';"

Mon code de bouton entier ressemble à quelque chose comme:

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

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

L'autre partie que vous devez ajouter est de fixer la cible du formulaire, sinon chaque lien s'ouvrira 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()">
miguel
la source
2
Non, car cela utilise javascript pour changer la cible du formulaire. Au lieu de cela, la page se soumettrait normalement.
Toby Mills
De plus, vous pourriez avoir une violation de sécurité si vous souhaitez rediriger vers une page en dehors de votre répertoire virtuel.
Drejc
1
D'une manière ou d'une autre, dans mon cas, cela ne fonctionne pas. J'ouvre la même page dans la nouvelle fenêtre et j'écris la réponse à cette page. Mais quand je garde la méthode fixform () dans la page principale, cela génère une erreur indiquant que le document est nul. Je ne sais pas pourquoi il se lance toujours en essayant de trouver une solution. Bien que j'aie trouvé une solution temporaire en utilisant onClientClick = "aspnetForm.target = '';" propriété pour les autres boutons de cette page.
JPReddy
1
Je viens d'essayer cela et au lieu de cela, OnClientClick="aspnetForm.target ='_blank';"j'ai dû utiliserOnClientClick="document.getElementById('Form').target ='_blank';"
colincameron
Oui, cela a fonctionné pour moi, mais cela ouvre la page dans un nouvel onglet et non dans une nouvelle fenêtre. Comment ouvrir ma page dans une nouvelle fenêtre?
Shilpa Soni
61

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 belle substitution sur l'objet de réponse réel

Response.Redirect(redirectURL, "_blank", "menubar=0,scrollbars=1,width=780,height=900,top=10");
Sasa Tancev
la source
1
que dois-je envoyer pour le premier arrgument?
Raghuveera
Mec, c'est une solution fantastique qui fonctionne réellement! Je vous remercie.
Klaus Nji
Excellente solution réutilisable! Le seul inconvénient est le fait que la nouvelle fenêtre est bloquée par le bloqueur de popup.
MeanGreen
Le premier argument est votre objet Response actuel.
Futureproof
Merci pour vos commentaires!
Sasa Tancev
26

Parce que Response.Redirect est lancé sur le serveur, vous ne pouvez pas le faire en utilisant 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>");
JamesSugrue
la source
3
Cela fonctionne, mais la page où mon bouton est obtenu change, c'est comme si le CSS ou DIVS est affecté.
Etienne
la nouvelle fenêtre apparaît à chaque fois lors des allers-retours.
devXen
26

Créez 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);
Steve
la source
Le bloqueur de fenêtres publicitaires bloque l'url tout autre wa autour de cela ??
Rafay
3
window.open dans cet exemple sera toujours traité comme un "pop-up" car il est initié par le code et non par une action de l'utilisateur. si window.open est appelé lorsque l'utilisateur clique sur un élément, cela devrait éviter l'action de popup bloquée par le navigateur.
steve
@steve, c'est une excellente solution très simple. J'ai utilisé votre approche de Response.Redirect vers un popup.
Sunil
14

L'astuce de la forme fixe est intéressante, mais:

  1. Vous n'aurez 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 qu'il 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 n'ait la possibilité de charger et d'exécuter le formulaire de correction.

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 = '';
}
à M
la source
11

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);
qc
la source
2
Cela fonctionne très bien pour moi et est essentiellement la version courte de la solution d'Abhishek Shrivastava ci-dessus. Cependant, il y a quelques mises en garde à prendre en compte. Tout d'abord, cela déclenchera des bloqueurs de popup. En particulier, cela ne fonctionnera pas du tout dans Safari 5.0 si le bloqueur de popup est activé car Safari ne vous demande pas les popups bloqués et ne vous permet pas de faire des exceptions de popup. Deuxièmement, Chrome ignore l'argument de page de window.open. Ainsi, même si vous l'utilisez, window.open('page.aspx','_blank');il l'ouvre toujours dans une nouvelle fenêtre avec la barre de navigation désactivée et les boutons de navigation manquants au lieu d'un nouvel onglet.
Kasey Speakman le
8

Ce n'est pas possible avec Response.Redirect car cela se produit côté serveur et ne peut pas diriger votre navigateur pour qu'il entreprenne cette action. Que resterait-il dans la fenêtre initiale? Une page blanche?

John Sheehan
la source
8

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();"/>
Kursat Turkay
la source
Je ne peux pas modifier votre message car il n'y a pas au moins 6 caractères, mais ce n'est pas '("href")', c'est '["href"]'
Nickso
4

Si vous pouvez restructurer votre code afin que vous n'ayez pas besoin de publier, 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;";
}
humbads
la source
4

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.

Zohaib
la source
Cette méthode déclenche à la fois OnClientClick et onclick . Signifie qu'une page est ouverte dans la nouvelle fenêtre ainsi qu'une action a été effectuée dans la même page
Manivannan Nagarajan
3

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 ());
     }
Abhishek Shrivastava
la source
Ce code n'affectera jamais la classe CSS donc la fenêtre parente ne sera pas du tout affectée !!
Abhishek Shrivastava
1
Eh bien, c'est certainement un argument fort pour MVC. Ne rien enlever à votre code. Loin de là. Ce sont des choses comme celle-ci qui caractérisent les formulaires Web, blech.
MrBoJangles
Tout ce code peut être condensé en une seule ligne ... voir la solution de shalu ci-dessous. C'est exactement le même effet, mais sans tous les ballonnements inutiles.
Kasey Speakman le
1

Voici une version de jQuery basée sur la réponse de @takrl et @tom ci-dessus. Remarque: pas de formidable codé en dur (nommé aspnetForm ci-dessus) et n'utilise pas non plus de références directes form.target que Firefox peut 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 MÊME page:

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

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

J'ai utilisé Hyperlink au lieu de LinkButton et cela fonctionnait très bien, il a la propriété Target donc cela a résolu mon problème. Il y avait la solution avec Response.Write mais cela gâchait ma mise en page, et celle avec ScriptManager, à chaque actualisation ou retour, rouvrait la fenêtre. Voici donc 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>
bokkie
la source
0

Vous pouvez utiliser le Page.RegisterStartupScript pour vous assurer que le javascript se déclenche lors du chargement de la page.

CodeRot
la source
0

vous pouvez ouvrir une nouvelle fenêtre à partir du code asp.net derrière 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);
}
Yaplex
la source
0

Aucun des exemples précédents n'a fonctionné pour moi, j'ai donc décidé de publier ma solution. Dans les événements de clic sur le bouton, 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.

crh225
la source
0

J'ai utilisé cette approche, cela ne vous oblige pas à faire quoi que ce soit sur le popup (auquel 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 "nouvelle-fenêtre" à n'importe quel élément. Vous n'avez rien à ajouter à la balise body. Cette fonction configure la nouvelle fenêtre et la fixe dans la même fonction.

Ricketts
la source
0

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

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

puis dans le codebehind pageload, définissez simplement l'attribut href:

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

HTML

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

Javascript:

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

ET code derrière:

Response.Redirect(URL); 
Tran Anh Hien
la source