Risposte:
Ho appena trovato la risposta e funziona :)
È necessario aggiungere quanto segue al collegamento / pulsante lato server:
OnClientClick="aspnetForm.target ='_blank';"
Il mio intero codice del pulsante è simile a:
<asp:LinkButton ID="myButton" runat="server" Text="Click Me!"
OnClick="myButton_Click"
OnClientClick="aspnetForm.target ='_blank';"/>
Nel lato server OnClick faccio un Response.Redirect("MyPage.aspx");
e la pagina si apre in una nuova finestra.
L'altra parte che devi aggiungere è correggere la destinazione del modulo altrimenti ogni collegamento si aprirà in una nuova finestra. Per farlo, aggiungi quanto segue nell'intestazione della finestra 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>
e
<body onload="fixform()">
OnClientClick="aspnetForm.target ='_blank';"
ho dovuto usareOnClientClick="document.getElementById('Form').target ='_blank';"
Puoi usarlo come metodo di estensione
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);
}
}
}
Con questo si ottiene un bel sovrascrittura sull'oggetto Response effettivo
Response.Redirect(redirectURL, "_blank", "menubar=0,scrollbars=1,width=780,height=900,top=10");
Poiché Response.Redirect è avviato sul server, non puoi farlo utilizzando quello.
Se puoi scrivere direttamente nel flusso di risposta, potresti provare qualcosa del tipo:
response.write("<script>");
response.write("window.open('page.html','_blank')");
response.write("</script>");
Controlla il tuo URL tramite il gestore dell'evento clic:
string strUrl = "/some/url/path" + myvar;
Poi:
ScriptManager.RegisterStartupScript(Page, Page.GetType(), "popup", "window.open('" + strUrl + "','_blank')", true);
Il trucco del fixform è semplice, ma:
Potresti non avere accesso al codice di ciò che viene caricato nella nuova finestra.
Anche se lo fai, dipendi dal fatto che si carica sempre, senza errori.
E dipendi dal fatto che l'utente non farà clic su un altro pulsante prima che l'altra pagina abbia la possibilità di caricare ed eseguire fixform.
Suggerirei di farlo invece:
OnClientClick="aspnetForm.target ='_blank';setTimeout('fixform()', 500);"
E imposta fixform sulla stessa pagina , in questo modo:
function fixform() {
document.getElementById("aspnetForm").target = '';
}
Puoi anche usarlo in code behind in questo modo
ClientScript.RegisterStartupScript(this.Page.GetType(), "",
"window.open('page.aspx','Graph','height=400,width=500');", true);
window.open('page.aspx','_blank');
lo apri comunque in una nuova finestra con la barra di navigazione disabilitata e i pulsanti di navigazione mancanti invece di una nuova scheda.
Ciò non è possibile con Response.Redirect poiché accade sul lato server e non è possibile indirizzare il browser a eseguire tale azione. Cosa rimarrebbe nella finestra iniziale? Una pagina vuota?
Il metodo popup darà una domanda sicura al visitatore.
ecco la mia semplice soluzione: e lavorando ovunque.
<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");
}
Fonte: http://dotnetchris.wordpress.com/2008/11/04/c-aspnet-responseredirect-open-into-new-window/
Se puoi ri-strutturare il tuo codice in modo da non dover eseguire il postback, puoi utilizzare questo codice nell'evento PreRender del pulsante:
protected void MyButton_OnPreRender(object sender, EventArgs e)
{
string URL = "~/MyPage.aspx";
URL = Page.ResolveClientUrl(URL);
MyButton.OnClientClick = "window.open('" + URL + "'); return false;";
}
È inoltre possibile utilizzare il codice seguente per aprire una nuova pagina in una nuova scheda.
<asp:Button ID="Button1" runat="server" Text="Go"
OnClientClick="window.open('yourPage.aspx');return false;"
onclick="Button3_Click" />
E chiama semplicemente Response.Redirect ("yourPage.aspx"); dietro l'evento pulsante.
Uso sempre questo codice ... Usa questo codice
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 ());
}
Ecco una versione di jQuery basata sulla risposta di @takrl e @tom sopra. Nota: nessun formid hardcoded (denominato aspnetForm sopra) e inoltre non utilizza riferimenti diretti form.target che Firefox potrebbe trovare problematici:
<asp:Button ID="btnSubmit" OnClientClick="openNewWin();" Text="Submit" OnClick="btn_OnClick" runat="server"/>
Quindi nel tuo file js referenziato nella STESSA pagina:
function openNewWin () {
$('form').attr('target','_blank');
setTimeout('resetFormTarget()', 500);
}
function resetFormTarget(){
$('form').attr('target','');
}
Ho usato Hyperlink invece di LinkButton e ha funzionato perfettamente, ha la proprietà Target quindi ha risolto il mio problema. C'era la soluzione con Response.Write ma questo stava rovinando il mio layout, e quella con ScriptManager, ad ogni aggiornamento o ritorno, riapriva la finestra. Quindi è così che l'ho risolto:
<asp:HyperLink CssClass="hlk11" ID="hlkLink" runat="server" Text='<%# Eval("LinkText") %>' Visible='<%# !(bool)Eval("IsDocument") %>' Target="_blank" NavigateUrl='<%# Eval("WebAddress") %>'></asp:HyperLink>
puoi aprire una nuova finestra dal codice asp.net dietro usando ajax come ho fatto qui 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);
}
Nessuno degli esempi precedenti ha funzionato per me, quindi ho deciso di pubblicare la mia soluzione. Negli eventi di clic del pulsante, ecco il codice sottostante.
Dim URL As String = "http://www.google/?Search=" + txtExample.Text.ToString
URL = Page.ResolveClientUrl(URL)
btnSearch.OnClientClick = "window.open('" + URL + "'); return false;"
Dovevo modificare il codice response.redirect di qualcun altro per aprirlo in un nuovo browser.
Ho usato questo approccio, non richiede di fare nulla sul popup (a cui non avevo accesso perché stavo reindirizzando a un file PDF). Utilizza anche le classi.
$(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);
});
});
Per utilizzarlo, aggiungi la classe "nuova finestra" a qualsiasi elemento. Non è necessario aggiungere nulla al tag body. Questa funzione imposta la nuova finestra e la risolve nella stessa funzione.
L'ho fatto inserendo target = "_ blank" nel linkbutton
<asp:LinkButton ID="btn" runat="server" CausesValidation="false" Text="Print" Visible="false" target="_blank" />
quindi nel codebehind pageload imposta l'attributo 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";}
E codice dietro:
Response.Redirect(URL);