Проверка с помощью проверяющих элементов управления заметок к данным (C#)Validation with the Data Annotation Validators (C#)

корпорацией Майкрософтby Microsoft

Воспользуйтесь преимуществами модели аннотации данных Binder для выполнения проверки в ASP.NET mVC-приложении.Take advantage of the Data Annotation Model Binder to perform validation within an ASP.NET MVC application. Узнайте, как использовать различные типы атрибутов валидатора и работать с ними в рамочной системе сущности Майкрософт.Learn how to use the different types of validator attributes and work with them in the Microsoft Entity Framework.

В этом уроке вы узнаете, как использовать валидаторы аннотации данных для выполнения проверки в ASP.NET mVC-приложении.In this tutorial, you learn how to use the Data Annotation validators to perform validation in an ASP.NET MVC application. Преимущество использования валидаторов аннотации данных заключается в том, что они позволяют выполнять проверку, просто добавляя один или несколько атрибутов, таких как атрибут «Требуемый» или «Струнный длина», в свойство класса.The advantage of using the Data Annotation validators is that they enable you to perform validation simply by adding one or more attributes – such as the Required or StringLength attribute – to a class property.

Прежде чем использовать валидаторы аннотации данных, необходимо загрузить модель "Биндер" по каннотам данных.Before you can use the Data Annotation validators, you must download the Data Annotations Model Binder. Вы можете скачать данные Аннотации Модель Binder Образец с веб-сайта CodePlex, нажав здесь.You can download the Data Annotations Model Binder Sample from the CodePlex website by clicking here.

Важно понимать, что модель наятивов данных Binder не является официальной частью платформы Microsoft ASP.NET MVC.It is important to understand that the Data Annotations Model Binder is not an official part of the Microsoft ASP.NET MVC framework. Хотя модель наятирований данных Была создана командой Microsoft ASP.NET MVC, корпорация Майкрософт не предлагает официальную поддержку продуктов для модели данных Binder, описанной и используемой в этом уроке.Although the Data Annotations Model Binder was created by the Microsoft ASP.NET MVC team, Microsoft does not offer official product support for the Data Annotations Model Binder described and used in this tutorial.

Использование связующего модели аннотации данныхUsing the Data Annotation Model Binder

Для того, чтобы использовать модельный разбойники данных в ASP.NET mVC-приложении, сначала необходимо добавить ссылку на сборку Microsoft.Web.Mvc.DataAnnotations.dll и сборку System.ComponentModel.DataAnnotations.dll.In order to use the Data Annotations Model Binder in an ASP.NET MVC application, you first need to add a reference to the Microsoft.Web.Mvc.DataAnnotations.dll assembly and the System.ComponentModel.DataAnnotations.dll assembly. Выберите вариант меню Project, добавьте справку.Select the menu option Project, Add Reference. Далее нажмите на вкладку «Обзор» и просмотрите место, где вы скачали (и расстегнули) образец модели Binder (см. рисунок 1).Next click the Browse tab and browse to the location where you downloaded (and unzipped) the Data Annotations Model Binder sample (see Figure 1).

Рисунок 1: Добавление ссылки на данные Аннотации модель Биндер (Нажмите, чтобы просмотреть полноразмерное изображение)Figure 1: Adding a reference to the Data Annotations Model Binder (Click to view full-size image)

Выберите сборку Microsoft.Web.Mvc.DataAnnotations.dll и System.ComponentModel.DataAnnotations.dll сборки и нажмите кнопку OK.Select both the Microsoft.Web.Mvc.DataAnnotations.dll assembly and the System.ComponentModel.DataAnnotations.dll assembly and click the OK button.

Вы не можете использовать сборку System.ComponentModel.DataAnnotations.dll, включенную в пакет рамочной службы .NET 1 с моделью Binder.You cannot use the System.ComponentModel.DataAnnotations.dll assembly included with .NET Framework Service Pack 1 with the Data Annotations Model Binder. Вы должны использовать версию Сборки System.ComponentModel.DataAnnotations.dll, включенную в загрузку модели модели Binder.You must use the version of the System.ComponentModel.DataAnnotations.dll assembly included with the Data Annotations Model Binder Sample download.

Наконец, необходимо зарегистрировать модель DataAnnotations Binder в файле Global.asax.Finally, you need to register the DataAnnotations Model Binder in the Global.asax file. Добавьте следующую строку_кода в обработчик события_Application Start() так, чтобы метод «Старт приложения») выглядел следующим образом:Add the following line of code to the Application_Start() event handler so that the Application_Start() method looks like this:

