Dodawanie walidacji do aplikacji ASP.NET Core MVCAdd validation to an ASP.NET Core MVC app

Przez Rick AndersonBy Rick Anderson

W tej sekcji:In this section:

  • Logika sprawdzania poprawności jest dodawany do Movie modelu.Validation logic is added to the Movie model.
  • Upewnij się, że reguły sprawdzania poprawności są wymuszane ilekroć użytkownik tworzy lub edytowania filmu.You ensure that the validation rules are enforced any time a user creates or edits a movie.

Utrzymywanie rzeczy PRÓBNEGOKeeping things DRY

Jednym z założenia projektowania MVC jest susz ("nie należy powtórzyć samodzielnie").One of the design tenets of MVC is DRY ("Don't Repeat Yourself"). Platforma ASP.NET Core MVC zachęca można określić funkcji lub zachowanie tylko raz, a następnie go wszędzie, gdzie odzwierciedlone w aplikacji.ASP.NET Core MVC encourages you to specify functionality or behavior only once, and then have it be reflected everywhere in an app. Zmniejsza ilość kodu, który trzeba było pisać i sprawia, że kod, który pisanie mniej błędów, podatne, łatwiejsze testowanie i łatwiejsze w utrzymaniu.This reduces the amount of code you need to write and makes the code you do write less error prone, easier to test, and easier to maintain.

Obsługa sprawdzania poprawności, dostarczone przez MVC i Entity Framework Core Code First jest dobrym przykładem susz zasady w akcji.The validation support provided by MVC and Entity Framework Core Code First is a good example of the DRY principle in action. Można deklaratywne określenie reguł sprawdzania poprawności w jednym miejscu (w klasie modelu), a zasady są wymuszane wszędzie, gdzie w aplikacji.You can declaratively specify validation rules in one place (in the model class) and the rules are enforced everywhere in the app.

Dodawanie reguł sprawdzania poprawności do modelu movieAdd validation rules to the movie model

Otwórz Movie.cs pliku.Open the Movie.cs file. Przestrzeń nazw DataAnnotations zawiera zestaw atrybutów weryfikacji wbudowanych, które są stosowane w sposób deklaratywny do klasa lub właściwość.The DataAnnotations namespace provides a set of built-in validation attributes that are applied declaratively to a class or property. DataAnnotations zawiera też atrybuty formatowania, takich jak DataType , ułatwić formatowanie i nie udostępniamy żadnych sprawdzania poprawności.DataAnnotations also contains formatting attributes like DataType that help with formatting and don't provide any validation.

Aktualizacja Movie klasy, aby skorzystać z wbudowanych Required, StringLength, RegularExpression, i Range atrybutów sprawdzania poprawności.Update the Movie class to take advantage of the built-in Required, StringLength, RegularExpression, and Range validation attributes.

public class Movie
{
    public int Id { get; set; }

    [StringLength(60, MinimumLength = 3)]
    [Required]
    public string Title { get; set; }

    [Display(Name = "Release Date")]
    [DataType(DataType.Date)]
    public DateTime ReleaseDate { get; set; }

    [Range(1, 100)]
    [DataType(DataType.Currency)]
    [Column(TypeName = "decimal(18, 2)")]
    public decimal Price { get; set; }

    [RegularExpression(@"^[A-Z]+[a-zA-Z""'\s-]*$")]
    [Required]
    [StringLength(30)]
    public string Genre { get; set; }

    [RegularExpression(@"^[A-Z]+[a-zA-Z0-9""'\s-]*$")]
    [StringLength(5)]
    [Required]
    public string Rating { get; set; }
}

