2008-09-19 33 views
111

Quiero hacer un Response.Redirect("MyPage.aspx") pero lo tengo abierto en una nueva ventana del navegador. He hecho esto antes sin usar el método de script de registro de JavaScript. Simplemente no puedo recordar cómo?Respuesta.Redirecta a la nueva ventana

Respuesta

8

Esto no es posible con Response.Redirect como ocurre en el lado del servidor y no puede dirigir su navegador para que realice esa acción. ¿Qué quedaría en la ventana inicial? Una página en blanco?

25

Como Response.Redirect se inicia en el servidor, no puede hacerlo utilizando eso.

Si usted puede escribir directamente a la respuesta fluvial podría intentar algo como:

response.write("<script>"); 
response.write("window.open('page.html','_blank')"); 
response.write("</script>"); 
+3

Este trabajo, pero entonces la página donde mi botón es conseguir de cambios, es como el CSS o DIVS están siendo afectados. – Etienne

+0

. Esto funciona. Pero está afectando a mi página real. – Naresh

+0

la nueva ventana aparece cada vez al ir y venir. – devXen

0

Es posible que desee utilizar el Page.RegisterStartupScript para asegurar que los incendios de JavaScript al cargar la página.

109

me acaba de encontrar la respuesta y funciona :)

Es necesario añadir lo siguiente a su servidor de enlace del lado botón /:

OnClientClick="aspnetForm.target ='_blank';" 

Todo mi código del botón se ve algo como:

<asp:LinkButton ID="myButton" runat="server" Text="Click Me!" 
       OnClick="myButton_Click" 
       OnClientClick="aspnetForm.target ='_blank';"/> 

En el lado del servidor OnClick hago un 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, cada enlace se abrirá en una nueva ventana. Para hacerlo, agregue lo siguiente en el encabezado de su ventana 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> 

y

<body onload="fixform()"> 
+1

¿funciona esto si Javascript está deshabilitado? –

+2

No, ya que esto usa javascript para cambiar el destino del formulario. En cambio, la página se enviaría normalmente. –

+0

Además, podría tener una violación de seguridad si desea redirigir a una página fuera de su directorio virtual. – Drejc

11

También se puede utilizar en el código atrás como esta manera

ClientScript.RegisterStartupScript(this.Page.GetType(), "", 
    "window.open('page.aspx','Graph','height=400,width=500');", true); 
+2

Esto funciona bien para mí y es básicamente la versión corta de la solución Abhishek Shrivastava anterior Sin embargo, hay un par de advertencias que debe tener en cuenta: primero, esto activará los bloqueadores de ventanas emergentes. En particular, no funcionará en absoluto en Safari 5.0 si el bloqueador de pop-ups está habilitado porque Safari no le solicita ventanas emergentes bloqueadas y no le permite hacer excepciones emergentes. En segundo lugar, Chrome ignora el argumento de la página para window.open. Así que incluso si usa 'window.open ('page.aspx', '_ blank');' aún lo abre en una nueva ventana con la barra de navegación deshabilitada y botones de navegación faltantes en lugar de una nueva pestaña. –

12

El truco fixform es limpio, pero:

  1. Usted no puede tener acceso al código de lo que se carga en la nueva ventana.

  2. Incluso si lo hace, depende de el hecho de que siempre se carga, error gratis.

  3. Y usted está en función del hecho de que el usuario no haga clic en otro botón antes que la otra página para crear una ocasión para cargar y ejecutar fixform.

Yo sugeriría hacer esto en su lugar:

OnClientClick="aspnetForm.target ='_blank';setTimeout('fixform()', 500);" 

Y pusieron fixform en la misma página , con este aspecto:

function fixform() { 
    document.getElementById("aspnetForm").target = ''; 
} 
3

siempre uso este código .. Utilice 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()); 
    } 
+0

¡Este código nunca afectará a la clase CSS, por lo que la ventana principal no se verá afectada en absoluto! –

+1

Bueno, este ciertamente es un fuerte argumento para MVC. No quitar nada de tu código. Lejos de ahi. Son cosas como esta las que tipifican las formas web, blech. – MrBoJangles

+0

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. –

0

que pueda open new window from asp.net code behind 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); 
} 
58

Usted puede utilizar 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 se obtiene buen anulación en el objeto de respuesta real