protected void Application_Start()
{
    RegisterRoutes(RouteTable.Routes);
    ModelBinders.Binders.DefaultBinder = new Microsoft.Web.Mvc.DataAnnotations.DataAnnotationsModelBinder();
}

Эта строка кода регистрирует ataAnnotationsModelInder в качестве связующего элемента модели по умолчанию для всего приложения MVC ASP.NET.This line of code registers the ataAnnotationsModelBinder as the default model binder for the entire ASP.NET MVC application.

Использование атрибутов валидатора аннотации данныхUsing the Data Annotation Validator Attributes

При использовании модели обновилий данных Inder вы используете атрибуты валидатора для выполнения проверки.When you use the Data Annotations Model Binder, you use validator attributes to perform validation. В пространстве имен System.ComponentModel.DataAnnotations включены следующие атрибуты валидатора:The System.ComponentModel.DataAnnotations namespace includes the following validator attributes:

  • Диапазон - Позволяет проверить, падает ли значение свойства между определенным диапазоном значений.Range – Enables you to validate whether the value of a property falls between a specified range of values.
  • RegularExpression - Позволяет проверить, соответствует ли значение свойства определенному шаблону регулярного выражения.RegularExpression – Enables you to validate whether the value of a property matches a specified regular expression pattern.
  • Требуется - Позволяет пометить свойство по мере необходимости.Required – Enables you to mark a property as required.
  • StringLength - Позволяет указать максимальную длину для свойства строки.StringLength – Enables you to specify a maximum length for a string property.
  • Проверка — базовый класс для всех атрибутов валидатора.Validation – The base class for all validator attributes.

Note

Если ваши потребности в проверке не удовлетворяются ни одним из стандартных валидаторов, то у вас всегда есть возможность создания пользовательского атрибута валидатора, нанаследовав новый атрибут валидатора из базового атрибута валидации.If your validation needs are not satisfied by any of the standard validators then you always have the option of creating a custom validator attribute by inheriting a new validator attribute from the base Validation attribute.

Класс продукта в листинге 1 иллюстрирует, как использовать эти атрибуты валидатора.The Product class in Listing 1 illustrates how to use these validator attributes. Свойства имени, описания и UnitPrice помечены по мере необходимости.The Name, Description, and UnitPrice properties are marked as required. Свойство имени должно иметь длину строки менее 10 символов.The Name property must have a string length that is less than 10 characters. Наконец, свойство UnitPrice должно соответствовать шаблону регулярного выражения, представляющего сумму в валюте.Finally, the UnitPrice property must match a regular expression pattern that represents a currency amount.

using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

namespace MvcApplication1.Models
{
    
    public class Product
    {
        public int Id { get; set; }

        [Required]
        [StringLength(10)]
        public string Name { get; set; }

        [Required]
        public string Description { get; set; }

        [DisplayName("Price")]
        [RegularExpression(@"^\$?\d+(\.(\d{2}))?$")]
        public decimal UnitPrice { get; set; }
    }
}

Список 1: Модели»Продукт.csListing 1: Models\Product.cs

Класс продукта иллюстрирует, как использовать один дополнительный атрибут: атрибут DisplayName.The Product class illustrates how to use one additional attribute: the DisplayName attribute. Атрибут DisplayName позволяет изменять имя свойства при отображении свойства в сообщении об ошибке.The DisplayName attribute enables you to modify the name of the property when the property is displayed in an error message. Вместо отображения сообщения об ошибке "Требуется поле UnitPrice" можно отобразить сообщение об ошибке "Требуется поле цены".Instead of displaying the error message "The UnitPrice field is required" you can display the error message "The Price field is required".

Note

Если вы хотите полностью настроить сообщение об ошибке, отображаемое валидатором, то вы можете назначить пользовательское сообщение об ошибке свойству ErrorMessage валидатора следующим образом:<Required(ErrorMessage:="This field needs a value!")>If you want to completely customize the error message displayed by a validator then you can assign a custom error message to the validator's ErrorMessage property like this: <Required(ErrorMessage:="This field needs a value!")>

Вы можете использовать класс продукта в листинге 1 с действием контроллера Create() в листинге 2.You can use the Product class in Listing 1 with the Create() controller action in Listing 2. Это действие контроллера отображает представление «Создание», когда состояние модели содержит ошибки.This controller action redisplays the Create view when model state contains any errors.

