jueves, 16 de septiembre de 2010

Difererencias entre Eval, DataBinder.Eval y Bind

Lo primero es saber que cuando estamos dentro del contexto de una plantilla, el “elemento” al que estamos haciendo referencia con Eval es del tipo de un elemento del origen de datos. Así, si por ejemplo tenemos como origen de datos un DataTable, el “elemento” será del tipo “DataRowView”, pero si estamos enlazados a una colección de objetos de tipo “Empleado”, el tipo del elemento será “Empleado”.

Dentro de una plantilla de enlace a datos podemos utilizar:

  • Container.DataItem
  • DataBinder.Eval
  • Eval

Container puede ser “casteado” al tipo de la plantilla actual por la que estamos iterando (por ejemplo RepeaterItem), aunque cabe mencionar que si tenemos un control que implementa INamingContainer dentro de nuestro elemento actual (por ejemplo un LoginView dentro del RepeaterItem), Container será entonces del tipo LoginView y para acceder al control de tipo RepeaterItem tendremos que escribir algo como Container.NamingContainer. Una vez hemos accedido al elemento contenedor apropiado, podemos acceder a Container.DataItem que significa “dame el elemento de datos actual por el que estoy iterando”, que además podrá ser “casteado” de nuevo al tipo del elemento que sea realmente (DataRowView, Empleado, etc.).

En cualquier caso y como atajo, también podemos utilizar la expresión DataBinder.GetDataItem(Contenedor) donde “Contenedor” tiene que ser por ejemplo en nuestro caso, el RepeaterItem.

Por otro lado DataBinder.Eval nos permite acceder a la propiedad “indizada” sin conocer el tipo del “elemento” actual. Ya que si escribimos DataBinder.Eval(Container.DataItem, “Nombre”), ASP.NET será muy listo y sabrá si Nombre es una propiedad del objeto (en el caso de Empleado) o un campo del DataRowView.

Eval es una nueva instrucción que apareció en ASP.NET 2.0 como versión reducida de DataBinder.Eval, pero además de esto, hay más diferencias entre ellas: 

  • Eval sólo puede utilizarse en el contexto de una plantilla
  • DataBinder.Eval, además de poder utilizarse en el contexto de una plantilla, también puede ser utilizado en un procedimiento del code-behind/code-beside
  • La sintaxis acortada de Eval es diferente de la de DataBinder.Eval en el hecho de que Eval resuelve automáticamente el campo a través de la propiedad DataItem del objeto contenedor más cercano, mientras que DataBinder.Eval coge el argumento del contenedor (pudiendo elegir nosotros que contenedor y elemento utilizar a través de un “cast” oportuno).
    Es por esto que Eval sólo se usa dentro de una plantilla de un control de enlazado de datos y no se puede usar en el nivel de página.
  • Bind es igual en su comportamiento y uso que Eval, sólo que además soporta la actualización, eliminación e inserción con el control origen de datos. Esto se denomina “Two-Way”, es decir, no sólo se enlazan controles de datos a controles de orígenes de datos para su lectura y presentación, sino también para “modificación” de la capa de datos que subyace a todo este escenario. Cuando sólo se leen datos se denomina “One-Way”.

Los controles que soportan “Two-Way” son:

  • GridView
  • DetailsView
  • FormView

Finalmente, y para un objeto de tipo RootFolder (que bien podría ser Empleado, CuentaBancaria, DataRowView, etc), podemos ver las distintas maneras de enlazar datos en una plantilla:

FolderID:<%# CType(Container.DataItem, Entities.RootFolder).FolderID%>

 

FolderID:<%# DataBinder.Eval(Container.DataItem, " FolderID ")%>

 

FolderID:<%# Eval("FolderID")%>

Referencias:

http://weblogs.asp.net/rajbk/archive/2004/07/20/what-s-the-deal-with-databinder-eval-and-container-dataitem.aspx

http://dotnetguts.blogspot.com/2006/12/databindereval-method.html

Un saludo!

No hay comentarios:

Publicar un comentario