Response.Redirect(redirectURL, "_blank", "menubar=0,scrollbars=1,width=780,height=900,top=10"); 
+1

¿qué debo enviar para el primer arribo? – Raghuveera

+0

¡Amigo, esta es una solución fantástica que realmente funciona! Gracias. –

+0

¡Excelente solución reutilizable! El único inconveniente es el hecho de que la nueva ventana está bloqueada por el bloqueador de pop-ups. – MeanGreen

4

Si puede reestructurar su código de manera que no es necesario para la devolución de datos, a continuación, puede utilizar 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;"; 
} 
23

Contruct su URL a través de controlador de eventos click:

string strUrl = "/some/url/path" + myvar; 

continuación:

ScriptManager.RegisterStartupScript(Page, Page.GetType(), "popup", "window.open('" + strUrl + "','_blank')", true); 
+0

Bloqueador de ventanas emergentes bloquea la url cualquier otro wa alrededor de esto ?? – Rafay

+3

window.open en este ejemplo siempre se tratará como un'popup 'ya que se inicia por código y no por 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 emergente bloqueada por el navegador. – steve

+0

@steve, esta es una solución excelente y muy simple. Usé su enfoque de Response.Redirect a una ventana emergente. – Sunil

1

Aquí hay una versión de jQuery basada en la respuesta de @takrl y @tom anterior. Nota: no formid codificado (llamado aspnetForm arriba) y también no utiliza referencias form.target directas que Firefox puede encontrar problemática:

<asp:Button ID="btnSubmit" OnClientClick="openNewWin();" Text="Submit" OnClick="btn_OnClick" runat="server"/> 

A continuación, en el archivo js que se hace referencia en la página MISMO:

function openNewWin() { 
    $('form').attr('target','_blank'); 
    setTimeout('resetFormTarget()', 500); 
} 

function resetFormTarget(){ 
    $('form').attr('target',''); 
} 
1

Utilicé hipervínculo 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 estropeando mi diseño, y el que tenía ScriptManager, en cada actualización o respaldo, volvía a abrir la ventana. Así es cómo lo resolví:

<asp:HyperLink CssClass="hlk11" ID="hlkLink" runat="server" Text='<%# Eval("LinkText") %>' Visible='<%# !(bool)Eval("IsDocument") %>' Target="_blank" NavigateUrl='<%# Eval("WebAddress") %>'></asp:HyperLink> 
+0

gracias, resolvió mi problema –

4

También puede utilizar el siguiente código para abrir 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"); detrás del evento del botón.

+0

Este método desencadena tanto _OClienteCliente_ como _clicón_. Significa que se abre una página en la nueva ventana, así como algunas acciones se realizaron en la misma página –

0

Ninguno de los ejemplos anteriores funcionó para mí, así que decidí publicar mi solución. En el botón haga clic en eventos, aquí está el código detrás.

Dim URL As String = "http://www.google/?Search=" + txtExample.Text.ToString 
URL = Page.ResolveClientUrl(URL) 
btnSearch.OnClientClick = "window.open('" + URL + "'); return false;" 

Estaba teniendo que modificar el código de respuesta de otra persona. Código directo para abrir en un nuevo navegador.

+0

no funciona para safari – MobileMon

0

Utilicé este enfoque, no requiere que haga nada en la ventana emergente (a la que no tuve acceso porque estaba redireccionando 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 necesita agregar nada a la etiqueta corporal. Esta función configura la nueva ventana y la arregla en la misma función.

7

método emergente le dan una pregunta segura para los visitantes ..

aquí es mi solución simple: everyhere y trabajo.

<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();"/> 
0

lo hice poniendo target = "_ blank" en el LinkButton

<asp:LinkButton ID="btn" runat="server" CausesValidation="false" Text="Print" Visible="false" target="_blank" /> 

luego en la pageload CodeBehind acaba de establecer el atributo href:

btn.Attributes("href") = String.Format(ResolveUrl("~/") + "test/TestForm.aspx?formId={0}", formId) 
0

HTML

<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" OnClientClick = "SetTarget();" /> 

Javascript:

function SetTarget() { 
document.forms[0].target = "_blank";} 

Y CodeBehind:

Response.Redirect(URL); 
Cuestiones relacionadas