using System.Web.Mvc;
using MvcApplication1.Models;

namespace MvcApplication1.Controllers
{
    public class ProductController : Controller
    {
         //
        // GET: /Product/Create

        public ActionResult Create()
        {
            return View();
        } 

        //
        // POST: /Product/Create

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Create([Bind(Exclude="Id")]Product productToCreate)
        {
            if (!ModelState.IsValid)
                return View();

            // TODO: Add insert logic here
            return RedirectToAction("Index");
        }

    }
}

Список 2: Контролеры/ProductController.vbListing 2: Controllers\ProductController.vb

Наконец, вы можете создать представление в листинге 3, нажав на действие Create() и выбрав вариант меню Добавить вид.Finally, you can create the view in Listing 3 by right-clicking the Create() action and selecting the menu option Add View. Создайте сильно типифицированный вид с классом продукта в качестве класса модели.Create a strongly-typed view with the Product class as the model class. Выберите Создать из списка выпадающих просмотров содержимого (см. рисунок 2).Select Create from the view content dropdown list (see Figure 2).

Рисунок 2: Добавление представления созданияFigure 2: Adding the Create View

<%@ Page Title="" Language="C#" MasterPageFile="Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MvcApplication1.Models.Product>" %>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

    <h2>Create</h2>

    <%= Html.ValidationSummary("Create was unsuccessful. Please correct the errors and try again.") %>

    <% using (Html.BeginForm()) {%>

        <fieldset>
            <legend>Fields</legend>
            <p>
                <label for="Name">Name:</label>
                <%= Html.TextBox("Name") %>
                <%= Html.ValidationMessage("Name", "*") %>
            </p>
            <p>
                <label for="Description">Description:</label>
                <%= Html.TextBox("Description") %>
                <%= Html.ValidationMessage("Description", "*") %>
            </p>
            <p>
                <label for="UnitPrice">Price:</label>
                <%= Html.TextBox("UnitPrice") %>
                <%= Html.ValidationMessage("UnitPrice", "*") %>
            </p>
            <p>
                <input type="submit" value="Create" />
            </p>
        </fieldset>

    <% } %>

    <div>
        <%=Html.ActionLink("Back to List", "Index") %>
    </div>

</asp:Content>

Список 3: Просмотры »Продукт»Создать.aspxListing 3: Views\Product\Create.aspx

Note

Удалите поле Id из формы «Создание», генерируемой опцией меню Add View.Remove the Id field from the Create form generated by the Add View menu option. Поскольку поле Id соответствует столбцу identity, вы не хотите, чтобы пользователи могли вводить значение для этого поля.Because the Id field corresponds to an Identity column, you don't want to allow users to enter a value for this field.

Если вы отправляете форму для создания продукта и не вводите значения для требуемых полей, отображаются сообщения об ошибке проверки на рисунке 3.If you submit the form for creating a Product and you do not enter values for the required fields, then the validation error messages in Figure 3 are displayed.

Рисунок 3: Отсутствующие необходимые поляFigure 3: Missing required fields

Если вы вводите недействительную сумму валюты, отображается сообщение об ошибке на рисунке 4.If you enter an invalid currency amount, then the error message in Figure 4 is displayed.

Рисунок 4: Недействительная сумма валютыFigure 4: Invalid currency amount

Использование валидаторов аннотации данных с рамочной системой entityUsing Data Annotation Validators with the Entity Framework

Если вы используете рамочную программу Microsoft Entity для генерации классов моделей данных, то вы не можете применять атрибуты валидатора непосредственно к классам.If you are using the Microsoft Entity Framework to generate your data model classes then you cannot apply the validator attributes directly to your classes. Поскольку проектировщик сущности создает классы моделей, любые изменения, внесенные в классы моделей, будут перезаписаны при следующем внесении изменений в проект.»Because the Entity Framework Designer generates the model classes, any changes you make to the model classes will be overwritten the next time you make any changes in the Designer.

Если вы хотите использовать валидаторы с классами, генерируемыми Рамочной системой сущности, то необходимо создать классы мета-данных.If you want to use the validators with the classes generated by the Entity Framework then you need to create meta data classes. Валидаторы применяются к классу мета данных вместо того, чтобы применять валидаторы к реальному классу.You apply the validators to the meta data class instead of applying the validators to the actual class.

