Respuestas:
Acabo de encontrar la respuesta y funciona :)
Debe agregar lo siguiente al enlace / botón del lado del servidor:
OnClientClick="aspnetForm.target ='_blank';"
Todo el código de mi botón se parece a lo siguiente:
<asp:LinkButton ID="myButton" runat="server" Text="Click Me!"
OnClick="myButton_Click"
OnClientClick="aspnetForm.target ='_blank';"/>
En el lado del servidor, hago clic en Response.Redirect("MyPage.aspx");
y la página se abre en una nueva ventana.
La otra parte que debe agregar es corregir el destino del formulario, de lo contrario, todos los enlaces se abrirán en una nueva ventana. Para hacerlo, agregue lo siguiente en el encabezado de su ventana emergente.
<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>
y
<body onload="fixform()">
OnClientClick="aspnetForm.target ='_blank';"
tener que usarOnClientClick="document.getElementById('Form').target ='_blank';"
Puedes usar esto como método de extensión
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 esto, obtiene una buena anulación del objeto de respuesta real
Response.Redirect(redirectURL, "_blank", "menubar=0,scrollbars=1,width=780,height=900,top=10");
Debido a que Response.Redirect se inicia en el servidor, no puede hacerlo usando eso.
Si puede escribir directamente en el flujo de respuesta, puede intentar algo como:
response.write("<script>");
response.write("window.open('page.html','_blank')");
response.write("</script>");
Construya su URL a través del controlador de eventos de clic:
string strUrl = "/some/url/path" + myvar;
Luego:
ScriptManager.RegisterStartupScript(Page, Page.GetType(), "popup", "window.open('" + strUrl + "','_blank')", true);
El truco de fixform es genial, pero:
Es posible que no tenga acceso al código de lo que se carga en la nueva ventana.
Incluso si lo hace, depende del hecho de que siempre se carga, sin errores.
Y depende del hecho de que el usuario no hará clic en otro botón antes de que la otra página tenga la oportunidad de cargar y ejecutar fixform.
Sugeriría hacer esto en su lugar:
OnClientClick="aspnetForm.target ='_blank';setTimeout('fixform()', 500);"
Y configure fixform en la misma página , con este aspecto:
function fixform() {
document.getElementById("aspnetForm").target = '';
}
También puede usar en el código subyacente de esta manera
ClientScript.RegisterStartupScript(this.Page.GetType(), "",
"window.open('page.aspx','Graph','height=400,width=500');", true);
window.open('page.aspx','_blank');
, todavía lo abre en una nueva ventana con la barra de navegación deshabilitada y faltan los botones de navegación en lugar de una nueva pestaña.
Esto no es posible con Response.Redirect, ya que sucede en el lado del servidor y no puede indicarle a su navegador que realice esa acción. ¿Qué quedaría en la ventana inicial? ¿Una página en blanco?
El método emergente le dará una pregunta segura al visitante.
aquí está mi solución simple: y trabajando en todas partes.
<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");
}
Fuente: http://dotnetchris.wordpress.com/2008/11/04/c-aspnet-responseredirect-open-into-new-window/
Si puede reestructurar su código para que no necesite la devolución, puede usar este código en el evento PreRender del botón:
protected void MyButton_OnPreRender(object sender, EventArgs e)
{
string URL = "~/MyPage.aspx";
URL = Page.ResolveClientUrl(URL);
MyButton.OnClientClick = "window.open('" + URL + "'); return false;";
}
También puede usar el siguiente código para abrir una nueva página en una nueva pestaña.
<asp:Button ID="Button1" runat="server" Text="Go"
OnClientClick="window.open('yourPage.aspx');return false;"
onclick="Button3_Click" />
Y simplemente llame a Response.Redirect ("yourPage.aspx"); evento de botón detrás.
Siempre uso este código ... Use este código
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 ());
}
Aquí hay una versión de jQuery basada en la respuesta de @takrl y @tom arriba. Nota: sin formid codificado (llamado aspnetForm arriba) y tampoco utiliza referencias directas de form.target que Firefox puede encontrar problemáticas:
<asp:Button ID="btnSubmit" OnClientClick="openNewWin();" Text="Submit" OnClick="btn_OnClick" runat="server"/>
Luego, en su archivo js al que se hace referencia en la MISMA página:
function openNewWin () {
$('form').attr('target','_blank');
setTimeout('resetFormTarget()', 500);
}
function resetFormTarget(){
$('form').attr('target','');
}
Usé Hyperlink en lugar de LinkButton y funcionó bien, tiene la propiedad Target, por lo que resolvió mi problema. Estaba la solución con Response.Write, pero eso estaba arruinando mi diseño, y el de ScriptManager, en cada actualización o retroceso, estaba reabriendo la ventana. Así que así es como lo resolví:
<asp:HyperLink CssClass="hlk11" ID="hlkLink" runat="server" Text='<%# Eval("LinkText") %>' Visible='<%# !(bool)Eval("IsDocument") %>' Target="_blank" NavigateUrl='<%# Eval("WebAddress") %>'></asp:HyperLink>
puede abrir una nueva ventana desde el código asp.net detrás usando ajax como lo hice aquí 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);
}
Ninguno de los ejemplos anteriores funcionó para mí, así que decidí publicar mi solución. En los eventos de clic de botón, aquí está el código subyacente.
Dim URL As String = "http://www.google/?Search=" + txtExample.Text.ToString
URL = Page.ResolveClientUrl(URL)
btnSearch.OnClientClick = "window.open('" + URL + "'); return false;"
Tenía que modificar el código response.redirect de otra persona para abrirlo en un nuevo navegador.
Usé este enfoque, no requiere que hagas nada en la ventana emergente (a la que no tuve acceso porque estaba redirigiendo a un archivo PDF). También usa clases.
$(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);
});
});
Para usar, agregue la clase "nueva ventana" a cualquier elemento. No es necesario agregar nada a la etiqueta del cuerpo. Esta función configura la nueva ventana y la fija en la misma función.
Hice esto poniendo target = "_ blank" en el botón de enlace
<asp:LinkButton ID="btn" runat="server" CausesValidation="false" Text="Print" Visible="false" target="_blank" />
luego, en el código subyacente de carga de la página, simplemente configure el atributo 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";}
Y código subyacente:
Response.Redirect(URL);