123 votes

Réponse. Redirection vers une nouvelle fenêtre

Je veux faire un Response.Redirect("MyPage.aspx") mais en l'ouvrant dans une nouvelle fenêtre du navigateur. J'ai déjà fait cela auparavant sans utiliser la méthode JavaScript register script. Je n'arrive pas à me souvenir comment ?

116voto

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

Vous devez ajouter ce qui suit à votre lien/bouton côté serveur :

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

L'ensemble du code de mon bouton ressemble à quelque chose comme :

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

Dans le OnClick côté serveur, 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()">

63voto

Tančev Saša Points 331

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 surcharge agréable sur l'objet de réponse actuel.

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

28voto

steve Points 405

Contruisez votre url via le gestionnaire d'événement de clic :

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

Ensuite :

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

26voto

JamesSugrue Points 8426

Parce que Response.Redirect est initié 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>");

14voto

tom Points 101

L'astuce de la forme fixe est bien, 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 du fait qu'il se charge toujours, sans erreur sans erreur.

  3. Et vous dépendez du fait que l'utilisateur ne va pas cliquer sur un autre bouton avant que l'autre page ait eu de charger et d'exécuter Fixform.

Je vous suggère de faire ceci à la place :

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

Et mettre en place fixform sur le même page qui ressemble à ceci :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X