Abrir una nueva ventana con ASP.NET

En los proyectos con ASP.NET en ocasiones se nos hace necesario abrir una nueva ventana desde nuestro código de lado del servidor, por ejemplo: Al presionar un botón se ejecuta una acción y posteriormente se muestra un reporte, dicho reporte puede ser mostrado en una ventana nueva.

Para realzar este sencillo proceso les dejo el siguiente truco.

Creamos nuestra página ASPX y colocaremos un control ScriptManager. Este puede ser del Ajax Extension o de los controles agregados AjaxControl Tool Kit. Esto dependerá del tipo de proyecto que realicemos.

Utilizamos el ScriptManager para llamar la función Javascript que crearemos para abrir la nueva ventana sin que nuestro botón realice el PostBack.

1
2
3
4
5
6
<ajaxToolkit:ToolkitScriptManager 
     ID="ToolkitScriptManager1" 
     runat="server" 
     EnableScriptGlobalization="true" 
     EnableScriptLocalization="true">
</ajaxToolkit:ToolkitScriptManager>

La etiqueta ScriptManager solo debe ir una vez por página y es utilizada para realizar las llamadas asincrónicas con AJAX.

Colocamos ahora el botón que realizara el proceso interno en el servidor y posteriormente abrirá la nueva ventana con el reporte.

1
<asp:Button ID=" btnButtons" runat="server" Text="Button" />

Podemos ahora escribir la función Javascript que abrirá la nueva ventana en el navegador.

1
2
3
4
5
<script type="text/javascript">
        function OpenWindows(url){
            window.open(url, " Título", "directories=no, location=no, menubar=no, scrollbars=yes, statusbar=no, tittlebar=no");
        }
</script>

– Window.open: Permite abrir la nueva ventana en el navegador

– URL: Es una variable que contiene la dirección física del archivo que queremos abrir. Es muy importante que la ruta sea relativa apuntando a un archivo dentro de nuestro proyecto.

– Título: El título que tendrá la nueva ventana abierta.

Ya teniendo todo el código del lado del cliente vamos trabajar un sencillo script con código visual Basic en el lado del servidor:

1
2
3
4
5
6
7
Protected Sub btnButtons_ClickImprimir(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnButtons.ClickImprimir
        Dim URL As String = "../Reportes/ReportViewer.aspx?cod=2&tire=Despacho_Factura"
 
        Dim Funcion As String = "OpenWindows('" & URL & "');"
 
        ScriptManager.RegisterStartupScript(Me.Page, Me.GetType(), "SIFEL", Funcion, True)
End Sub

Que hace el cógio?

Simplemente llama al evento clic del botón para ejecutar nuestra función Javascript haciendo uso del ScriptManager.

Suscribir
Notificar a
guest
6 Comentarios
Comentarios en línea
Ver todos los comentarios
Rosy

muchas gracias fue de gran ayuda 😉

Josué

Hola… Justamente estoy intentando hacer todo eso mismo que planteas en tu introducción, pero tengo un problema… Yo soy un programador que no le gusta usar controles externos al framework de desarrollo, ahora estoy intentando hacerlo con ScriptManager del espacio de nombre System.Web.UI, pero aunque en la ayuda de Visual Studio existe referencia hacia RegisterStartupScript (Page, Type, String, String, Boolean) la funcion para registrar el Script no existe en ScriptManager.

Si pudieras ayudarme con eso te lo agradecere.

Josué

Hola… Gracias por responder.

La verdad es que necesito hacer clic en un botón que me habrá otra ventana por que los reportes de mi aplicación están alojados en otro portal, el problema real radica en que con código JavaScript no lo puedo hacer por que antes de redirigir primero necesito guardar algunos datos en una Base de Datos con los que el portal de reportes trabajara para mostrar el reporte correcto.

Pero vamos al grano, mi código es este y aunque no me genera ninguna excepción, no funciona. Es decir, no abre la ventana:


String newGUID = Guid.NewGuid().ToString();
String newURL = String.Concat("http://[ServerName]/[Portal Name]/Default.aspx?ref=", newGUID);

StringBuilder sb = new StringBuilder(" function openWindow() {window.open(\"");
sb.Append(newURL);
sb.Append("\");} ");

ClientScriptManager csMgr = this.ClientScript;
csMgr.RegisterStartupScript(this.GetType(), "AppName", sb.ToString());//, true);

De antemano, gracias por tu tiempo.