Asp.net PoPup sin JavaScript !!!

En ASP siempre que hemos querido abrir una nueva ventana desde un botón, imageButton, etc. Hemos tenido que echar mano de JavaScript para poder abrir un nuevo navegador.

Pero hay un truco que podemos utilizar directamente desde asp.net y que gracias a la propiedad Target del formulario podemos definir como queremos que se muestre la página web.

protected void Page_Load(object sender, EventArgs e)
{
    if(!IsPostBack)
        this.Form.Target = "_blank";
}

Para hacer la prueba hemos definido la propiedad Target del formulario como _blank  y cada vez que recargemos la página lo hará en una nueva ventana. Si le damos un par de vueltas a esta propiedad le podemos sacar mucho partido.

Otra manera de hacer lo mismo pero que solo afecte por ejemplo cuando hacemos click en un botón y no siempre que recargamos la página sería.

protected void Page_Load(object sender, EventArgs e)
{
    Button1.OnClientClick = "form1.target='_blank'";
    Button1.PostBackUrl = "Ventana.aspx";
}

Cuando carga la página definimos en la propiedad OnClientClick «define el evento click en el cliente antes de enviar la petición al servidor» que el formulario abrirá una nueva ventana y en la propiedad PostBackUrl  definimos a que dirección se redirigirá después de hacer el recarga la página.

Teniendo todo esto en cuenta porque no creamos un método en nuestra clase base para poder decidir si nuestros controles de servidor actúen de forma normal o abran una página nueva.

Para hacer esto posible crearemos un método genérico con tres parámetros.

  1. control: el control a personalizar.
  2. url: la dirección a donde redirigiremos.
  3. target: Una enumeración con las diferentes opciones que acepta la propiedad Target.
private void DestinoLink<T>( ref T control, string url,
   Target target )
{
    switch (control.GetType().Name)
    {
       case "Button":
       case "LinkButton":
       case "ImageButton":
          control.GetType().GetProperty("OnClientClick").SetValue(
            control, this.form1.Name + ".target='_blank'", null);
          control.GetType().GetProperty("PostBackUrl").SetValue(
            control, url, null);
           break;
       case "HyperLink":
           control.GetType().GetProperty("Target").SetValue(
             control, this.form1.Name + ".target='_blank'", null);
           control.GetType().GetProperty("NavigateUrl").SetValue(
             control, url, null);
           break;
    }
}

/// <summary>
/// Con el uso de Target indicamos al enlace donde tiene que abrirse.
/// </summary>
enum Target
{
    _blank,
    _top,
    _self,
    _parent
}

Gracias a los genéricos informamos del tipo del control a personalizar y dependiendo del tipo que detectemos utilizaremos reflexion para definir sus propiedades. De esta manera independientemente de que el control sea un botón o un link podemos utilizar el método de la misma manera.

Para probar el código he creado dos páginas; una con un button, un linkButton y un hyperlink llamada «default.aspx» y otra con un texto llamada «ventana.aspx».

protected void Page_Load(object sender, EventArgs e)
{
    DestinoLink<Button>(ref Button1, "Ventana.aspx", Target._blank);
    DestinoLink<HyperLink>(ref HyperLink1, "Ventana.aspx",
       Target._blank);
    DestinoLink<LinkButton>(ref LinkButton1, "Ventana.aspx",
       Target._blank);
}

De esta manera tan sencilla podemos preparar los controles de servidor para que habran una nueva ventana.

 

Espero que esta entrada os haya parecido interesante.

Nos vemos.

 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Scroll al inicio