sábado, 6 de diciembre de 2008

ASP.NET - Databinding vs. code-rendering

Cuántas veces hemos visto estas expresiones:


o



En qué se parecen?
1.- ambas van en el código inline de la página aspx o control de usuario
2.- ambas nos permiten acceder a datos que se manipulan desde el code-beside
3.- ambas serán reemplazadas por un contenido al terminar la carga de la página.

Entonces la pregunta es: significan lo mismo?
Nooooo. A decir verdad son cosas totalmente diferentes.

El primero:



se conoce como databinding... y la expresión obtiene un valor cuando el control que lo contiene ejecute el método DataBind(), ejemplo:
Si hubiera un control GridView con una columna así:










en el code-beside tendríamos que tener algo así:
GridView1.DataSource = dt;
GridView1.DataBind();
para que la fuente de datos se vincule al control GridView y, de esta manera podríamos mostrar algún
contenido en él.

Ahora, la expresión



se conoce como code-rendering... y permite mostrar un contenido proveniente de una función, o de una variable a nivel de página, ejemplo:
protected string CustomerName()
{
return "Scott";
}
Por ejemplo, si tuviéramos esto en el aspx:



Y al ejecutar la página veríamos que el span muestra este contenido:



Como ves, ambos métodos pueden usarse para casi lo mismo, pero no es igual ;)

Por qué no es igual?
1.- databinding tiene viewstate, eso significa que la información puede ser persistida entre postbacks de página, lo cual evita que estemos haciendo reiteradas llamadas a la base de datos.
2.- Code rendering no tiene viewstate.
3.- Code-rendering, por otro lado ejecutará la función CustomerName() cada vez que se recarga la página... esto puede causar problemas de performance si se abusa del code-rendering.
4.- Además, code-rendering ocasiona el típico error:
"The Controls Collection cannot be modified because the control contains code blocks"
Esto significa que ASP.NET está intentando insertar un bloque de código dentro del bloque de código que ya ha generado, pero no lo puede hacer porque el bloque de código es dinámico... osea estamos intentando inyectar código.
5.- En cambio databinding embebe su código en tiempo de ejecución.
Entonces, hay que tener cuidado cuando querramos usar código sobre controles que se generan dinámicamente.

No hay comentarios.: