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

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 kartę przeglądania

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 void Application_Start()
{
    RegisterRoutes(RouteTable.Routes);
    ModelBinders.Binders.DefaultBinder = new Microsoft.Web.Mvc.DataAnnotations.DataAnnotationsModelBinder();
}

Ten wiersz kodu rejestruje ataAnnotationsModelBinder 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.

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; }
    }
}

Lista 1: Models\Product.cs

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.

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");
        }

    }
}

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="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>

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 błędy 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 błąd walidacji 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

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; }
    }

}

Lista 4: Models\Movie.cs

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 komunikatu o błędzie dla 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.