Atrybuty weryfikacji określić zachowanie, które mają zostać wymuszone we właściwościach modelu, w których są one stosowane do:The validation attributes specify behavior that you want to enforce on the model properties they're applied to:

  • Required i MinimumLength atrybuty wskazują, że właściwość musi mieć wartość, ale nic nie uniemożliwia użytkownikowi wprowadzanie odstępów do zaspokojenia tej weryfikacji.The Required and MinimumLength attributes indicate that a property must have a value; but nothing prevents a user from entering white space to satisfy this validation.

  • RegularExpression Atrybut jest używany do ograniczania znaków, które można danych wejściowych.The RegularExpression attribute is used to limit what characters can be input. W poprzednim kodzie "Gatunku":In the preceding code, "Genre":

    • Należy używać tylko liter.Must only use letters.
    • Pierwszą literą jest wymagany do być pisane dużą literą.The first letter is required to be uppercase. Biały znak, cyfry i znaki specjalne są niedozwolone.White space, numbers, and special characters are not allowed.
  • RegularExpression "Ocena":The RegularExpression "Rating":

    • Wymaga, aby pierwszy znak wielkiej litery.Requires that the first character be an uppercase letter.
    • Umożliwia znaki specjalne i liczby w kolejnych miejsca do magazynowania.Allows special characters and numbers in subsequent spaces. "PG-13" jest prawidłowy dla klasyfikacji, ale nie powiedzie się "Gatunku"."PG-13" is valid for a rating, but fails for a "Genre".
  • Range Atrybut ogranicza wartości do określonego zakresu.The Range attribute constrains a value to within a specified range.

  • StringLength Atrybut pozwala ustawić maksymalną długość właściwości ciągu i opcjonalnie długości minimalnej.The StringLength attribute lets you set the maximum length of a string property, and optionally its minimum length.

  • Typy wartości (takie jak decimal, int, float, DateTime) są założenia wymagane i nie ma potrzeby [Required] atrybutu.Value types (such as decimal, int, float, DateTime) are inherently required and don't need the [Required] attribute.

Posiadanie reguły sprawdzania poprawności, które automatycznie wymuszanych przez platformy ASP.NET Core ułatwia zapewnienie Twojej aplikacji bardziej niezawodne.Having validation rules automatically enforced by ASP.NET Core helps make your app more robust. Gwarantuje również, że nie pamiętasz do sprawdzania poprawności coś i przypadkowo umożliwiają złe dane do bazy danych.It also ensures that you can't forget to validate something and inadvertently let bad data into the database.

Błąd sprawdzania poprawności UIValidation Error UI

Uruchom aplikację i przejdź do kontrolera filmów.Run the app and navigate to the Movies controller.

Naciśnij pozycję Utwórz nowy łącze, aby dodać nowy film.Tap the Create New link to add a new movie. Wypełnij formularz z niektórych z nieprawidłowymi wartościami.Fill out the form with some invalid values. Jak najszybciej po weryfikacji po stronie klienta jQuery wykryje błąd, wyświetla komunikat o błędzie.As soon as jQuery client side validation detects the error, it displays an error message.

Film wyświetlanie formularza za pomocą wielu błędy weryfikacji po stronie klienta jQuery

Uwaga

Nie można wprowadź przecinki dziesiętne w polach dziesiętną.You may not be able to enter decimal commas in decimal fields. Aby obsługiwać dotyczącą weryfikacji jQuery dla ustawień regionalnych innych niż angielski, które należy użyć przecinka (",") dla punktu dziesiętnego i formaty daty inne niż angielski, należy wykonać kroki, aby sprzedawać aplikację.To support jQuery validation for non-English locales that use a comma (",") for a decimal point, and non US-English date formats, you must take steps to globalize your app. To problem w usłudze GitHub 4076 instrukcje dotyczące dodawania przecinek dziesiętny.This GitHub issue 4076 for instructions on adding decimal comma.

Zwróć uwagę, jak formularz automatycznie renderowany komunikat o błędzie weryfikacji odpowiednie w każdym polu zawierający nieprawidłową wartość.Notice how the form has automatically rendered an appropriate validation error message in each field containing an invalid value. Błędy są wymuszane, zarówno po stronie klienta (przy użyciu języków JavaScript i jQuery) i po stronie serwera (w przypadku, gdy użytkownik ma Obsługa skryptów JavaScript wyłączona).The errors are enforced both client-side (using JavaScript and jQuery) and server-side (in case a user has JavaScript disabled).

