Практическое руководство. Настройка проверки полей данных в модели данных

Visual Studio 2010

Обновлен: Июль 2008

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

  • Настройка проверки для отдельных полей данных путем применения к полям атрибутов System.ComponentModel.DataAnnotations платформы динамических данных. Эти атрибуты определяют распространенные схемы проверки, такие как проверка на принадлежность диапазону и на наличие данных в обязательных полях. Такой подход позволяет использовать предопределенные проверки с написанием очень небольшого количества кода. Им следует пользоваться, когда требуется применить некоторую проверку в дополнение к обеспечиваемой платформой динамических данных, и атрибутов System.ComponentModel.DataAnnotations достаточно для конкретной ситуации.

    Cc488527.alert_note(ru-ru,VS.100).gifПримечание.

    Можно также создавать собственные настраиваемые атрибуты проверки. Это позволяет расширить проверку, обеспечиваемую атрибутами System.ComponentModel.DataAnnotations. Такой подход удобен, когда имеющиеся атрибуты не соответствуют требованиям, предъявляемым к проверке определенного поля данных. Дополнительные сведения см. в разделе Практическое руководство. Настройка проверки полей данных в модели данных с использованием настраиваемых атрибутов.

  • Настройка проверки для отдельного поля данных путем переопределения метода разделяемого класса, обрабатывающего изменения для данного поля данных (или путем обработки соответствующего события). Такой подход позволяет добавить логику проверки и бизнес-логику для отдельного поля.

  • Настройка проверки для любого поля данных путем переопределения метода OnValidate (или обработки события Validate). Этот метод вызывается при обработке какого-либо поля данных в таблице. Это более общий подход, чем добавление проверки для отдельного поля. Им удобно пользоваться, когда требуется применить одну и ту же логику проверки к нескольким полям данных. Кроме того, он позволяет выполнять проверки, в которых задействованы несколько полей.

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

  • Для всех проверок, добавляемых в модель данных, необходимо создать разделяемый класс, расширяющий класс таблицы в модели данных. Проверки затем добавляются в этот разделяемый класс.

Запустите пример этой функции в Интернете.

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

  • Настройка проверки путем добавления метаданных посредством атрибутов.

  • Настройка проверки путем реализации методов разделяемого класса, позволяющих создать свою собственную логику проверки.

