Compartir a través de


Introducción a Entity Framework 4.0 Database First y ASP.NET 4 Web Forms: parte 8

por Tom Dykstra

La aplicación web de ejemplo de Contoso University muestra cómo crear aplicaciones ASP.NET Web Forms utilizando Entity Framework 4.0 y Visual Studio 2010. Para obtener información sobre la serie de tutoriales, consulte el primer tutorial de la serie

Uso de la funcionalidad de datos dinámicos para dar formato y validar datos

En el tutorial anterior implementó procedimientos almacenados. En este tutorial se muestra cómo la funcionalidad de datos dinámicos puede proporcionar las siguientes ventajas:

  • Los campos tienen formato automático para mostrarse en función de su tipo de datos.
  • Los campos se validan automáticamente en función de su tipo de datos.
  • Puede agregar metadatos al modelo de datos para personalizar el formato y el comportamiento de validación. De este modo, podrá agregar las reglas de formato y validación en un solo lugar y se aplicarán automáticamente siempre que acceda a los campos mediante los controles de datos dinámicos.

Para ver cómo funciona esto, cambiará los controles que usa para mostrar y editar campos en la página Students.aspx existente y agregará metadatos de formato y validación a los campos de nombre y fecha del tipo de entidadStudent.

Image01

Uso de controles DynamicField y DynamicControl

Abra la página Students.aspx y, en el control StudentsGridView, reemplace los elementos Nombre y Fecha de inscripciónTemplateField por el marcado siguiente:

<asp:TemplateField HeaderText="Name" SortExpression="LastName">
                <EditItemTemplate>
                    <asp:DynamicControl ID="LastNameTextBox" runat="server" DataField="LastName" Mode="Edit" />
                    <asp:DynamicControl ID="FirstNameTextBox" runat="server" DataField="FirstMidName" Mode="Edit" />
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:DynamicControl ID="LastNameLabel" runat="server" DataField="LastName" Mode="ReadOnly" />,
                    <asp:DynamicControl ID="FirstNameLabel" runat="server" DataField="FirstMidName" Mode="ReadOnly" />
                </ItemTemplate>
            </asp:TemplateField>
            <asp:DynamicField DataField="EnrollmentDate" HeaderText="Enrollment Date" SortExpression="EnrollmentDate" />

Este marcado utiliza controles DynamicControl en lugar de controles TextBox y Label en el campo de plantilla de nombre de alumno y usa un control DynamicField para la fecha de inscripción. No se especifican cadenas de formato.

Agregue un control ValidationSummary después del control StudentsGridView.

<asp:ValidationSummary ID="StudentsValidationSummary" runat="server" ShowSummary="true"
        DisplayMode="BulletList" Style="color: Red" />

En el control SearchGridView, reemplace el marcado de las columnas Nombre y Fecha de inscripción como hizo en el control StudentsGridView, excepto si se omite el elemento EditItemTemplate. El elemento Columns del control SearchGridView ahora contiene el marcado siguiente:

<asp:TemplateField HeaderText="Name" SortExpression="LastName">
                <ItemTemplate>
                    <asp:DynamicControl ID="LastNameLabel" runat="server" DataField="LastName" Mode="ReadOnly" />,
                    <asp:DynamicControl ID="FirstNameLabel" runat="server" DataField="FirstMidName" Mode="ReadOnly" />
                </ItemTemplate>
            </asp:TemplateField>
            <asp:DynamicField DataField="EnrollmentDate" HeaderText="Enrollment Date" SortExpression="EnrollmentDate" />

Abra Students.aspx.cs y agregue la siguiente instrucción using:

using ContosoUniversity.DAL;

Agregue un controlador para el evento Init de la página:

protected void Page_Init(object sender, EventArgs e)
{
    StudentsGridView.EnableDynamicData(typeof(Student));
    SearchGridView.EnableDynamicData(typeof(Student));
}

Este código especifica que los datos dinámicos proporcionarán formato y validación en estos controles enlazados a datos para los campos de la entidad Student. Si recibe un mensaje de error como el ejemplo siguiente al ejecutar la página, normalmente significa que ha olvidado llamar al método EnableDynamicData en Page_Init:

Could not determine a MetaTable. A MetaTable could not be determined for the data source 'StudentsEntityDataSource' and one could not be inferred from the request URL.

Ejecute la página.

Image03