Znaczące korzyści jest, że nie trzeba zmieniać jednego wiersza kodu w MoviesController klasy lub Create.cshtml widoku w celu włączenia tej weryfikacji interfejsu użytkownika.A significant benefit is that you didn't need to change a single line of code in the MoviesController class or in the Create.cshtml view in order to enable this validation UI. Kontrolera i widoki utworzone wcześniej w tym samouczku automatycznie wybrany w górę sprawdzania poprawności reguły określona za pomocą atrybutów weryfikacji właściwości Movie klasa modelu.The controller and views you created earlier in this tutorial automatically picked up the validation rules that you specified by using validation attributes on the properties of the Movie model class. Walidacja testu za pomocą Edit metody akcji i tego samego sprawdzania poprawności jest stosowana.Test validation using the Edit action method, and the same validation is applied.

Dane formularza nie jest wysyłana do serwera, aż nie wystąpią żadne błędy weryfikacji po stronie klienta.The form data isn't sent to the server until there are no client side validation errors. Można to sprawdzić przez umieszczenie punkt przerwania w HTTP Post metody, używając narzędzie Fiddler , lub narzędzi deweloperskich F12.You can verify this by putting a break point in the HTTP Post method, by using the Fiddler tool , or the F12 Developer tools.

Działanie sprawdzania poprawnościHow validation works

Być może zastanawiasz się, jak sprawdzanie poprawności UI został wygenerowany bez wykonywania żadnych aktualizacji do kodu w kontrolerze lub widoków.You might wonder how the validation UI was generated without any updates to the code in the controller or views. W poniższym kodzie pokazano dwa Create metody.The following code shows the two Create methods.

// GET: Movies/Create
public IActionResult Create()
{
    return View();
}

// POST: Movies/Create
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create(
    [Bind("ID,Title,ReleaseDate,Genre,Price, Rating")] Movie movie)
{
    if (ModelState.IsValid)
    {
        _context.Add(movie);
        await _context.SaveChangesAsync();
        return RedirectToAction("Index");
    }
    return View(movie);
}

Pierwszy (HTTP GET) Create metody akcji Wyświetla początkowej formularza tworzenia.The first (HTTP GET) Create action method displays the initial Create form. Drugi ([HttpPost]) wersja obsługuje post formularza.The second ([HttpPost]) version handles the form post. Drugi Create — metoda ( [HttpPost] wersji) wywołań ModelState.IsValid do sprawdzenia, czy ten film zawiera wszystkie błędy weryfikacji.The second Create method (The [HttpPost] version) calls ModelState.IsValid to check whether the movie has any validation errors. Wywołanie tej metody ocenia wszelkie atrybuty weryfikacji, które zostały zastosowane do obiektu.Calling this method evaluates any validation attributes that have been applied to the object. Jeśli obiekt ma błędy sprawdzania poprawności Create metoda ponownie zostanie wyświetlony formularz.If the object has validation errors, the Create method re-displays the form. Jeśli nie ma żadnych błędów, metoda zapisuje ten nowy film w bazie danych.If there are no errors, the method saves the new movie in the database. W naszym przykładzie filmu formularza nie jest opublikowane w do serwera, gdy występują błędy sprawdzania poprawności wykrywane po stronie klienta; drugi Create metoda nigdy nie jest wywoływana, gdy występują błędy sprawdzania poprawności po stronie klienta.In our movie example, the form isn't posted to the server when there are validation errors detected on the client side; the second Create method is never called when there are client side validation errors. Jeśli wyłączysz JavaScript w przeglądarce, sprawdzanie poprawności klienta jest wyłączona, a można przetestować HTTP POST Create metoda ModelState.IsValid wykrywanie wszelkie błędy sprawdzania poprawności.If you disable JavaScript in your browser, client validation is disabled and you can test the HTTP POST Create method ModelState.IsValid detecting any validation errors.

