Réponses:
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()">
OnClientClick="aspnetForm.target ='_blank';"
j'ai dû utiliserOnClientClick="document.getElementById('Form').target ='_blank';"
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");
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>");
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);
L'astuce de la forme fixe est intéressante, mais:
Vous n'aurez 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 qu'il se charge toujours, sans erreur.
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 = '';
}
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);
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.
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?
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();"/>
<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/
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;";
}
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.
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 ());
}
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','');
}
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>
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);
}
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.
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.
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)
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);