Walidacja przy użyciu modułów walidacji adnotacji danych (VB)

autor: Microsoft

Skorzystaj z powiązania modelu adnotacji danych, aby przeprowadzić walidację w aplikacji ASP.NET MVC. Dowiedz się, jak używać różnych typów atrybutów modułu sprawdzania poprawności i pracować z nimi w programie Microsoft Entity Framework.

Z tego samouczka dowiesz się, jak za pomocą modułów sprawdzania poprawności adnotacji danych przeprowadzić walidację w aplikacji ASP.NET MVC. Zaletą korzystania z modułów sprawdzania poprawności adnotacji danych jest to, że umożliwiają one przeprowadzenie walidacji po prostu przez dodanie jednego lub kilku atrybutów — takich jak Atrybut Required lub StringLength — do właściwości klasy.

Ważne jest, aby zrozumieć, że powiązanie modelu adnotacji danych nie jest oficjalną częścią platformy Microsoft ASP.NET MVC. Mimo że powiązanie modelu adnotacji danych zostało utworzone przez zespół microsoft ASP.NET MVC, firma Microsoft nie oferuje oficjalnej pomocy technicznej produktu dla powiązania modelu adnotacji danych opisanych i używanych w tym samouczku.

Korzystanie z powiązania modelu adnotacji danych

Aby można było użyć powiązania modelu adnotacji danych w aplikacji ASP.NET MVC, najpierw należy dodać odwołanie do zestawu Microsoft.Web.Mvc.DataAnnotations.dll i zestawu System.ComponentModel.DataAnnotations.dll. Wybierz opcję menu Projekt, Dodaj odwołanie. Następnie kliknij kartę Przeglądaj i przejdź do lokalizacji, w której pobrano (i rozpakujesz) przykładOwy binder modelu adnotacji danych (zobacz Rysunek 1).

Obraz przedstawiający okno dialogowe dodawania odwołania

Rysunek 1. Dodawanie odwołania do powiązania modelu adnotacji danych (kliknij, aby wyświetlić obraz pełnowymiarowy)

Wybierz zestaw Microsoft.Web.Mvc.DataAnnotations.dll i zestaw System.ComponentModel.DataAnnotations.dll, a następnie kliknij przycisk OK .

Nie można użyć zestawu System.ComponentModel.DataAnnotations.dll dołączonego do .NET Framework dodatku Service Pack 1 z powiązaniem modelu adnotacji danych. Musisz użyć wersji zestawu System.ComponentModel.DataAnnotations.dll dołączonego do pobierania przykładowego narzędzia Binder modelu adnotacji danych.

Na koniec należy zarejestrować powiązanie modelu DataAnnotations w pliku Global.asax. Dodaj następujący wiersz kodu do procedury obsługi zdarzeń Application_Start(), aby metoda Application_Start() wyglądała następująco:

Protected Sub Application_Start()
    RegisterRoutes(RouteTable.Routes)
    ModelBinders.Binders.DefaultBinder = New Microsoft.Web.Mvc.DataAnnotations.DataAnnotationsModelBinder()
End Sub

Ten wiersz kodu rejestruje element DataAnnotationsModelBinder jako domyślny binder modelu dla całej aplikacji ASP.NET MVC.

Używanie atrybutów sprawdzania poprawności adnotacji danych

W przypadku korzystania z narzędzia Binder modelu adnotacji danych do weryfikacji należy użyć atrybutów modułu sprawdzania poprawności. Przestrzeń nazw System.ComponentModel.DataAnnotations zawiera następujące atrybuty modułu sprawdzania poprawności:

  • Zakres — umożliwia sprawdzenie, czy wartość właściwości mieści się między określonym zakresem wartości.
  • RegularExpression — umożliwia sprawdzenie, czy wartość właściwości jest zgodna z określonym wzorcem wyrażenia regularnego.
  • Wymagane — umożliwia oznaczenie właściwości zgodnie z wymaganiami.
  • StringLength — umożliwia określenie maksymalnej długości właściwości ciągu.
  • Weryfikacja — klasa podstawowa dla wszystkich atrybutów modułu sprawdzania poprawności.

Uwaga

Jeśli wymagania dotyczące walidacji nie są spełnione przez żaden ze standardowych modułów sprawdzania poprawności, zawsze istnieje możliwość utworzenia niestandardowego atrybutu modułu sprawdzania poprawności przez dziedziczenie nowego atrybutu modułu sprawdzania poprawności z podstawowego atrybutu walidacji.

Klasa Product w liście 1 ilustruje sposób używania tych atrybutów modułu sprawdzania poprawności. Właściwości Name, Description i UnitPrice są oznaczone jako wymagane. Właściwość Name musi mieć długość ciągu, która jest mniejsza niż 10 znaków. Na koniec właściwość UnitPrice musi być zgodna ze wzorcem wyrażenia regularnego, który reprezentuje kwotę waluty.

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

Lista 1: Models\Product.vb

Klasa Product ilustruje sposób użycia jednego dodatkowego atrybutu: atrybut DisplayName. Atrybut DisplayName umożliwia modyfikowanie nazwy właściwości, gdy właściwość jest wyświetlana w komunikacie o błędzie. Zamiast wyświetlać komunikat o błędzie "Pole UnitPrice is required" (Pole UnitPrice jest wymagane) można wyświetlić komunikat o błędzie "Pole Cena jest wymagane".

Uwaga

Jeśli chcesz całkowicie dostosować komunikat o błędzie wyświetlany przez moduł sprawdzania poprawności, możesz przypisać niestandardowy komunikat o błędzie do właściwości ErrorMessage modułu sprawdzania poprawności w następujący sposób: <Required(ErrorMessage:="This field needs a value!")>