Możesz ustawić punkt przerwania w [HttpPost] Create metody i sprawdź, nigdy nie jest wywoływana metoda, weryfikacji po stronie klienta nie będzie przesyłać dane formularza, gdy wykryto błędy sprawdzania poprawności.You can set a break point in the [HttpPost] Create method and verify the method is never called, client side validation won't submit the form data when validation errors are detected. Jeśli można wyłączyć języka JavaScript w przeglądarce, a następnie Prześlij formularz z błędami, punkt przerwania zostanie osiągnięty.If you disable JavaScript in your browser, then submit the form with errors, the break point will be hit. Będzie nadal się pojawiać pełna Walidacja bez kodu JavaScript.You still get full validation without JavaScript.

Na poniższej ilustracji przedstawiono sposób wyłączania JavaScript w przeglądarce FireFox.The following image shows how to disable JavaScript in the FireFox browser.

Firefox: Na karcie Zawartość opcje Usuń zaznaczenie pola wyboru Włącz język Javascript.

Na poniższej ilustracji przedstawiono sposób wyłączania JavaScript w przeglądarce Chrome.The following image shows how to disable JavaScript in the Chrome browser.

Google Chrome: W sekcji kodu Javascript w zawartości ustawień wybierz opcję nie zezwalają na dowolnej lokacji do uruchomienia kodu JavaScript.

Po wyłączeniu JavaScript Opublikuj nieprawidłowe dane i krok po kroku debugera.After you disable JavaScript, post invalid data and step through the debugger.

Podczas debugowania na wpis nieprawidłowych danych, funkcję Intellisense w ModelState.IsValid pokazuje, że wartość to false.

Część Create.cshtml Wyświetl szablon jest wyświetlany w niej następujące znaczniki:The portion of the Create.cshtml view template is shown in the following markup:


<h4>Movie</h4>
<hr />
<div class="row">
    <div class="col-md-4">
        <form asp-action="Create">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="Title" class="control-label"></label>
                <input asp-for="Title" class="form-control" />
                <span asp-validation-for="Title" class="text-danger"></span>
            </div>           
       
        @*Markup removed for brevity.*@

Poprzedni kod znaczników jest używany przez metody akcji, aby wyświetlić początkowy formularz i wyświetlić ją ponownie w przypadku wystąpienia błędu.The preceding markup is used by the action methods to display the initial form and to redisplay it in the event of an error.

Pomocnik tagu dane wejściowe używa DataAnnotations atrybutów, a następnie tworzy atrybutów HTML potrzebne dla technologii jQuery weryfikacji po stronie klienta.The Input Tag Helper uses the DataAnnotations attributes and produces HTML attributes needed for jQuery Validation on the client side. Pomocnik tagu weryfikacji wyświetla błędy sprawdzania poprawności.The Validation Tag Helper displays validation errors. Zobacz weryfikacji Aby uzyskać więcej informacji.See Validation for more information.

Co to jest bardzo NAS cieszy się o tego podejścia jest to, że żaden kontroler ani Create Wyświetl szablon wie, nic o regułach rzeczywista weryfikacja wymuszany ani o zbyt małą określone komunikaty o błędach wyświetlane.What's really nice about this approach is that neither the controller nor the Create view template knows anything about the actual validation rules being enforced or about the specific error messages displayed. Reguł sprawdzania poprawności i ciągi błędów są określane tylko w Movie klasy.The validation rules and the error strings are specified only in the Movie class. Te same zasady sprawdzania poprawności są automatycznie stosowane do Edit widoku i wszystkich innych widoków szablonów można utworzyć, które edytować modelu.These same validation rules are automatically applied to the Edit view and any other views templates you might create that edit your model.

