Начало работы с Entity Framework 4.0 в режиме Database First и ASP.NET 4 Web Forms — часть 8

Том Дайкстра

Пример веб-приложения Contoso University наглядно показывает, как создавать приложения ASP.NET Web Forms с помощью Entity Framework 4.0 и Visual Studio 2010. Для информации о серии учебных руководств см. первый учебник этой серии

Использование функции динамических данных для форматирования и проверки данных

В предыдущем руководстве вы реализовали хранимые процедуры. В этом руководстве показано, как функциональность динамических данных может обеспечить следующие преимущества:

  • Поля автоматически форматируются для отображения на основе их типа данных.
  • Поля автоматически проверяются на основе их типа данных.
  • Вы можете добавить метаданные в модель данных для настройки поведения форматирования и проверки. При этом можно добавить правила форматирования и проверки только в одном месте, и они автоматически применяются везде, где вы обращаетесь к полям с помощью элементов управления динамическими данными.

Чтобы узнать, как это работает, вы измените элементы управления, используемые для отображения и изменения полей на существующей странице Students.aspx , и вы добавите метаданные форматирования и проверки в поля Student имени и даты типа сущности.

Image01

Использование элементов управления DynamicField и DynamicControl

Откройте страницу Students.aspx и в элементе управления StudentsGridView замените элементы Имя и Дата зачисленияTemplateField следующей разметкой:

<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" />

Эта разметка использует элементы управления DynamicControl вместо элементов TextBox и Label в поле шаблона имени учащегося и использует элемент управления DynamicField для даты регистрации. Строки формата не указаны.

Добавьте ValidationSummary элемент управления после элемента управления StudentsGridView.

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

В элементе управления SearchGridView замените разметку для столбцов Name и Enrollment Date так же, как в элементе управления StudentsGridView, за исключением элемента EditItemTemplate. Элемент Columns элемента управления SearchGridView теперь содержит следующую разметку:

<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" />

Откройте Students.aspx.cs и добавьте следующую using инструкцию:

using ContosoUniversity.DAL;

Добавьте обработчик события страницы Init :

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

Этот код указывает, что динамические данные будут предоставлять форматирование и проверку в этих элементах управления, привязанных к данным, для полей сущности Student . Если при запуске страницы появится сообщение об ошибке, как показано в следующем примере, обычно это означает, что вы забыли вызвать EnableDynamicData метод в 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.

Запустите страницу.

Image03

В столбце "Дата регистрации" время отображается вместе с датой, так как тип свойства имеет значение DateTime. Вы исправите это позже.

Теперь обратите внимание, что динамические данные автоматически предоставляют базовую проверку данных. Например, нажмите кнопку "Изменить", снимите поле даты, нажмите кнопку "Обновить", и вы увидите, что динамические данные автоматически делают это обязательное поле, так как значение не допускает значения NULL в модели данных. На странице отображается звездочка после поля и сообщение об ошибке в управляющем элементе ValidationSummary.

Image05

Вы можете опустить ValidationSummary контрол, так как вы также можете навести указатель мыши на звездочку, чтобы увидеть сообщение об ошибке.

Image06

Динамические данные также проверяют, что данные, введенные в поле "Дата регистрации", являются допустимой датой:

Image04

Как видно, это универсальное сообщение об ошибке. В следующем разделе вы узнаете, как настроить сообщения, а также правила проверки и форматирования.

Добавление метаданных в модель данных

Как правило, необходимо настроить функциональные возможности, предоставляемые динамическими данными. Например, можно изменить способ отображения данных и содержимое сообщений об ошибках. Обычно вы также настраиваете правила проверки данных для обеспечения большей функциональности, чем то, что Dynamic Data предоставляет автоматически на основе типов данных. Для этого создаются частичные классы, соответствующие типам сущностей.

В Обозреватель решений щелкните правой кнопкой мыши проект ContosoUniversity, выберите "Добавить ссылку" и добавьте ссылкуSystem.ComponentModel.DataAnnotations.

Image11

В папке DAL создайте файл класса, назовите его Student.cs и замените в нем код шаблона следующим кодом.

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; }
    }
}

Этот код создает частичный класс для сущности Student . Атрибут, MetadataType применяемый к этому частичному классу, определяет класс, который используется для указания метаданных. Класс метаданных может иметь любое имя, но использование имени сущности плюс "Метаданные" является распространенной практикой.

Атрибуты, применяемые к свойствам в классе метаданных, указывают форматирование, проверку, правила и сообщения об ошибках. Атрибуты, показанные здесь, будут иметь следующие результаты:

  • EnrollmentDate будет отображаться как дата (без времени).
  • Оба поля имени должны быть 25 символами или меньшей длиной, и предоставляется настраиваемое сообщение об ошибке.
  • Требуются оба поля имен, и предоставляется настраиваемое сообщение об ошибке.

Снова запустите страницу Students.aspx , и вы увидите, что даты отображаются без времени:

Image08

Измените строку и попытайтесь очистить значения в полях имени. Звездочки, указывающие на ошибки в поле, отображаются как только вы покинете поле, перед нажатием кнопки "Обновить". При нажатии кнопки "Обновить" на странице отображается указанный текст сообщения об ошибке.

Image10

Попробуйте ввести имена, длина которых превышает 25 символов, нажмите кнопку "Обновить", а на странице отображается указанный текст сообщения об ошибке.

Image09

Теперь, когда вы настроили эти правила форматирования и проверки в метаданных модели данных, правила будут автоматически применяться на каждой странице, отображающей или разрешающей изменения этих полей, если вы используете DynamicControl или DynamicField элементы управления. Это сокращает объем избыточного кода, который упрощает программирование и тестирование, и гарантирует согласованность форматирования и проверки данных во всем приложении.

Дополнительные сведения

Этим завершается серия руководств по началу работы с Entity Framework. Дополнительные ресурсы, которые помогут вам узнать, как использовать Entity Framework, перейдите к первому руководству в следующем руководстве по Entity Framework или посетите следующие сайты: