NET
Servicio de Informtica
Objetos persistentes
Introduccin
Por necesidades de una aplicacin nos puede interesar mantener un objeto con los mismos datos entre diferentes envos de datos (postbacks).. Por ejemplo supongamos que tenemos un objeto ClaseAlumnos sobre el que realizamos numerosas operaciones en distintas pginas de nuestra aplicacin web y damos la opcin al usuario de guardar esos cambios en la base de datos en cualquier momento mediante un botn de guardar. Nos sera de gran utilidad mantener una instancia de ClaseAlumnos que se mantenga durante todo el proceso hasta que el usuario decidiese almacenar sus datos en la base de datos (o rechazar los cambios). De esta forma slo accederamos a la base de datos al principio, para cargar los datos y al final, para guardarlos, manteniendo todos los datos almacenados en la instancia, sin preocuparnos de crear campos ocultos para ir pasando los datos de una pgina a otra.
personales.aspx expediente.aspx economicos.aspx
Cargar Datos
Guardar Datos
alumnoActual.Guarda();
Tema 9 / Pgina 1
Las pginas web de ASP.NET tiene una tcnica para mantener los cambios de estado entre envos de datos, llamado Viewstate. Viewstate almacena el estado de los controles de un formulario web para poder recuperarlos despus de un reenvo. Por defecto en un campo oculto del formulario llamado _VIEWSTATE. Podemos aprovecharnos de esta caracterstica para almacenar nuestros objetos en el viewstate y recuperarlos despus de un envo de datos.
Serializacin de clases
Para poder poder pasar un objeto de un envo a otro se necesita que el objeto sea transformable en una cadena de texto. Esto se hace mediante la directiva Serializable que pondremos antes de la declaracin de la clase. Por ejemplo en nuestra clase de alumno pondramos:
[Serializable] public class ClaseAlumno { private int _numeroExpediente; private int _nombre;
...
Si una clase tiene como variables miembro otras clases estas tambin tienen que ser serializables. Por ejemplo si la clase de alumno tuviese una variable miembro del tipo clase expediente:
[Serializable] public class ClaseAlumno { private int _numeroExpediente; private int _nombre; private ClaseExpediente _expediente;
Ahora ya se puede transformar las instancias de la clase en una cadena de texto para ser enviado de pgina a pgina.
Tema 9 / Pgina 2
Si intentamos guardar en ViewState un objeto de una clase que no est marcada como serializable obtendremos el error: El tipo 'NombreDeLaClase' del ensamblado 'App_Code.axi01zgc, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' no est marcado como serializable
Ejemplo, nos guardamos un objeto alumno en viewstate y lo leemos si hay envo de datos
ClaseAlumno elAlumno; protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { elAlumno = new ClaseAlumno(); elAlumno.Nombre = "Pepe"; elAlumno.Apellidos = "Garca Lpez"; ViewState["elAlumno"] = elAlumno; Consola.Text = "<br />" + elAlumno.Nombre + " " + elAlumno.Apellidos + " guardado en View State"; } else { elAlumno = (ClaseAlumno) ViewState["elAlumno"]; Consola.Text = "<br />" + elAlumno.Nombre + " " + elAlumno.Apellidos + " ledo de View State"; } }
Tema 9 / Pgina 3
Recuperarlo
laAlumna = (ClaseAlumno)Session["laAlumna"];
Tema 9 / Pgina 4
Controles dinmicos
Puede ser que a priori no conozcamos los controles que vamos a mostrar en una pgina, que estos dependan por ejemplo de ciertos valores que tenemos en una base de datos y que cambian en distintas ejecuciones de la pgina. Por ejemplo si mostramos un formulario para modificar los datos de un alumno y sus estudios. Hasta que no sepamos el alumno que vamos a modificar no sabremos cuantos ni que estudios tiene por lo que los controles de la pgina tendrn que generarse al vuelo.
Propiedades ms comunes
A continuacin se muestran algunos de las propiedades ms comunes que se aplican a los controles
AutoPostBack Indica si se produce una devolucin automtica de datos cuando el control cabia ClientID Identificador del control de servidor generado por .NET CssClass Estilo que se le va a aplicar al control Enabled Establece si esta habilitado o no
EnableViewState
Indica si tiene que mantener su valor entre reenvos ID Obtiene o establece el identificador de programacin Page Obtiene una referencia a la pgina que contiene el control Parent Obtiene una referencia al control que contiene al actual
Tema 9 / Pgina 5
ReadOnly Obtiene o establece si el control es de slo lectura SkinID Identificador del skin para el control Text Contenido del control Visible Obtiene o establece si el control es visible o no
Paneles
Utilizaremos los paneles como contenedores de otros controles
Panel Datos = new Panel(); Datos.ID = "DatosAlumno"; Datos.CssClass = "panelDatos"; Contenedor.Controls.Add(Datos);
Cajas de Texto
Para que el usuario introduzca datos
TextBox textBoxTitulo = new TextBox(); textBoxTitulo.ID = "TextBoxTitulo"; textBoxTitulo.Text = "Pon el titulo"; Datos.Controls.Add(textBoxTitulo);
Etiquetas
Para poner bloques de texto en los formularios. Podemos asociarlas a otro control.
Label titulo = new Label(); titulo.Text = "Titulo"; titulo.AssociatedControlID = "TextBoxTitulo"; Datos.Controls.Add(titulo);
Como se puede observar en los ejemplos estamos aadiendo los controles al primer control creado, el panel Datos, que a su vez es un control del panel Contenedor.
Tema 9 / Pgina 6
y el gestor
void botonAceptar_Click(object sender, EventArgs e) { // Gestionar evento }
Tema 9 / Pgina 7
Para buscar un control en una pgina o en otro control se utiliza el mtodo FindControl. Este mtodo recibe como parmetro el identificador del control y devuelve el control. Busca en toda la jerarqua de controles:
TextBox elTextBox = (TextBox) Page.FindControl("TextuuuBoxTitulo");
Tema 9 / Pgina 8