Чтобы создать разделяемый класс для проверки

  1. В Обозревателе решений щелкните правой кнопкой мыши папку App_Code и выберите команду Добавить новый элемент.

  2. В группе Установленные шаблоны Visual Studio выберите шаблон Класс.

    В поле Имя введите имя таблицы данных, для которой требуется создать проверку.

    Имя класса должно совпадать с именем класса сущностей, представляющего таблицу. Например, для создания проверки для таблицы Customer необходимо назвать файл Customer.cs в Visual C# или Customer.vb в Visual Basic и назвать класс Customer.

  3. Добавьте ключевое слово Partial в Visual Basic или ключевое слово partial в Visual C# в определение созданного класса, чтобы сделать его разделяемым классом. 

    В следующем примере показано обновленное объявление класса.

    public partial class Customer {
        
    }
    

    Partial Public Class Customer
        
    End Class
    
  4. Если класс создается в Visual C#, удалите конструктор по умолчанию.

  5. Добавьте ссылки на пространства имен System.Web.DynamicData и System.ComponentModel.DataAnnotations, используя ключевое слово Imports в Visual Basic или ключевое слово using в Visual C#, как показано в следующем примере.

    using System.Web.DynamicData;
    using System.ComponentModel.DataAnnotations;
    

    Imports System.Web.DynamicData
    Imports System.ComponentModel.DataAnnotations
    
  6. В этом же файле создайте второй класс, который будет выступать в качестве связанного класса метаданных. Этому классу можно дать любое допустимое незанятое имя.

    В следующем примере показано объявление класса метаданных.

    [C#]

    public class CustomerMetadata
    {
      
    }
    

    Public Class CustomerMetadata 
      
    End Class
    

    Связанный класс метаданных обеспечивает объект, к которому можно применить атрибуты проверки.

  7. Примените к определению разделяемого класса атрибут MetadataTypeAttribute. В качестве параметра атрибута укажите имя связанного класса метаданных, созданного на предыдущем шаге.

    В следующем примере показано определение разделяемого класса с добавленным атрибутом.

    [MetadataType(typeof(CustomerMetadata))]
    public partial class Customer {
        
    }
    

    <MetadataType(GetType(CustomerMetadata))> _
    Partial Public Class Customer
        
    End Class
    

В этом разделе рассматривается настройка проверки путем использования правил проверки по умолчанию, предоставляемых атрибутами System.ComponentModel.DataAnnotations платформы динамических данных.

Чтобы проверять определенное поле данных с использованием атрибутов проверки

  1. В классе метаданных создайте свойство или поле с именем, соответствующим подлежащему проверке полю данных.

  2. Примените к свойству один из атрибутов в пространстве имен System.ComponentModel.DataAnnotations.

    В следующем примере показано применение атрибута System.ComponentModel.DataAnnotations.RequiredAttribute к полю данных Title в связанном классе метаданных. При вводе пользователем пустой строки метод IsValid вызывает исключение проверки и генерирует сообщение об ошибке.

    Cc488527.alert_note(ru-ru,VS.100).gifПримечание.

    После применения атрибута RequiredAttribute страница будет требовать от пользователей ввода значения, даже если база данных этого не требует.

    public class CustomerMetadata
    {
      [Required()]
      public object Title;
    }
    

    Public Class CustomerMetadata 
      <Required()> _
      Public Title As Object
    End Class
    

В этом разделе рассматривается настройка проверки путем переопределения метода разделяемого класса, который обрабатывает изменения, вносимые в отдельное поле данных. Этот тип проверки позволяет создавать собственные правила для выполнения проверки вместо использования встроенных в платформу динамических данных средств проверки, реализованных в атрибутах System.ComponentModel.DataAnnotations.

Чтобы проверять определенное поле данных с использованием метода разделяемого класса

  1. Переопределите метод разделяемого класса, обрабатывающий внесенные в поле данных изменения.

  2. Добавьте свою собственную логику проверки.

    В следующем примере показано переопределение метода OnTitleChanging в разделяемом классе Customer. Этот метод вызывается при изменении поля Title в таблице данных Customer. Приведенный код проверяет, начинается ли новое введенное пользователем обращение с буквы верхнего регистра. Если данные не проходят проверку, метод создает исключение. Подлежащее проверке значение передается методу в качестве единственного параметра. Этот параметр типизируется в соответствии с типом проверяемых данных.

    Cc488527.alert_note(ru-ru,VS.100).gifПримечание.

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

    public partial class Customer 
    {
      partial void OnTitleChanging(string value) 
      {
        if (!Char.IsUpper(value[0])) {
          throw new ValidationException(
           "Title must start with an uppercase letter.");}
        }
    }
    

    Public Partial Class Customer
      Private Sub OnTitleChanging(ByVal value As String)
        If Not [Char].IsUpper(value(0)) Then
          Throw New ValidationException( _
            "Title must start with an uppercase letter.")
        End If
      End Sub
    End Class
    

В этом разделе рассматривается настройка проверки путем переопределения метода разделяемого класса, который обрабатывает изменения, вносимые в любое поле данных в таблице. Этот тип проверки позволяет создавать собственные правила для выполнения проверки вместо использования встроенных в платформу динамических данных средств проверки, реализованных в атрибутах System.ComponentModel.DataAnnotations. Им удобно пользоваться, когда требуется применить одну и ту же логику проверки к нескольким полям данных. Кроме того, он позволяет выполнять проверки, в которых задействованы несколько полей.

Чтобы проверять любое поле данных с использованием метода разделяемого класса

  1. Переопределите метод разделяемого класса OnValidate, вызываемый при внесении изменений в любое поле данных в таблице.

  2. Добавьте свою собственную логику проверки.

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

    Cc488527.alert_note(ru-ru,VS.100).gifПримечание.

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

    partial void OnValidate(
        System.Data.Linq.ChangeAction action)
        {
            if (!Char.IsUpper(this._LastName[0]) || 
                !Char.IsUpper(this._FirstName[0]))
              throw new  ValidationException(
                 "Name must start with an uppercase letter.");
            }
    

    Private Sub OnValidate(ByVal action As _  
           System.Data.Linq.ChangeAction)
        If Not [Char].IsUpper(Me._LastName(0)) OrElse _
                Not [Char].IsUpper(Me._FirstName(0)) Then
            Throw New ValidationException( _
                "Name must start with an uppercase letter.")
        End If
    End Sub
    

В следующем примере атрибут RequiredAttribute используется для проверки данных в поле Title таблицы Customer. Для проверки того, начинаются ли введенные пользователем значения для полей данных Title, FirstName, и LastName с буквы верхнего регистра, используется метод разделяемого класса OnValidate. Кроме того, с помощью метода разделяемого класса OnOderQtyChanging проверяется, является ли введенное пользователем значение для поля данных OrderQty таблицы SalesOrderDetails больше заданного минимума.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.DynamicData;
using System.ComponentModel.DataAnnotations;

[MetadataType(typeof(CustomerMetadata))]
public partial class Customer
{


    partial void OnValidate(System.Data.Linq.ChangeAction action)
    {
        if (!char.IsUpper(this._LastName[0]) ||
            !char.IsUpper(this._FirstName[0])  ||
            !char.IsUpper(this._Title[0]))
            throw new ValidationException(
               "Data value must start with an uppercase letter.");
    }


}

public class CustomerMetadata
{
    [Required()]
    public object Title;

}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.DynamicData;
using System.ComponentModel.DataAnnotations;

public partial class SalesOrderDetail
{
    partial void OnOrderQtyChanging(short value)
    {
        if (value < 100)
        {
            throw new ValidationException(
                "Quantity is less than the allowed minimum of 100.");
        }
    }
}



<%@ Page Language="C#" 
AutoEventWireup="true" CodeFile="CustomValidation.aspx.cs" 
Inherits="CustomValidation" %>


<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title></title>
    <link href="~/Site.css" rel="stylesheet" type="text/css" />
</head>
<body>
     <h2>Example: <%=Title%></h2>

     <!-- Enable dynamic behavior. The GridView must be 
     registered with the manager. See code-behind file. -->
    <asp:DynamicDataManager ID="DynamicDataManager1" runat="server"
        AutoLoadForeignKeys="true" />


    <form id="form1" runat="server">

        <!-- Capture validation exceptions -->
        <asp:DynamicValidator ID="ValidatorID" ControlToValidate="GridView1" 
            runat="server" /> 
        <asp:DynamicValidator ID="DynamicValidator1" ControlToValidate="GridView2" 
            runat="server" /> 
        <table>
            <tr>
                <td align="left" valign="top" style="font-weight:bold">
                    Customize Validation Using the Table OnValidate 
                </td>
                <td>
                    <asp:GridView ID="GridView1" 
                        runat="server" 
                        DataSourceID="GridDataSource" 
                        AutoGenerateColumns="false"  
                        AutoGenerateEditButton="true"
                        AllowPaging="true" 
                        PageSize="5"
                        AllowSorting="true">
                        <Columns>
                            <asp:DynamicField DataField="Title" />
                            <asp:DynamicField DataField="FirstName" />
                            <asp:DynamicField DataField="LastName" />
                        </Columns>
                        <EmptyDataTemplate>
                            There are currently no items in this table.
                        </EmptyDataTemplate>
                    </asp:GridView>
                </td>
            </tr>
            <tr>
                <td align="left" valign="top" style="font-weight:bold">
                    Customize Validation Using OnOrderQtyChanging
                </td>
                <td>
                    <asp:GridView ID="GridView2" 
                        runat="server" 
                        DataSourceID="GridDataSource2" 
                        AutoGenerateColumns="false"  
                        AutoGenerateEditButton="true"
                        AllowPaging="true" 
                        PageSize="5"
                        AllowSorting="true">
                        <Columns>
                            <asp:DynamicField DataField="OrderQty" />
                        </Columns>
                        <EmptyDataTemplate>
                            There are currently no items in this table.
                        </EmptyDataTemplate>
                    </asp:GridView>
                </td>
            </tr>
        </table>

    </form>

    <!-- Connect to the database -->
    <asp:LinqDataSource ID="GridDataSource" runat="server"  
         TableName="Customers" EnableUpdate="true"
        ContextTypeName="AdventureWorksLTDataContext">

    </asp:LinqDataSource>

     <!-- Connect to the database -->
    <asp:LinqDataSource ID="GridDataSource2" runat="server"  
         TableName="SalesOrderDetails" EnableUpdate="true"
        ContextTypeName="AdventureWorksLTDataContext">

    </asp:LinqDataSource>
</body>
</html>


using System;
using System.Collections;
using System.Configuration;
using System.Web.DynamicData;

public partial class CustomValidation : System.Web.UI.Page
{
    protected MetaTable _table1, _table2;

    protected void Page_Init(object sender, EventArgs e)
    {
        // Register data controls with the data manager.
        DynamicDataManager1.RegisterControl(GridView1);
        DynamicDataManager1.RegisterControl(GridView2);
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        // Get the table entities.
        _table1 = GridDataSource.GetTable();
        _table2 = GridDataSource2.GetTable();

        // Assign title dynamically.
        Title = string.Concat("Customize Validation of the ",
            _table1.Name, " and ",  _table2.Name, " Tables");

    }
}


Для компиляции кода примера потребуются следующие компоненты.

  • Microsoft Visual Studio 2008 с пакетом обновления 1 или Visual Web Developer 2008, экспресс-выпуск с пакетом обновления 1.

  • Учебная база данных AdventureWorksLT. Сведения о загрузке и установке учебной базы данных SQL Server см. в разделе Microsoft SQL Server Product Samples: Database на узле CodePlex. Важно установить правильную версию базы данных, соответствующую используемой версии SQL Server (Microsoft SQL Server 2005 или Microsoft SQL Server 2008).

Веб-узел на платформе динамических данных. Позволяет создать контекст данных для базы данных и создать класс, содержащий настраиваемое поле данных и переопределяемые методы. Дополнительные сведения см. в разделе Walkthrough: Creating a New Dynamic Data Web Site Using Scaffolding.

Дата

Журнал

Причина

Июль 2008

Раздел добавлен.

Изменение функции SP1.

Показ: