Wykonywanie prostej walidacji (C#)

Autor: Stephen Walther

Dowiedz się, jak przeprowadzić walidację w aplikacji MVC ASP.NET. W tym samouczku Stephen Walther przedstawia stan modelu i pomocników HTML weryfikacji.

Celem tego samouczka jest wyjaśnienie, jak można przeprowadzić walidację w ASP.NET aplikacji MVC. Na przykład dowiesz się, jak uniemożliwić komuś przesłanie formularza, który nie zawiera wartości dla wymaganego pola. Dowiesz się, jak używać stanu modelu i pomocników HTML weryfikacji.

Opis stanu modelu

Do reprezentowania błędów walidacji używa się stanu modelu — lub dokładniej — słownika stanu modelu. Na przykład akcja Utwórz() na liście 1 weryfikuje właściwości klasy Product przed dodaniem klasy Product do bazy danych.

Nie zalecamy dodawania logiki weryfikacji lub bazy danych do kontrolera. Kontroler powinien zawierać tylko logikę powiązaną z kontrolą przepływu aplikacji. Robimy skrót, aby zachować prostotę.

Lista 1 — Controllers\ProductController.cs

//
// POST: /Product/Create

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create([Bind(Exclude="Id")] Product productToCreate)
{
    // Validation logic
    if (productToCreate.Name.Trim().Length == 0)
        ModelState.AddModelError("Name", "Name is required.");
    if (productToCreate.Description.Trim().Length == 0)
        ModelState.AddModelError("Description", "Description is required.");
    if (productToCreate.UnitsInStock

Na liście 1 zweryfikowane są właściwości Name, Description i UnitsInStock klasy Product. Jeśli którakolwiek z tych właściwości nie powiedzie się testowi poprawności, do słownika stanu modelu zostanie dodany błąd (reprezentowany przez właściwość ModelState klasy Controller).

Jeśli występują błędy w stanie modelu, właściwość ModelState.IsValid zwraca wartość false. W takim przypadku formularz HTML do tworzenia nowego produktu jest odtwarzany ponownie. W przeciwnym razie, jeśli nie ma błędów walidacji, nowy produkt zostanie dodany do bazy danych.

Korzystanie z pomocników weryfikacji

Struktura ASP.NET MVC zawiera dwóch pomocników weryfikacji: pomocnika Html.ValidationMessage() i pomocnika Html.ValidationSummary(). Te dwie pomocniki są używane w widoku do wyświetlania komunikatów o błędach walidacji.

Pomocnicy Html.ValidationMessage() i Html.ValidationSummary() są używane w widokach Tworzenie i edytowanie, które są generowane automatycznie przez szkielet MVC ASP.NET. Wykonaj następujące kroki, aby wygenerować widok Tworzenie:

  1. Kliknij prawym przyciskiem myszy akcję Utwórz() w kontrolerze produktu i wybierz opcję menu Dodaj widok (zobacz Rysunek 1).
  2. W oknie dialogowym Dodawanie widoku zaznacz pole wyboru z etykietą Tworzenie silnie typizowanego widoku (zobacz Rysunek 2).
  3. Z listy rozwijanej Wyświetl klasę danych wybierz klasę Product.
  4. Z listy rozwijanej Wyświetl zawartość wybierz pozycję Utwórz.
  5. Kliknij przycisk Dodaj .

Przed dodaniem widoku upewnij się, że tworzysz aplikację. W przeciwnym razie lista klas nie będzie wyświetlana na liście rozwijanej Wyświetl klasę danych .

Zrzut ekranu przedstawiający plik dot c s kontrolera produktu w edytorze kodu, który pokazuje menu po kliknięciu prawym przyciskiem myszy z wyróżnionym elementem menu Dodaj widok.

Rysunek 01. Dodawanie widoku (kliknij, aby wyświetlić obraz pełnowymiarowy)

Zrzut ekranu przedstawiający okno dialogowe Dodawanie widoku, które pokazuje, że pole wyboru Utwórz silnie wpisany widok jest wypełnione.

Rysunek 02. Tworzenie silnie typizowanego widoku (kliknij, aby wyświetlić obraz pełnowymiarowy)

Po wykonaniu tych kroków zostanie wyświetlony widok Tworzenie na liście 2.

Lista 2 — Views\Product\Create.aspx

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

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

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

    <h2>Create</h2>

    <%= Html.ValidationSummary() %>

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

    <% } %>

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

</asp:Content>

Na liście 2 pomocnik Html.ValidationSummary() jest wywoływany bezpośrednio nad formularzem HTML. Ten pomocnik służy do wyświetlania listy komunikatów o błędach walidacji. Pomocnik Html.ValidationSummary() renderuje błędy na liście punktowanej.

Pomocnik Html.ValidationMessage() jest wywoływany obok każdego pola formularza HTML. Ten pomocnik służy do wyświetlania komunikatu o błędzie bezpośrednio obok pola formularza. W przypadku listy 2 pomocnik Html.ValidationMessage() wyświetla gwiazdkę, gdy wystąpi błąd.

Strona na rysunku 3 ilustruje komunikaty o błędach renderowane przez pomocników weryfikacji, gdy formularz jest przesyłany z brakującymi polami i nieprawidłowymi wartościami.

Zrzut ekranu przedstawiający okno programu Internet Explorer, w którym jest wyświetlany widok Tworzenie z komunikatami o błędach wynikającym z pól wypełnionych nieprawidłowymi wartościami.

Rysunek 03. Widok tworzenia przesłany z problemami (kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Zwróć uwagę, że wygląd pól wejściowych HTML jest również modyfikowany w przypadku wystąpienia błędu sprawdzania poprawności. Pomocnik Html.TextBox() renderuje atrybut class="input-validation-error" , gdy występuje błąd weryfikacji skojarzony z właściwością renderowaną przez pomocnika Html.TextBox().

Istnieją trzy kaskadowe klasy arkuszy stylów służące do kontrolowania wyglądu błędów walidacji:

  • input-validation-error — zastosowano do tagu wejściowego <> renderowanego przez pomocnika Html.TextBox().
  • field-validation-error — zastosowano do tagu <span> renderowanego przez pomocnika Html.ValidationMessage().
  • validation-summary-errors — zastosowano do tagu <ul> renderowanego przez pomocnik Html.ValidationSummary().

Można zmodyfikować te kaskadowe klasy arkuszy stylów, a tym samym zmodyfikować wygląd błędów walidacji, modyfikując plik Site.css znajdujący się w folderze Content.

Uwaga

Klasa HtmlHelper zawiera właściwości statyczne tylko do odczytu na potrzeby pobierania nazw powiązanych z walidacją klas CSS. Te właściwości statyczne mają nazwy ValidationInputCssClassName, ValidationFieldCssClassName i ValidationSummaryCssClassName.

Wstępne powiązanie walidacji i walidacji powiązania

Jeśli prześlesz formularz HTML do utworzenia produktu i wprowadzisz nieprawidłową wartość pola ceny i nie określisz wartości pola UnitsInStock, otrzymasz komunikaty sprawdzania poprawności wyświetlane na rysunku 4. Skąd pochodzą te komunikaty o błędach weryfikacji?

Zrzut ekranu przedstawiający okno programu Internet Explorer, w którym wyświetlane są pola Price (Cena) i Units (Jednostki) w polach Stock (Jednostki) flagują błędy sprawdzania poprawności.

Rysunek 04. Wstępne powiązanie błędów walidacji (kliknij, aby wyświetlić obraz w pełnym rozmiarze)

Istnieją dwa typy komunikatów o błędach weryfikacji — te generowane przed powiązaniem pól formularza HTML z klasą, a te wygenerowane po polach formularza są powiązane z klasą. Innymi słowy, istnieją błędy weryfikacji wstępnego powiązania i błędy weryfikacji po powiązaniu.

Akcja Create() uwidoczniona przez kontroler produktu na liście 1 akceptuje wystąpienie klasy Product. Podpis metody Create wygląda następująco:

public ActionResult Create([Bind(Exclude="Id")] Product productToCreate)

Wartości pól formularza HTML z formularza Utwórz są powiązane z klasą productToCreate przez element nazywany binderem modelu. Domyślny binder modelu automatycznie dodaje komunikat o błędzie do stanu modelu, gdy nie może powiązać pola formularza z właściwością formularza.

Domyślny binder modelu nie może powiązać ciągu "apple" z właściwością Price klasy Product. Nie można przypisać ciągu do właściwości dziesiętnej. W związku z tym binder modelu dodaje błąd do stanu modelu.

Domyślny binder modelu nie może również przypisać wartości null do właściwości, która nie akceptuje wartości null. W szczególności powiązanie modelu nie może przypisać wartości null do właściwości UnitsInStock. Po raz kolejny binder modelu zrezygnował z komunikatu o błędzie i dodał komunikat o błędzie do stanu modelu.

Jeśli chcesz dostosować wygląd tych komunikatów o błędach, musisz utworzyć ciągi zasobów dla tych komunikatów.

Podsumowanie

Celem tego samouczka było opisanie podstawowej mechaniki weryfikacji w strukturze ASP.NET MVC. Wiesz już, jak używać stanu modelu i pomocników HTML weryfikacji. Omówiliśmy również rozróżnienie między walidacją powiązania wstępnego i pobindingu. W innych samouczkach omówimy różne strategie przenoszenia kodu weryfikacji z kontrolerów i do klas modelu.