En la columna Fecha de inscripción, la hora se muestra junto con la fecha porque el tipo de propiedad es DateTime. Lo corregirá más adelante.

Por ahora, observe que los datos dinámicos proporcionan automáticamente la validación básica de los datos. Por ejemplo, haga clic en Editar, borre el campo de fecha, haga clic en Actualizar y verá que los datos dinámicos hacen que este campo sea obligatorio porque el valor no admite valores NULL en el modelo de datos. La página muestra un asterisco después del campo y un mensaje de error en el control ValidationSummary:

Image05

Puede omitir el control ValidationSummary, ya que también puede mantener el puntero del mouse sobre el asterisco para ver el mensaje de error:

Image06

Los datos dinámicos también validarán que los datos especificados en el campo Fecha de inscripción sean una fecha válida:

Image04

Como puede ver, se trata de un mensaje de error genérico. En la sección siguiente verá cómo personalizar los mensajes, así como las reglas de validación y formato.

Agregar metadatos al modelo de datos

Normalmente, se quiere personalizar la funcionalidad proporcionada por datos dinámicos. Por ejemplo, puede cambiar cómo se muestran los datos y el contenido de los mensajes de error. También se suelen personalizar las reglas de validación de datos para proporcionar más funciones que las que los datos dinámicos proporcionan automáticamente en función de los tipos de datos. Para ello, cree clases parciales que se correspondan con los tipos de entidad.

En el Explorador de soluciones, haga clic con el botón derecho en el proyecto ContosoUniversity, seleccione Agregar referencia y agregue una referencia a System.ComponentModel.DataAnnotations.

Image11

En la carpeta DAL, cree un nuevo archivo de clase denominado Student.cs y reemplace el código de plantilla con el código siguiente.

using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

namespace ContosoUniversity.DAL
{
    [MetadataType(typeof(StudentMetadata))]
    public partial class Student
    {
    }

    public class StudentMetadata
    {
        [DisplayFormat(DataFormatString="{0:d}", ApplyFormatInEditMode=true)]
        public DateTime EnrollmentDate { get; set; }

        [StringLength(25, ErrorMessage = "First name must be 25 characters or less in length.")]
        [Required(ErrorMessage="First name is required.")]
        public String FirstMidName { get; set; }

        [StringLength(25, ErrorMessage = "Last name must be 25 characters or less in length.")]
        [Required(ErrorMessage = "Last name is required.")]
        public String LastName { get; set; }
    }
}

Este código crea una clase parcial para la entidad Student. El atributo MetadataType aplicado a esta clase parcial identifica la clase que se usa para especificar metadatos. La clase de metadatos puede tener cualquier nombre, pero se suele usar el nombre de entidad más "Metadatos".

Los atributos aplicados a las propiedades de la clase de metadatos especifican el formato, la validación, las reglas y los mensajes de error. Los atributos que se muestran aquí tendrán los siguientes resultados:

  • EnrollmentDate se mostrará como una fecha (sin una hora).
  • Ambos campos de nombre deben tener 25 caracteres o menos de longitud y se proporciona un mensaje de error personalizado.
  • Se requieren los dos campos de nombre y se proporciona un mensaje de error personalizado.

Vuelva a ejecutar la página Students.aspx y verá que las fechas se muestran ahora sin horas:

Image08

Edite una fila e intente borrar los valores de los campos de nombre. Los asteriscos que indican los errores de campo aparecen en cuanto sale de un campo, antes de hacer clic en Actualizar. Al hacer clic en Actualizar, la página muestra el texto del mensaje de error que ha especificado.

Image10

Intente escribir nombres que tienen más de 25 caracteres, haga clic en Actualizar, y la página mostrará el texto del mensaje de error que haya especificado.

Image09

Ahora que ha configurado estas reglas de formato y validación en los metadatos del modelo de datos, las reglas se aplicarán automáticamente en todas las páginas que muestren o permitan cambios en estos campos, siempre y cuando use los controles DynamicControl o DynamicField. Esto reduce la cantidad de código redundante que hay que escribir, lo que facilita la programación y las pruebas, y garantiza que el formato y la validación de los datos sean coherentes en toda la aplicación.

Más información

Aquí concluye esta serie de tutoriales sobre Introducción a Entity Framework. Para obtener más recursos que le ayuden a aprender a usar Entity Framework, continúe con el primer tutorial de la siguiente serie de tutoriales de Entity Framework o visite los sitios siguientes: