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 ?
Réponses
Trop de publicités?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()">
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");
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>");
L'astuce de la forme fixe est bien, mais :
-
Vous n'avez peut-être pas accès au code de ce qui se charge dans la nouvelle fenêtre.
-
Même si vous le faites, vous dépendez du fait du fait qu'il se charge toujours, sans erreur sans erreur.
-
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 = '';
}
- Réponses précédentes
- Plus de réponses