Jeśli potrzebujesz zmienić logikę weryfikacji, możesz to zrobić w dokładnie jednego miejsca przez dodanie atrybutów sprawdzania poprawności do modelu (w tym przykładzie Movie klasy).When you need to change validation logic, you can do so in exactly one place by adding validation attributes to the model (in this example, the Movie class). Nie trzeba już martwić się o różnych części aplikacji jest niespójna z jak zasady są wymuszane — całą logikę weryfikacji będą zdefiniowane w jednym miejscu i użyć wszędzie.You won't have to worry about different parts of the application being inconsistent with how the rules are enforced — all validation logic will be defined in one place and used everywhere. Zapewnia bardzo czystym kodzie i ułatwia utrzymanie i rozwój.This keeps the code very clean, and makes it easy to maintain and evolve. I oznacza, że można będzie można w pełni zapewniane susz zasady.And it means that you'll be fully honoring the DRY principle.

Przy użyciu atrybutów typu danychUsing DataType Attributes

Otwórz Movie.cs plików i zbadaj Movie klasy.Open the Movie.cs file and examine the Movie class. System.ComponentModel.DataAnnotations Przestrzeń nazw zawiera atrybuty formatowania, oprócz wbudowanych zestaw atrybutów weryfikacji.The System.ComponentModel.DataAnnotations namespace provides formatting attributes in addition to the built-in set of validation attributes. Firma Microsoft została już zastosowana DataType wartości wyliczenia, Data wydania i pola Cena.We've already applied a DataType enumeration value to the release date and to the price fields. Poniższy kod przedstawia ReleaseDate i Price właściwości z odpowiednią DataType atrybutu.The following code shows the ReleaseDate and Price properties with the appropriate DataType attribute.

[Display(Name = "Release Date")]
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }

[Range(1, 100)]
[DataType(DataType.Currency)]
public decimal Price { get; set; }

