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

от Корпорации Майкрософт

Воспользуйтесь преимуществами средства привязки модели заметок к данным для выполнения проверки в приложении MVC ASP.NET. Узнайте, как использовать различные типы атрибутов проверяющего элемента управления и работать с ними в Microsoft Entity Framework.

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

Важно понимать, что связыватель модели заметок к данным не является официальной частью платформы Microsoft ASP.NET MVC. Несмотря на то, что связыватель модели примечаний к данным был создан командой Microsoft ASP.NET MVC, корпорация Майкрософт не предлагает официальной поддержки для привязки модели аннотаций к данным, описанной и используемой в этом руководстве.

Использование средства привязки модели заметок к данным

Чтобы использовать связыватель модели примечаний к данным в приложении MVC ASP.NET, необходимо сначала добавить ссылку на сборку Microsoft.Web.Mvc.DataAnnotations.dll и сборку System.ComponentModel.DataAnnotations.dll. Выберите пункт меню Проект, Добавить ссылку. Затем перейдите на вкладку Обзор и перейдите к расположению, где вы скачали (и распаковали) пример привязки модели примечаний к данным (см . рис. 1).

Изображение вкладки

Рис. 1. Добавление ссылки на связыватель модели примечаний к данным (щелкните для просмотра полноразмерного изображения)

Выберите сборку Microsoft.Web.Mvc.DataAnnotations.dll и сборку System.ComponentModel.DataAnnotations.dll и нажмите кнопку ОК .

Сборку System.ComponentModel.DataAnnotations.dll, включаемую в пакет обновления 1 (SP1) платформа .NET Framework, нельзя использовать в связыватель модели примечаний к данным. Необходимо использовать версию сборки System.ComponentModel.DataAnnotations.dll, включаемой в скачивание примера привязки модели заметки к данным.

Наконец, необходимо зарегистрировать связыватель модели DataAnnotations в файле Global.asax. Добавьте следующую строку кода в обработчик событий Application_Start(), чтобы метод Application_Start() выглядел следующим образом:

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

Эта строка кода регистрирует ataAnnotationsModelBinder в качестве связывателя модели по умолчанию для всего приложения MVC ASP.NET.

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

При использовании связывателя модели заметок к данным для выполнения проверки используются атрибуты проверяющего элемента управления. Пространство имен System.ComponentModel.DataAnnotations включает следующие атрибуты проверяющего элемента управления:

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

Примечание

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

Класс Product в листинге 1 показывает, как использовать эти атрибуты проверяющего элемента управления. Свойства Name, Description и UnitPrice помечены как обязательные. Свойство Name должно иметь длину строки менее 10 символов. Наконец, свойство UnitPrice должно соответствовать шаблону регулярного выражения, представляющего сумму в валюте.

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. Models\Product.cs

Класс Product показывает, как использовать один дополнительный атрибут: Атрибут DisplayName. Атрибут DisplayName позволяет изменять имя свойства, когда свойство отображается в сообщении об ошибке. Вместо сообщения об ошибке "Поле UnitPrice является обязательным" можно отобразить сообщение об ошибке "Поле "Цена является обязательным".

Примечание

Если вы хотите полностью настроить сообщение об ошибке, отображаемое проверяемым модулем, можно назначить пользовательское сообщение об ошибке свойству ErrorMessage проверяющего элемента управления следующим образом: <Required(ErrorMessage:="This field needs a value!")>

Класс Product можно использовать в листинге 1 с действием контроллера Create() в листинге 2. Это действие контроллера перезаписывает представление "Создать", если состояние модели содержит ошибки.

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. Controllers\ProductController.vb

Наконец, вы можете создать представление в листинге 3 , щелкнув правой кнопкой мыши действие Create() и выбрав пункт меню Добавить представление. Создайте строго типизированное представление с классом Product в качестве класса модели. Выберите Создать в раскрывающемся списке просмотра содержимого (см . рис. 2).

Изображение диалогового окна добавления представления

Рис. 2. Добавление представления создания

<%@ 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. Views\Product\Create.aspx

Примечание

Удалите поле Идентификатор из параметра Создать форму, созданную в меню Добавить представление . Так как поле Id соответствует столбцу Идентификатор, вы не хотите разрешать пользователям вводить значение для этого поля.

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

Изображение всех ошибок проверки

Рис. 3. Отсутствуют обязательные поля

Если ввести недопустимую сумму в валюте, появится сообщение об ошибке на рис. 4 .

Изображение ошибки проверки недопустимой валюты

Рис. 4. Недопустимая сумма в валюте

Использование средств проверки заметок к данным с Entity Framework

Если вы используете Microsoft Entity Framework для создания классов модели данных, атрибуты проверяющего элемента управления нельзя применять непосредственно к классам. Так как Designer Entity Framework создает классы модели, все изменения, внесенные в классы моделей, будут перезаписаны при следующем внесении изменений в Designer.

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

Например, представьте, что вы создали класс Movie с помощью Entity Framework (см . рис. 5). Кроме того, представьте, что вы хотите сделать свойства "Название фильма" и "Режиссер" обязательными свойствами. В этом случае можно создать разделяемый класс и класс метаданных в листинге 4.

Изображение класса movie

Рис. 5. Класс Movie, созданный 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. Models\Movie.cs

Файл в листинге 4 содержит два класса с именами Movie и MovieMetaData. Класс Movie является разделяемым классом. Он соответствует разделяемому классу, созданному Entity Framework, который содержится в DataModel. файл Designer.vb.

В настоящее время платформа .NET framework не поддерживает частичные свойства. Поэтому невозможно применить атрибуты проверяющего элемента к свойствам класса Movie, определенным в DataModel. Designer.vb-файл, применив атрибуты проверяющего элемента к свойствам класса Movie, определенного в файле в листинге 4.

Обратите внимание, что разделяемый класс Movie дополнен атрибутом MetadataType, указывающим на класс MovieMetaData. Класс MovieMetaData содержит свойства прокси-сервера для свойств класса Movie.

Атрибуты проверяющего элемента применяются к свойствам класса MovieMetaData. Свойства Title, Director и DateReleased помечены как обязательные. Свойству Director должна быть назначена строка, содержащая менее 5 символов. Наконец, атрибут DisplayName применяется к свойству DateReleased для отображения сообщения об ошибке типа "Поле даты освобождения является обязательным". Вместо ошибки "Поле DateReleased является обязательным".

Примечание

Обратите внимание, что свойства прокси-сервера в классе MovieMetaData не должны представлять те же типы, что и соответствующие свойства в классе Movie. Например, свойство Director — это строковое свойство в классе Movie и свойство объекта в классе MovieMetaData.

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

Изображение сообщения об ошибке для недопустимых значений фильма

Рис. 6. Использование проверяющих элементов с Entity Framework (щелкните для просмотра полноразмерного изображения)

Итоги

В этом руководстве вы узнали, как воспользоваться преимуществами привязки модели заметок к данным для выполнения проверки в ASP.NET приложении MVC. Вы узнали, как использовать различные типы атрибутов проверяющего элемента управления, такие как атрибуты Required и StringLength. Вы также узнали, как использовать эти атрибуты при работе с Microsoft Entity Framework.