Introducción con Entity Framework 4,0 Database First y ASP.NET 4 formularios Web Forms, parte 8

por Tom Dykstra

En la aplicación Web de ejemplo contoso University se muestra cómo crear aplicaciones de formularios Web Forms de ASP.NET mediante el Entity Framework 4,0 y Visual Studio 2010. Para obtener información sobre la serie de tutoriales, consulte el primer tutorial de la serie .

Usar 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 datos dinámicos funcionalidad puede proporcionar las siguientes ventajas:

  • Los campos se formatean automáticamente para su presentación en función de su tipo de datos.
  • Los campos se validan automáticamente según su tipo de datos.
  • Puede agregar metadatos al modelo de datos para personalizar el comportamiento de formato y validación. Al hacerlo, puede Agregar las reglas de formato y validación en un solo lugar y se aplican de forma automática en todos los lugares en los que tiene acceso a los campos mediante controles de datos dinámicos.

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

Image01

Usar los controles DynamicField y DynamicControl

Abra la página Students. aspx y, en el control StudentsGridView, reemplace el nombre y la fecha de inscripción TemplateField elementos 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 usa DynamicControl controles en lugar de los controles TextBox y Label en el campo de plantilla nombre de estudiante y usa un control DynamicField para la fecha de inscripción. No se ha especificado ninguna cadena 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 reemplazar el marcado de las columnas nombre y fecha de inscripción tal como hizo en el control StudentsGridView, excepto omitir el elemento EditItemTemplate. El elemento Columns del control de SearchGridView contiene ahora 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 de 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 datos dinámicos proporcionará formato y validación en estos controles enlazados a datos para los campos de la entidad Student. Si recibe un mensaje de error similar al del 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 , se muestra la hora junto con la fecha porque el tipo de propiedad es DateTime. Lo corregirá más adelante.

Por ahora, tenga en cuenta que datos dinámicos proporciona automáticamente la validación de datos básica. Por ejemplo, haga clic en Editar, desactive el campo fecha, haga clic en Actualizary verá que datos dinámicos lo convierte automáticamente en un campo obligatorio porque el valor no acepta 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, porque también puede mantener el puntero del mouse sobre el asterisco para ver el mensaje de error:

Image06

Datos dinámicos también validará que los datos introducidos en el campo de 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 formato y validación.

Agregar metadatos al modelo de datos

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

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

Image11

En la carpeta Dal , cree un nuevo archivo de clase, asígnele el nombre Student.CSy reemplace el código de plantilla por 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 los metadatos. La clase de metadatos puede tener cualquier nombre, pero el uso del nombre de entidad más "metadatos" es una práctica común.

Los atributos aplicados a las propiedades de la clase Metadata 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 una longitud de 25 caracteres o menos, y se proporciona un mensaje de error personalizado.
  • Ambos campos de nombre son obligatorios 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 las horas:

Image08

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

Image10

Intente especificar nombres de más de 25 caracteres, haga clic en Actualizary la página mostrará el texto del mensaje de error 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 DynamicControl o DynamicField controles. Esto reduce la cantidad de código redundante que tiene que escribir, lo que facilita la programación y las pruebas, y garantiza que el formato y la validación de los datos son coherentes en toda la aplicación.

Más información

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