Respuesta: Redirigir a una nueva ventana

118

Quiero hacer una, Response.Redirect("MyPage.aspx")pero abrirla en una nueva ventana del navegador. He hecho esto antes sin usar el método de secuencia de comandos de registro de JavaScript. ¿No puedo recordar cómo?

hims056
fuente

Respuestas:

114

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()">
miguel
fuente
2
No, ya que esto usa javascript para cambiar el objetivo del formulario. En cambio, la página se enviaría normalmente.
Toby Mills
Además, podría tener una violación de seguridad si desea redirigir a una página fuera de su directorio virtual.
Drejc
1
De alguna manera en mi caso no está funcionando. Estoy abriendo la misma página en la nueva ventana y escribiendo la respuesta en esa página. Pero cuando mantengo el método fixform () en la página maestra, arroja un error que dice que el documento es nulo. No estoy seguro de por qué sigue tirando tratando de encontrar una solución. Aunque se me ocurrió una solución temporal usando onClientClick = "aspnetForm.target = '';" propiedad para otros botones en esa página.
JPReddy
1
Acabo de probar esto y en lugar de OnClientClick="aspnetForm.target ='_blank';"tener que usarOnClientClick="document.getElementById('Form').target ='_blank';"
colincameron
Sí, funcionó para mí, pero está abriendo la página en una nueva pestaña, no en una nueva ventana. ¿Cómo puedo abrir mi página en una nueva ventana?
Shilpa Soni
61

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");
Sasa Tancev
fuente
1
¿Qué tengo que enviar para el primer argumento?
Raghuveera
Amigo, ¡esta es una solución fantástica que realmente funciona! Gracias.
Klaus Nji
Excelente solución reutilizable. El único inconveniente es el hecho de que el bloqueador de ventanas emergentes bloquea la nueva ventana.
MeanGreen
El primer argumento es su objeto Response actual.
Futureproof
¡Gracias por la retroalimentación!
Sasa Tancev
26

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>");
JamesSugrue
fuente
3
Esto funciona, pero luego cambia la página donde está mi botón, es como si el CSS o el DIVS se vieran afectados.
Etienne
la nueva ventana aparece cada vez que va y viene.
devXen
26

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);
steve
fuente
El bloqueador de ventanas emergentes bloquea la URL en cualquier otro lugar.
Rafay
3
window.open en este ejemplo siempre se tratará como una 'ventana emergente' ya que se inicia mediante un código y no una acción del usuario. si se llama a window.open cuando el usuario hace clic en un elemento, eso debería eludir la acción de ventana emergente bloqueada por el navegador.
steve
@steve, esta es una solución excelente y muy simple. Usé su enfoque de Response.Redirect a popup.
Domingo
14

El truco de fixform es genial, pero:

  1. Es posible que no tenga acceso al código de lo que se carga en la nueva ventana.

  2. Incluso si lo hace, depende del hecho de que siempre se carga, sin errores.

  3. 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 = '';
}
tom
fuente
11

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);
algo
fuente
2
Esto funciona bien para mí y es básicamente la versión corta de la solución de Abhishek Shrivastava anterior. Sin embargo, hay un par de advertencias que debe tener en cuenta. Primero, esto activará bloqueadores de ventanas emergentes. En particular, no funcionará en absoluto en Safari 5.0 si el bloqueador de ventanas emergentes está habilitado, ya que Safari no le solicita las ventanas emergentes bloqueadas y no le permite hacer excepciones. En segundo lugar, Chrome ignora el argumento de la página para window.open. Entonces, incluso si lo usa 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.
Kasey Speakman
8

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?

John Sheehan
fuente
8

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();"/>
Kursat Turkay
fuente
No puedo editar tu publicación porque no tiene al menos 6 caracteres, pero no es '("href")', es '["href"]'
Nickso
4

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;";
}
humbads
fuente
4

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.

Zohaib
fuente
Este método activa los dos OnClientClick como onclick . Significa que alguna página se abre en la nueva ventana y que se realizó alguna acción en la misma página
Manivannan Nagarajan
3

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 ());
     }
Abhishek Shrivastava
fuente
¡Este código nunca afectará a la clase CSS, por lo que la ventana principal no se verá afectada en absoluto!
Abhishek Shrivastava
1
Bueno, este ciertamente es un argumento sólido para MVC. No quitarle nada a su código. Lejos de ahi. Son cosas como esta las que tipifican los formularios web, blech.
MrBoJangles
Todo este código se puede condensar en una línea ... vea la solución de shalu a continuación. Es exactamente el mismo efecto, pero sin toda la hinchazón innecesaria.
Kasey Speakman
1

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','');
}
Ben Barreth
fuente
1

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>
bokkie
fuente
0

Es posible que desee utilizar Page.RegisterStartupScript para asegurarse de que el javascript se activa al cargar la página.

CodeRot
fuente
0

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);
}
Yaplex
fuente
0

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.

crh225
fuente
0

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.

Ricketts
fuente
0

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)
Hevski
fuente
0

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); 
Tran Anh Hien
fuente