Поделиться через


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

от Майкрософт

Воспользуйтесь преимуществами привязки модели заметок к данным для выполнения проверки в ASP.NET приложении MVC. Узнайте, как использовать различные типы атрибутов проверяющего элемента управления и работать с ними в 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 Sub Application_Start()
    RegisterRoutes(RouteTable.Routes)
    ModelBinders.Binders.DefaultBinder = New Microsoft.Web.Mvc.DataAnnotations.DataAnnotationsModelBinder()
End Sub

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

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

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

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

Примечание

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

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

Imports System.ComponentModel
Imports System.ComponentModel.DataAnnotations

Public Class Product

    Private _id As Integer
    Private _name As String
    Private _description As String
    Private _unitPrice As Decimal

    Public Property Id() As Integer
        Get
            Return _id
        End Get
        Set(ByVal value As Integer)
            _id = value
        End Set
    End Property

     _
    Public Property Name() As String
        Get
            Return _name
        End Get
        Set(ByVal value As String)
            _name = value
        End Set
    End Property

     _
    Public Property Description() As String
        Get
            Return _description
        End Get
        Set(ByVal value As String)
            _description = value
        End Set
    End Property

     _
    Public Property UnitPrice() As Decimal
        Get
            Return _unitPrice
        End Get
        Set(ByVal value As Decimal)
            _unitPrice = value
        End Set
    End Property

End Class

Листинг 1. Models\Product.vb

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

Примечание

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

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

Public Class ProductController
    Inherits System.Web.Mvc.Controller

    '
    ' GET: /Product/Create

    Function Create() As ActionResult
        Return View()
    End Function

    '
    ' POST: /Product/Create

     _
    Function Create( ByVal productToCreate As Product) As ActionResult

        If Not ModelState.IsValid Then
            Return View()
        End If

        Return RedirectToAction("Index")

    End Function

End Class

Листинг 2. Controllers\ProductController.vb

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

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

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

<%@ Page Title="" Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage(Of MvcApplication1.Product)" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
Create
</asp:Content>

<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">UnitPrice:</label>
                <%= Html.TextBox("UnitPrice") %>
                <%= Html.ValidationMessage("UnitPrice", "*") %>
            </p>
            <p>
                <input type="submit" value="Create" />
            </p>
        </fieldset>

    <% End Using %>

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

</asp:Content>

Листинг 3: Views\Product\Create.aspx

Примечание

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

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

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

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

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

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

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

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

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

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

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

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

Рис. 5. Класс Movie, созданный Entity Framework

Imports System.ComponentModel
Imports System.ComponentModel.DataAnnotations

 _
Partial Public Class Movie
End Class

Public Class MovieMetaData

    Private _title As Object
    Private _director As Object
    Private _dateReleased As Object

     _
    Public Property Title() As Object
        Get
            Return _title
        End Get
        Set(ByVal value As Object)
            _title = value
        End Set
    End Property

     _
    Public Property Director() As Object
        Get
            Return _director
        End Get
        Set(ByVal value As Object)
            _director = value
        End Set
    End Property

     _
    Public Property DateReleased() As Object
        Get
            Return _dateReleased
        End Get
        Set(ByVal value As Object)
            _dateReleased = value
        End Set
    End Property
End Class

Листинг 4: Models\Movie.vb

Файл в листинге 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. Вы узнали, как использовать различные типы атрибутов проверяющего элемента управления, такие как обязательные атрибуты и атрибуты StringLength. Вы также узнали, как использовать эти атрибуты при работе с Microsoft Entity Framework.