ASP.NET: Cómo usar Response.Write

Posiblemente todos los que desarrollamos aplicaciones web usando ASP.NET conocemos la instrucción Response.Write. El problema es que generalmente la usamos mal.

Para quienes no la conocen, primero que nada, pertenece al objeto Response, el cual incluye objetos y funciones que envían resultados a la página, como guardar una cookie, redirigir a otra dirección, o ésta función Write, que escribe texto en la página.

Response.Write("Hola");

Muchas veces utilizamos esta función para mostrar un mensaje al usuario, como cuando se presenta un error o cuando queremos informar de una operación realizada en la aplicación. Lo cual está mal.

Lo explicaré con un ejemplo de la forma en que sí debe utilizarse esta instrucción:

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="utf-8"/>
    <title>Ejemplo</title>
</head>
<body>
    <h1><% Response.Write("Bienvenidos") %></</h1>
</body>
</html>

Response.Write escribirá el texto en la posición donde se encuentra en la página. Lo que indiquemos que escriba quedará plasmado en el código fuente de la página, justo donde invocamos al método.

El problema es que normalmente le damos otro uso a esta función, como éste:

protected void login_Click(object sender, EventArgs e) {
    string nombre = textBoxNombre.Text.Trim();
    string pass = textBoxPass.Text.Trim();
    if (nombre == "" || pass == "") {
        Response.Write("Introduzca nombre y contraseña");
        return;
    }
    if (!IniciarSesion(nombre, pass)) {
        Response.Write("Datos de acceso incorrectos");
    } else {
        Response.Write("Bienvenido");
    }
}

Al ejecutar la instrucción, pasará lo mismo: el texto se imprime en la parte de la página donde se encuentra actualmente. Ahora bien, la página no se ha generado. Toda función de servidor, desde el Page_Load hasta el login_Click se están ejecutando antes de enviar el código fuente al navegador. Entonces, nuestro resultado sería éste:

Bienvenido
<!DOCTYPE HTML>
<html>
<head>
...

El texto impreso estaría antes de todo el contenido de la página, ¡incluyendo DOCTYPE! Esto es un error muy grande. Número uno: por las políticas de diseño de HTML (si nos importan estas cosas). Número dos: es muy probable que ésto nos afecte la vista del resto del documento. Me ha tocado ver sitios en los que si hacemos esto, el texto se cambia al tamaño predeterminado de HTML (16 puntos), porque un texto antes del DOCTYPE afecta a la hoja de estilos. Número tres: si usamos AJAX.NET, esta instrucción no se puede utilizar, ya que AJAX afecta únicamente lo contenido dentro del UpdatePanel, y al enviarle un Response.Write, o simplemente lo ignora o marca un error.

Si queremos mostrar un mensaje en la página, mi recomendación sería usar un LiteralControl. Declaramos un elemento <asp:Literal /> en la parte que deseamos de nuestra página y modificamos su propiedad Text con el texto (o incluso código HTML) que deseamos poner. El control Literal es precisamente para poner el texto o código HTML que queramos. Es algo así como el control Label, pero sin generar etiquetas label o span.

Si quieren usar Response.Write, sólo háganlo para depuraciones, pero si quieren una aplicación bien desarrollada, absténganse de utilizarlo en el producto final. Resulta casi completamente innecesaria.

Anuncios

Autor: Israel Muñoz

Soy desarrollador de software, principalmente dedicado a desarrollo de aplicaciones web. Especializado en .NET full-stack, además de tecnologías front-end HTML, CSS y JavaScript. A ratos, profesor de materias de informática. Me gusta mucho todo lo que tiene que ver con las tecnologías nuevas para desarrollo web, y el diseño de sitios y aplicaciones.

4 comentarios en “ASP.NET: Cómo usar Response.Write”

  1. Estimado, buscando por la web me topé con esta nota, evidentemente estaba haciendo mal las cosas ya que usaba el Response.Write para enviar mensajes al usuario o para ejecutar scripts de javascript (peor aún). Ahora gracias a esto me quedó más claro, pero a su vez me surgió una nueva duda, ¿cómo puedo hacer entonces para abrir una ventana nueva segun una acción? Por ejemplo hacer una vista previa de una factura antes de imprimirla.

    Desde ya,
    Muchas gracias.

    Saludos,
    Diego.

    1. Como mencioné al final, puedes poner un control Literal en la página, exactamente donde quieres que se “imprima” el contenido desde el servidor.

      Si el control literal1 no tiene texto, no pasará nada. Pero le puedes agregar cualquier contenido HTML y será impreso directamente en el código fuente.

      literal1.Text = “

      Un párrafo

      El resultado aquí sería éste:

      Un párrafo

      De la misma forma, puedes agregar etiquetas script
      literal1.Text = “alert(‘Mensaje’);”;

      Y la página quedaría así:

      alert(‘Mensaje’);

      Claro que el script se ejecutará cuando la página lo procese, y si utilizas alguna función definida en la página o un script externo (como jQuery), el control Literal debe estar después de este script

      literal1.Text = “$(document).on(‘ready’,function() { … } )”;

      Si las etiquetas estuvieran al revés, al ejecutarse el $(document).on(‘ready’) habría un error, pues jQuery no estaría definido desde antes.

      Espero que esto te sirva.

      Saludos.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s