Валидация модели данных с помощью атрибутов DataAnnotations в ASP.NET MVC 3

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

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

Проект доступен по следующей ссылке Download.

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

Сообщения об ошибках, отображаемые в ответ на ошибки валидации

image

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

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

Неправильное пространство имён в частичном классе приведет к тому, что частичный класс не будет ассоциирован ни с одним из других классов. «Ничейный» частичный класс – одна из причин, по которой атрибуты DataAnnotations могут быть не рапознаны моделью данных. Чтобы избежать данной проблемы, убедитесь, что используете правильно пространство имён.

Назовите частичный класс согласно соответствующей таблице в модели данных и вставьте код.

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

В следующем примере показан частичный класс для таблицы 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; }
        }
    }
}

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

Создайте соответствующий класс (иногда его называют buddy class), который будет содержать свойства частичного класса, отображающего таблицу. Этот класс может иметь любое имя. Конвенцией наименования является добавление суффикса MD или MetaData в имя класса таблицы. Этот класс также должен быть использован с EDM или LINQ to SQL моделями, так как because CLR types cannot mark existing properties with new attributes. Если вы работаете с объектами CLR напрямую, или PlainOldCLRObject ( POCO ) , вы можете применить атрибуты прямо к модели.

Ассоциируйте новый класс с таблицей с помощью атрибута MetadataTypeAttribute. В предыдущем примере новый класс был ассоциирован с классом таблицы с помощью следующего кода:

[MetadataType(typeof(ProductMD))]

Примените атрибуты System.ComponentModel.DataAnnotations к свойства. Вы можете применить любое количество атрибутов к любому свойству.

Тестирование частичного класса

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

Тестирование частичного класса

Добавьте свойство в частичный класс, имя которого не будет соответствоать ни одному из свойств в соответствующей модели данных. Например, раскомментируйте свойство NoSuchProperty. Запустите проект и введите данные, которые необходимо проверить. Если частичный класс определяется, то, когда произойдет валидация, будет выброшено исключение InvalidOperationException с сообщением, подобным этому:

The associated metadata type for type 'MvcDA.Product' contains the following unknown properties or fields: NoSuchProperty. Please make sure that the names of these members match the names of the properties on the main type.

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

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

Валидация на клиентской стороне

После добавления валидации на серверной стороне, вы можете добавить валидацию также на клиентскую сторону с помощью необходимых 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> 

Компиляция кода

Для компиляции кода вам необходимо:

  • Visual Studio 2008 Service Pack 1 или Visual Web Developer 2008 Express Edition Service Pack 1 или версии выше.
  • База данных The AdventureWorksLT_2008. Скачать её можно по ссылке: Microsoft SQL Server Product Samples: Database на сайте CodePlex. Убедитесь, что вы установили корректную версию базы данных для вашего SQL Server (Microsoft SQL Server 2005 или Microsoft SQL Server 2008/R2).
  • Приложение MVC, в котором есть EDM, созданная согласно AdventureWorksLT_2008. Подробнее см. Creating Model Classes with the Entity Framework на веб-сайте ASP.NET