Możesz użyć klasy Product w pozycji Lista 1 z akcją kontrolera Create() w pozycji Lista 2. Ta akcja kontrolera redisplays widoku Utwórz, gdy stan modelu zawiera błędy.

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

Lista 2: Controllers\ProductController.vb

Na koniec możesz utworzyć widok w pozycji Lista 3 , klikając prawym przyciskiem myszy akcję Create() i wybierając opcję menu Dodaj widok. Utwórz silnie typizowane widok z klasą Product jako klasą modelu. Wybierz pozycję Utwórz z listy rozwijanej zawartości widoku (zobacz Rysunek 2).

Obraz przedstawiający okno dialogowe dodawania widoku

Rysunek 2. Dodawanie widoku tworzenia

<%@ 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>

Lista 3: Views\Product\Create.aspx

Uwaga

Usuń pole Identyfikator z formularza Utwórz wygenerowanego przez opcję menu Dodaj widok . Ponieważ pole Identyfikator odpowiada kolumnie Tożsamość, nie chcesz zezwalać użytkownikom na wprowadzanie wartości dla tego pola.

Jeśli prześlesz formularz do utworzenia produktu i nie wprowadzisz wartości wymaganych pól, zostaną wyświetlone komunikaty o błędach walidacji na rysunku 3 .

Obraz przedstawiający wszystkie komunikaty o błędach weryfikacji

Rysunek 3. Brak wymaganych pól

Jeśli wprowadzisz nieprawidłową kwotę waluty, zostanie wyświetlony komunikat o błędzie na rysunku 4 .

Obraz przedstawiający nieprawidłowy komunikat o błędzie waluty

Rysunek 4. Nieprawidłowa kwota waluty

Używanie modułów sprawdzania poprawności adnotacji danych z platformą Entity Framework

Jeśli używasz programu Microsoft Entity Framework do generowania klas modelu danych, nie możesz zastosować atrybutów modułu sprawdzania poprawności bezpośrednio do klas. Ponieważ program Entity Framework Projektant generuje klasy modelu, wszelkie zmiany wprowadzone w klasach modelu zostaną zastąpione przy następnym wprowadzeniu zmian w Projektant.

Jeśli chcesz używać modułów sprawdzania poprawności z klasami wygenerowanymi przez platformę Entity Framework, musisz utworzyć klasy metadanych. Moduły sprawdzania poprawności są stosowane do klasy metadanych zamiast stosować moduły sprawdzania poprawności do rzeczywistej klasy.

Załóżmy na przykład, że utworzono klasę Movie przy użyciu programu Entity Framework (zobacz Rysunek 5). Wyobraź sobie ponadto, że chcesz, aby właściwości Tytuł filmu i Reżyser wymagały właściwości. W takim przypadku można utworzyć klasę częściową i klasę metadanych w pozycji Lista 4.

Obraz klasy filmowej

Rysunek 5. Klasa filmowa wygenerowana przez program 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

Lista 4: Models\Movie.vb

Plik w liście 4 zawiera dwie klasy o nazwie Movie i MovieMetaData. Klasa Movie jest klasą częściową. Odpowiada ona klasie częściowej wygenerowanej przez platformę Entity Framework zawartą w modelu DataModel. plik Projektant.vb.

Obecnie platforma .NET Framework nie obsługuje właściwości częściowych. W związku z tym nie ma możliwości zastosowania atrybutów modułu sprawdzania poprawności do właściwości klasy Movie zdefiniowanej w modelu DataModel. Projektant.vb plik, stosując atrybuty modułu sprawdzania poprawności do właściwości klasy Movie zdefiniowanej w pliku na liście 4.

Zwróć uwagę, że klasa częściowa Movie jest ozdobiona atrybutem MetadataType wskazującym klasę MovieMetaData. Klasa MovieMetaData zawiera właściwości serwera proxy dla właściwości klasy Movie.

Atrybuty modułu sprawdzania poprawności są stosowane do właściwości klasy MovieMetaData. Właściwości Title, Director i DateReleased są oznaczone jako wymagane właściwości. Właściwość Director musi mieć przypisany ciąg zawierający mniej niż 5 znaków. Na koniec atrybut DisplayName jest stosowany do właściwości DateReleased, aby wyświetlić komunikat o błędzie, taki jak "Pole Data wydania jest wymagane". zamiast błędu "Pole DateReleased jest wymagane".

Uwaga

Zwróć uwagę, że właściwości serwera proxy w klasie MovieMetaData nie muszą reprezentować tych samych typów co odpowiednie właściwości w klasie Movie. Na przykład właściwość Director jest właściwością string w klasie Movie i właściwością obiektu w klasie MovieMetaData.

Strona na rysunku 6 ilustruje komunikaty o błędach zwracane po wprowadzeniu nieprawidłowych wartości właściwości Filmu.

Obraz przedstawiający komunikat o błędzie nieprawidłowych wartości filmu

Rysunek 6. Używanie modułów sprawdzania poprawności z programem Entity Framework (kliknij, aby wyświetlić obraz pełnowymiarowy)

Podsumowanie

W tym samouczku przedstawiono sposób korzystania z narzędzia Data Annotation Model Binder w celu przeprowadzenia walidacji w aplikacji ASP.NET MVC. Wiesz już, jak używać różnych typów atrybutów modułu sprawdzania poprawności, takich jak atrybuty Wymagane i StringLength. Wiesz również, jak używać tych atrybutów podczas pracy z programem Microsoft Entity Framework.