DataType Atrybuty zawierają tylko wskazówki dotyczące aparatu widoku do formatowania danych (i dostarcza elementy i atrybuty, takie jak <a> dla adresu URL i <a href="mailto:EmailAddress.com"> do obsługi poczty e-mail.The DataType attributes only provide hints for the view engine to format the data (and supplies elements/attributes such as <a> for URL's and <a href="mailto:EmailAddress.com"> for email. Możesz użyć RegularExpression atrybutu, aby sprawdzić poprawność formatu danych.You can use the RegularExpression attribute to validate the format of the data. DataType Atrybut jest używany do określenia typu danych, który jest bardziej szczegółowe niż typ wewnętrznej bazy danych, nie ma atrybutów sprawdzania poprawności.The DataType attribute is used to specify a data type that's more specific than the database intrinsic type, they're not validation attributes. W tym przypadku ma być uruchamiany tylko do śledzenia daty, a nie godziny.In this case we only want to keep track of the date, not the time. DataType Wyliczenie udostępnia dla wielu typów danych, takie jak data, w czasie, numer telefonu, waluty, EmailAddress i wiele innych.The DataType Enumeration provides for many data types, such as Date, Time, PhoneNumber, Currency, EmailAddress and more. DataType Atrybut można również włączyć automatyczne udostępnianie funkcji specyficznych dla typu aplikacji.The DataType attribute can also enable the application to automatically provide type-specific features. Na przykład mailto: łącza mogą być tworzone dla DataType.EmailAddress, i można podać selektora daty DataType.Date w przeglądarkach obsługujących HTML5.For example, a mailto: link can be created for DataType.EmailAddress, and a date selector can be provided for DataType.Date in browsers that support HTML5. DataType Atrybuty emitować HTML 5 data- atrybutów (Wymowa: dane dash), które może zrozumieć przeglądarki HTML 5.The DataType attributes emit HTML 5 data- (pronounced data dash) attributes that HTML 5 browsers can understand. DataType Atrybuty czy nie Podaj wszelkie sprawdzania poprawności.The DataType attributes do not provide any validation.

DataType.Date nie określa format daty, która jest wyświetlana.DataType.Date doesn't specify the format of the date that's displayed. Domyślnie pole danych są wyświetlane domyślne formaty oparte na tym serwerze CultureInfo.By default, the data field is displayed according to the default formats based on the server's CultureInfo.

DisplayFormat Atrybut jest używany jawnie określić format daty:The DisplayFormat attribute is used to explicitly specify the date format:

[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime ReleaseDate { get; set; }

ApplyFormatInEditMode Ustawienie określa, że formatowanie powinien również będą stosowane, gdy wartość jest wyświetlana w polu tekstowym do edycji.The ApplyFormatInEditMode setting specifies that the formatting should also be applied when the value is displayed in a text box for editing. (Nie może być, w przypadku niektórych pól — na przykład w przypadku wartości waluty, nie będzie prawdopodobnie symbol waluty w polu tekstowym do edycji.)(You might not want that for some fields — for example, for currency values, you probably don't want the currency symbol in the text box for editing.)

Możesz użyć DisplayFormat atrybutu przez sam, ale zazwyczaj jest dobry pomysł, aby użyć DataType atrybutu.You can use the DisplayFormat attribute by itself, but it's generally a good idea to use the DataType attribute. DataType Atrybut umożliwia przekazywanie semantykę dane, a nie jak renderować ją na ekranie i zapewnia następujące korzyści, które nie można uzyskać za pomocą DisplayFormat:The DataType attribute conveys the semantics of the data as opposed to how to render it on a screen, and provides the following benefits that you don't get with DisplayFormat:

  • Przeglądarka można włączyć funkcje HTML5 (na przykład pokazać kontrolki kalendarza, symbol waluty odpowiednich ustawień regionalnych, przesyłanie pocztą e-mail łączy, itp.)The browser can enable HTML5 features (for example to show a calendar control, the locale-appropriate currency symbol, email links, etc.)

  • Domyślnie przeglądarka wyświetli dane przy użyciu poprawny format, w oparciu o ustawienia regionalne.By default, the browser will render data using the correct format based on your locale.

  • DataType Atrybutu aby umożliwić MVC wybrać szablon po prawej stronie pola w celu przedstawienia tych danych ( DisplayFormat Jeśli używany przez samego korzysta z szablonu ciągu).The DataType attribute can enable MVC to choose the right field template to render the data (the DisplayFormat if used by itself uses the string template).

Uwaga

dotyczącą weryfikacji jQuery nie działa w przypadku Range atrybutu i DateTime.jQuery validation doesn't work with the Range attribute and DateTime. Na przykład poniższy kod zawsze będzie wyświetlała błąd weryfikacji po stronie klienta, nawet wtedy, gdy jest to data mieści się w określonym zakresie:For example, the following code will always display a client side validation error, even when the date is in the specified range:

[Range(typeof(DateTime), "1/1/1966", "1/1/2020")]

Należy wyłączyć sprawdzanie poprawności Data jQuery, aby użyć Range atrybutem DateTime.You will need to disable jQuery date validation to use the Range attribute with DateTime. Ogólnie nie jest dobrą praktyką jest kompilowanie twardych dat w ramach modeli za pomocą Range atrybutu i DateTime jest niezalecane.It's generally not a good practice to compile hard dates in your models, so using the Range attribute and DateTime is discouraged.

Poniższy kod pokazuje atrybuty łączenie w jednym wierszu:The following code shows combining attributes on one line:

public class Movie
{
    public int Id { get; set; }

    [StringLength(60, MinimumLength = 3)]
    public string Title { get; set; }

    [Display(Name = "Release Date"), DataType(DataType.Date)]
    public DateTime ReleaseDate { get; set; }

    [RegularExpression(@"^[A-Z]+[a-zA-Z""'\s-]*$"), Required, StringLength(30)]
    public string Genre { get; set; }

    [Range(1, 100), DataType(DataType.Currency)]
    [Column(TypeName = "decimal(18, 2)")]
    public decimal Price { get; set; }

    [RegularExpression(@"^[A-Z]+[a-zA-Z0-9""'\s-]*$"), StringLength(5)]
    public string Rating { get; set; }
}

W następnej części serii, firma Microsoft recenzji aplikacji i wprowadzić kilka ulepszeń do automatycznie generowanego Details i Delete metody.In the next part of the series, we review the app and make some improvements to the automatically generated Details and Delete methods.

Dodatkowe zasobyAdditional resources