Экспорт (0) Печать
Развернуть все
Эта статья переведена вручную. Наведите указатель мыши на предложения статьи, чтобы просмотреть исходный текст.
Перевод
Текст оригинала

Практическое руководство. Проверка данных модели с помощью атрибутов DataAnnotations

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

Атрибуты System.ComponentModel.DataAnnotations могут быть использованы с моделью EDM (сущностная модель данных), LINQ to SQL и другими моделями данных. Можно также создавать собственные настраиваемые атрибуты проверки. Дополнительные сведения см. в разделе How to: Customize Data Field Validation in the Data Model Using Custom Attributes.

Проект Visual Studio с исходным кодом этого примера, прилагающийся к этому разделу, доступен на странице загрузки.

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

Сообщения, которые отображаются в браузере в ответ на ошибки проверки

Ошибки проверки

Добавление проверки с помощью атрибутов DataAnnotations

  1. Добавьте в проект класс, содержащий определения разделяемого класса. Дополнительные сведения см. в разделе How to: Customize Data Field Validation in the Data Model.

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

    Примечание.Примечание.

    Неправильное пространство имен, которое используется в разделяемом классе, приводит к появлению открытого разделяемого класса — это разделяемый класс, который не связан с другим классом. Открытый разделяемый класс является стандартной причиной, по которой атрибуты DataAnnotations не распознаются моделью данных. Для предупреждения этой проблемы можно копировать пространство имен из кода модели данных — это гарантирует, что пространство имен будет правильным.

  3. Присвойте разделяемому классу имя, которое сопоставлено объявлению класса, представленному в таблице в модели данных и вставьте его в новый файл класса.

    Примечание.Примечание.

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

    В следующем примере показан разделяемый класс для таблицы Product из образца базы данных AdventureWorksLT_2008. В этом примере база данных представлена пространством имен MvcDA.

    using System.ComponentModel.DataAnnotations;  
    namespace MvcDA {
        [MetadataType(typeof(ProductMD))]
        public partial class Product {
            public class ProductMD {
                [StringLength(50),Required]
                public object Name { get; set; }
                [StringLength(15)]
                public object Color { get; set; }
                [Range(0, 9999)]
                public object Weight { get; set; }
              //  public object NoSuchProperty { get; set; }
            }
        }
    }
    

    Imports System.ComponentModel.DataAnnotations
    
    <MetadataType(GetType(ProductMD))> _
    Partial Public Class Product
    End Class
    
    Public Class ProductMD
        Private _Name As Object
        <StringLength(60)> _
        <Required()> _
        Public Property Name() As Object
            Get
                Return _Name
            End Get
            Set(ByVal value As Object)
                _Name = value
            End Set
        End Property
    
        Private _Color As Object
        <StringLength(60)> _
        Public Property Color() As Object
            Get
                Return _Color
            End Get
            Set(ByVal value As Object)
                _Color = value
            End Set
        End Property
    
        Private _Weight As Object
        <Required(), StringLength(50)> _
        Public Property Weight() As Object
            Get
                Return _Weight
            End Get
            Set(ByVal value As Object)
                _Weight = value
            End Set
        End Property
    
        'Private _NoSuchProperty As Object
        '<Required(), StringLength(30)> _
        'Public Property NoSuchProperty() As Object
        '    Get
        '        Return _NoSuchProperty
        '    End Get
        '    Set(ByVal value As Object)
        '        _NoSuchProperty = value
        '    End Set
        'End Property
    
    End Class
    
    Примечание.Примечание.

    Свойство с именем NoSuchProperty включено в класс и закомментировано. Это свойство можно использовать для тестирования разделяемого класса, как показано далее в этом разделе.

  4. Создайте связанный класс (иногда называемый класс-близнец), содержащий свойства разделяемого класса, который представляет таблицу.

    Связанный класс может иметь любое имя, по соглашению к имени класса таблицы добавляется суффикс "MD" или "MetaData". Связанный класс должен использоваться вместе с моделями EDM или LINQ-to-SQL, так как типы CLR не могут отметить существующие свойства новыми атрибутами. При работе с объектами CLR напрямую, иногда их называют как типы POCO (Plain Old CLR Object), можно применить атрибуты прямо к модели.

  5. Свяжите новый класс конструктора с классом таблицы с помощью атрибута MetadataTypeAttribute.

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

    [MetadataType(typeof(ProductMD))]
    

    <MetadataType(GetType(ProductMD))> _
    
  6. Примените атрибуты System.ComponentModel.DataAnnotations к свойствам. К каждому свойству можно применить любое количество атрибутов.

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

Тестирование разделяемого класса

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

    Например, уберите комментарий у свойства NoSuchProperty, которое показано в примере предыдущей процедуры.

  2. Запустите проект и введите данные для проверки.

    Если разделяемый класс распознан, при выполнении проверки вызывается исключение InvalidOperationException вместе сообщением, которое представлено ниже.

    Связанный тип метаданных для типа MvcDA.Product содержит следующие неизвестные свойства или поля: NoSuchProperty. Убедитесь, что имена этих членов соответствуют именам свойств главного типа.

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

  3. Удалите свойство в разделяемом классе, которое было добавлено для тестирования.

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

Добавление проверки на стороне клиента

  • Добавьте ссылки на файлы проверки JavaScript в представление, содержащее элементы, которые требуется проверить. (Как правило, они включаются в файл Site.master — так обеспечивается возможность их применения к каждому представлению.)

    В примере ниже показано создание ссылки на файлы JavaScript, которые требуются для включения проверки на стороне клиента. (В данном примере ссылки указывают на отладочные версии библиотек.) В данном примере также показан вызов метода EnableClientValidation для включения проверки на стороне клиента. Стандартным способом включения проверки на стороне клиента является добавление следующего кода в файл Site.master. Кроме того, можно добавить его на страницу представления, реализующую проверку на стороне клиента. При размещении следующего кода на главной странице автоматически включается проверка на стороне клиента для каждого представления.

    <head runat="server">
      <script src="<%= Url.Content("~/Scripts/MicrosoftAjax.debug.js") %>" type="text/javascript"></script>
      <script src="<%= Url.Content("~/Scripts/MicrosoftMvcAjax.debug.js") %>" type="text/javascript"></script>
      <script src="<%= Url.Content("~/Scripts/MicrosoftMvcValidation.debug.js") %>" type="text/javascript"></script>
      <% Html.EnableClientValidation();%>
    </head> 
    

    <head runat="server">
      <script src="<%= Url.Content("~/Scripts/MicrosoftAjax.debug.js") %>" type="text/javascript"></script>
      <script src="<%= Url.Content("~/Scripts/MicrosoftMvcAjax.debug.js") %>" type="text/javascript"></script>
      <script src="<%= Url.Content("~/Scripts/MicrosoftMvcValidation.debug.js") %>" type="text/javascript"></script>
      <% Html.EnableClientValidation()%>
    </head>
    

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

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

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

  • Приложение MVC с моделью EDM, созданной из учебной базы данных AdventureWorksLT_2008. Дополнительные сведения см. в учебнике Создание классов модели с Entity Framework на веб-сайте ASP.NET.

Добавления сообщества

ДОБАВИТЬ
Корпорация Майкрософт проводит интернет-опрос, чтобы выяснить ваше мнение о веб-сайте MSDN. Если вы желаете принять участие в этом интернет-опросе, он будет отображен при закрытии веб-сайта MSDN.

Вы хотите принять участие?
Показ:
© 2014 Microsoft