Например, представьте, что вы создали класс Movie с помощью рамочной системы entity (см. рисунок 5).For example, imagine that you have created a Movie class using the Entity Framework (see Figure 5). Представьте себе, кроме того, что вы хотите сделать название фильма и директор свойства необходимых свойств.Imagine, furthermore, that you want to make the Movie Title and Director properties required properties. В этом случае можно создать частичный класс и класс мета данных в листинге 4.In that case, you can create the partial class and meta data class in Listing 4.

Рисунок 5: Класс фильма, сгенерированный Рамочной системой entityFigure 5: Movie class generated by Entity Framework

using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

namespace MvcApplication1.Models
{
    [MetadataType(typeof(MovieMetaData))]
    public partial class Movie
    {
    }

    public class MovieMetaData
    {
        [Required]
        public object Title { get; set; }

        [Required]
        [StringLength(5)]
        public object Director { get; set; }

        [DisplayName("Date Released")]
        [Required]
        public object DateReleased { get; set; }
    }

}

Список 4: Модели»Movie.csListing 4: Models\Movie.cs

Файл в листинге 4 содержит два класса под названием Movie и MovieMetaData.The file in Listing 4 contains two classes named Movie and MovieMetaData. Класс Фильма является частичным классом.The Movie class is a partial class. Он соответствует частичному классу, генерируемому Рамочной системой сущности, которая содержится в файле DataModel.Designer.vb.It corresponds to the partial class generated by the Entity Framework that is contained in the DataModel.Designer.vb file.

В настоящее время фреймворк .NET не поддерживает частичные свойства.Currently, the .NET framework does not support partial properties. Таким образом, нет возможности применить атрибуты валидатора к свойствам класса Movie, определенным в файле DataModel.Designer.vb, применяя атрибуты валидатора к свойствам класса Movie, определенным в файле в листинге 4.Therefore, there is no way to apply the validator attributes to the properties of the Movie class defined in the DataModel.Designer.vb file by applying the validator attributes to the properties of the Movie class defined in the file in Listing 4.

Обратите внимание, что частичное класс Movie украшен атрибутом MetadataType, который указывает на класс MovieMetaData.Notice that the Movie partial class is decorated with a MetadataType attribute that points at the MovieMetaData class. Класс MovieMetaData содержит прокси-свойства для свойств класса Movie.The MovieMetaData class contains proxy properties for the properties of the Movie class.

Атрибуты валидатора применяются к свойствам класса MovieMetaData.The validator attributes are applied to the properties of the MovieMetaData class. Свойства Title, Director и DateReleased помечены как требуемые свойства.The Title, Director, and DateReleased properties are all marked as required properties. Свойство Директора должно быть присвоено строке, содержащей менее 5 символов.The Director property must be assigned a string that contains less than 5 characters. Наконец, атрибут DisplayName применяется к свойству DateReleased для отображения сообщения об ошибке, например" Требуется поле Типа Наиболее выпущенного поля.Finally, the DisplayName attribute is applied to the DateReleased property to display an error message like "The Date Released field is required." вместо ошибки "Требуется поле DateReleased".instead of the error "The DateReleased field is required."

Note

Обратите внимание, что свойства прокси в классе MovieMetaData не должны представлять те же типы, что и соответствующие свойства в классе Movie.Notice that the proxy properties in the MovieMetaData class do not need to represent the same types as the corresponding properties in the Movie class. Например, свойство директора является свойством строки в классе Movie и свойством объекта в классе MovieMetaData.For example, the Director property is a string property in the Movie class and an object property in the MovieMetaData class.

Страница на рисунке 6 иллюстрирует сообщения об ошибках, возвращенные при вводе недействительных значений для свойств Movie.The page in Figure 6 illustrates the error messages returned when you enter invalid values for the Movie properties.

Рисунок 6: Использование валидаторов с рамкой entity(Нажмите, чтобы просмотреть полноразмерное изображение)Figure 6: Using validators with the Entity Framework (Click to view full-size image)

СводкаSummary

В этом уроке вы узнали, как воспользоваться моделью индикации данных Binder для выполнения проверки в ASP.NET mVC-приложении.In this tutorial, you learned how to take advantage of the Data Annotation Model Binder to perform validation within an ASP.NET MVC application. Вы узнали, как использовать различные типы атрибутов валидатора, такие как атрибуты Требуемого и Струнного Длины.You learned how to use the different types of validator attributes such as the Required and StringLength attributes. Вы также узнали, как использовать эти атрибуты при работе с рамочной системой сущности Майкрософт.You also learned how to use these attributes when working with the Microsoft Entity Framework.