Sdílet prostřednictvím


Část 9: Přidání ověření do aplikace ASP.NET Core MVC

Poznámka:

Toto není nejnovější verze tohoto článku. Aktuální verzi najdete ve verzi .NET 8 tohoto článku.

Upozorňující

Tato verze ASP.NET Core se už nepodporuje. Další informace najdete v tématu .NET a .NET Core Zásady podpory. Aktuální verzi najdete ve verzi .NET 8 tohoto článku.

Důležité

Tyto informace se týkají předběžného vydání produktu, který může být podstatně změněn před komerčním vydáním. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.

Aktuální verzi najdete ve verzi .NET 8 tohoto článku.

Autor: Rick Anderson

V této části:

  • Do modelu se přidá Movie logika ověření.
  • Ujistěte se, že se ověřovací pravidla vynucují pokaždé, když uživatel vytvoří nebo upraví film.

Udržování věcí SUCHÝCH

Jednou z návrhových tenetů MVC je DRY ("Neopakovat sami"). ASP.NET Core MVC doporučuje zadat funkce nebo chování pouze jednou a pak se projeví všude v aplikaci. Tím se sníží množství kódu, který potřebujete napsat, a kód, který děláte, bude náchylnější k chybám, snadněji se testuje a usnadňuje údržbu.

Podpora ověřování poskytovaná MVC a Entity Framework Core je dobrým příkladem principu DRY v praxi. Ověřovací pravidla můžete deklarativním způsobem zadat na jednom místě (ve třídě modelu) a pravidla se vynucují všude v aplikaci.

Odstranění dříve upravených dat

V dalším kroku se přidají ověřovací pravidla, která neumožňují hodnoty null. Spusťte aplikaci, přejděte na /Movies/Index, odstraňte všechny uvedené filmy a zastavte aplikaci. Aplikace použije počáteční data při příštím spuštění.

Přidání ověřovacích pravidel do modelu videa

Obor názvů DataAnnotations poskytuje sadu předdefinovaných ověřovacích atributů, které se aplikují deklarativním způsobem na třídu nebo vlastnost. Obor názvů DataAnnotations obsahuje také atributy formátování, jako je DataType, které pomáhají s formátováním a neposkytují žádné ověřování.

Movie Aktualizujte třídu tak, aby využívala předdefinované ověřovací atributy Required, StringLengthRegularExpression, Range a DataType atribut formátování.

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace MvcMovie.Models;

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

Ověřovací atributy určují chování, které chcete vynutit u vlastností modelu, na které se použijí:

  • MinimumLength Atributy Required označují, že vlastnost musí mít hodnotu, ale nic nebrání uživateli v zadávání prázdných znaků, aby toto ověření splnil.

  • Atribut RegularExpression slouží k omezení množiny znaků, které je možné zadat. Pro vlastnost Genre ve výše uvedeném kódu platí následující:

    • Může obsahovat pouze písmena.
    • Počáteční písmeno musí být velké. Prázdné znaky jsou povolené, zatímco čísla a speciální znaky nejsou povolené.
  • Regulární výraz (RegularExpression) u vlastnosti Rating:

    • Vyžaduje, aby prvním znakem bylo velké písmeno.
    • Na dalších místech povoluje speciální znaky a číslice. PG-13 je platná hodnota pro vlastnost Rating, ale ne pro vlastnost Genre.
  • Atribut Range omezuje hodnotu v konkrétním rozsahu.

  • Atribut StringLength umožňuje nastavit maximální délku vlastnosti řetězce a volitelně její minimální délku.

  • Typy hodnot (například decimal, int, float, DateTime) jsou ze své podstaty povinné a nevyžadují atribut [Required].

Díky automatickému vynucování ověřovacích pravidel ASP.NET Core je vaše aplikace robustnější. Zajišťuje také, že nemůžete zapomenout něco ověřit a neúmyslně nechat do databáze chybná data.

Uživatelské rozhraní chyby ověření

Spusťte aplikaci a přejděte do kontroleru Filmy.

Vyberte odkaz Vytvořit nový a přidejte nový film. Vyplňte formulář některými neplatnými hodnotami. Jakmile ověření na straně klienta jQuery zjistí chybu, zobrazí se chybová zpráva.

Formulář pro zobrazení videa s více chybami ověření na straně klienta jQuery

Poznámka:

V desetinných polích možná nebudete moct zadávat desetinné čárky. Pokud chcete podporovat ověřování jQuery pro neanglické národní prostředí, které používají čárku (",") pro desetinnou čárku a jiné formáty kalendářních dat než v angličtině, musíte provést kroky ke globalizaci aplikace. Pokyny k přidání desetinné čárky najdete v tomto komentáři GitHubu 4076 .

Všimněte si, že formulář automaticky vykreslí odpovídající chybovou zprávu ověření v každém poli obsahujícím neplatnou hodnotu. Chyby se vynucují na straně klienta (pomocí JavaScriptu i jQuery) i na straně serveru (v případě, že má uživatel zakázaný JavaScript).

Významnou výhodou je, že abyste toto ověřovací uživatelské rozhraní povolili, nemusíte měnit jeden řádek kódu ve MoviesController třídě nebo v Create.cshtml zobrazení. Kontroler a zobrazení, které jste vytvořili dříve v tomto kurzu, automaticky získaly ověřovací pravidla, která jste určili pomocí ověřovacích atributů ve vlastnostech Movie třídy modelu. Otestujte ověření pomocí Edit metody akce a použije se stejné ověření.

Data formuláře se neodesílají na server, dokud nedojde k žádným chybám ověření na straně klienta. Můžete to ověřit tak, že do HTTP Post metody vložíte zarážku pomocí nástroje Fiddler nebo F12 Vývojářské nástroje.

Jak funguje ověřování

Možná vás zajímá, jak se vygenerovalo uživatelské rozhraní pro ověřování bez jakýchkoli aktualizací kódu v kontroleru nebo zobrazeních. Následující kód ukazuje dvě Create metody.

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

// POST: Movies/Create
// To protect from overposting attacks, enable the specific properties you want to bind to.
// For more details, see http://go.microsoft.com/fwlink/?LinkId=317598.
[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(nameof(Index));
    }
    return View(movie);
}

První metoda akce (HTTP GET) Create zobrazí počáteční formulář Pro vytvoření. Druhá ([HttpPost]) verze zpracovává příspěvek formuláře. Druhá Create metoda ( [HttpPost] verze) volá ModelState.IsValid , jestli má video nějaké chyby ověření. Volání této metody vyhodnotí všechny ověřovací atributy, které byly použity na objekt. Pokud objekt obsahuje chyby ověření, Create metoda formulář znovu zobrazí. Pokud nedojde k žádným chybám, metoda uloží nový film do databáze. V našem příkladu filmu není formulář publikován na server, pokud na straně klienta byly zjištěny chyby ověření; Druhá Create metoda se nikdy nevolá, pokud dojde k chybám ověření na straně klienta. Pokud v prohlížeči zakážete JavaScript, ověření klienta je zakázané a můžete otestovat metodu ModelState.IsValid HTTP POSTCreate, která detekuje případné chyby ověření.

V metodě můžete nastavit zarážku [HttpPost] Create a ověřit, že se metoda nikdy nevolá, ověření na straně klienta neodesílá data formuláře při zjištění chyb ověření. Pokud v prohlížeči zakážete JavaScript, odešlete formulář s chybami, zobrazí se zarážka. Stále získáte úplné ověření bez JavaScriptu.

Následující obrázek ukazuje, jak zakázat JavaScript v prohlížeči Firefox.

Firefox: Na kartě Obsah možnosti zrušte zaškrtnutí políčka Povolit JavaScript.

Následující obrázek ukazuje, jak zakázat JavaScript v prohlížeči Chrome.

Google Chrome: V části Nastavení obsahu v JavaScriptu vyberte Nepovolit spuštění JavaScriptu žádnému webu.

Po zakázání JavaScriptu publikujte neplatná data a krokujte ladicí program.

Při ladění u příspěvku o neplatných datech intellisense ve službě ModelState.IsValid zobrazuje hodnotu false.

Část Create.cshtml šablony zobrazení je zobrazena v následujícím kódu:

<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.*@

Předchozí kód se používá metodami akce k zobrazení počátečního formuláře a k jeho opětovnému zobrazení v případě chyby.

Pomocný rutina vstupní značky používá atributy DataAnnotations a vytváří atributy HTML potřebné pro ověřování jQuery na straně klienta. Pomocník ověřovací značky zobrazí chyby ověření. Další informace najdete v tématu Ověření .

To, co je v tomto přístupu opravdu hezké, je, že kontroler ani Create šablona zobrazení neví nic o skutečných ověřovacích pravidlech, která se vynucují, nebo o konkrétních zobrazených chybových zprávách. Ověřovací pravidla a chybové řetězce jsou určeny pouze ve Movie třídě. Stejná ověřovací pravidla se automaticky použijí v Edit zobrazení a všechny ostatní šablony zobrazení, které můžete vytvořit, aby model upravte.

Když potřebujete změnit logiku ověřování, můžete to udělat přesně na jednom místě přidáním ověřovacích atributů do modelu (v tomto příkladu Movie třídy). Nemusíte se starat o různé části aplikace, které jsou nekonzistentní s tím, jak se pravidla vynucují – veškerá logika ověřování se definuje na jednom místě a bude použita všude. Díky tomu je kód velmi čistý a snadno se udržuje a vyvíjí. A znamená to, že budete plně dodržovat zásadu DRY.

Použití atributů datového typu

Movie.cs Otevřete soubor a prozkoumejte Movie třídu. Obor System.ComponentModel.DataAnnotations názvů poskytuje kromě předdefinované sady ověřovacích atributů i atributy formátování. Již jsme použili DataType hodnotu výčtu na datum vydání a na pole cen. Následující kód zobrazuje ReleaseDate vlastnosti a Price vlastnosti s příslušným DataType atributem.

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

Atributy DataType poskytují pouze rady pro modul zobrazení pro formátování dat a poskytuje elementy/atributy, jako <a> jsou adresy URL a <a href="mailto:EmailAddress.com"> e-mail. Atribut můžete použít RegularExpression k ověření formátu dat. Atribut DataType se používá k určení datového typu, který je konkrétnější než vnitřní typ databáze, nejsou ověřovacími atributy. V tomto případě chceme sledovat pouze datum, nikoli čas. Výčet DataType poskytuje mnoho datových typů, například Datum, Čas, Telefonní číslo, Měna, EmailAddress a další. Atribut DataType může také aplikaci povolit, aby automaticky poskytovala funkce specifické pro typ. Například mailto: lze vytvořit odkaz pro DataType.EmailAddressa selektor data lze zadat v DataType.Date prohlížečích, které podporují HTML5. Atributy DataType generují atributy HTML 5 data- (vyslovující datové pomlčky), které můžou prohlížeče HTML 5 pochopit. Atributy DataType neposkytují žádné ověření.

DataType.Date nezadá formát zobrazeného data. Ve výchozím nastavení se datové pole zobrazí podle výchozích formátů založených na serveru CultureInfo.

Atribut DisplayFormat se používá k explicitní zadání formátu data:

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

Nastavení ApplyFormatInEditMode určuje, že formátování se má použít také při zobrazení hodnoty v textovém poli pro úpravy. (U některých polí to možná nechcete – například pro hodnoty měny, pravděpodobně nechcete, aby se symbol měny v textovém poli pro úpravy.)

Atribut můžete použít DisplayFormat samostatně, ale obecně je vhodné atribut použít DataType . Atribut DataType vyjadřuje sémantiku dat na rozdíl od toho, jak je vykreslit na obrazovce, a poskytuje následující výhody, které se s DisplayFormat nedostanou:

  • Prohlížeč může povolit funkce HTML5 (například zobrazení ovládacího prvku kalendáře, symbol měny odpovídající národnímu prostředí, e-mailové odkazy atd.)

  • Ve výchozím nastavení prohlížeč vykresluje data pomocí správného formátu na základě vašeho národního prostředí.

  • Atribut DataType může povolit MVC zvolit správnou šablonu pole pro vykreslení dat (pokud DisplayFormat se používá sama o sobě, používá šablonu řetězce).

Poznámka:

Ověřování jQuery nefunguje s atributem Range a DateTime. Následující kód například vždy zobrazí chybu ověření na straně klienta, i když je datum v zadaném rozsahu:

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

K použití atributu s atributem Range DateTimebudete muset zakázat ověření data jQuery. Obecně není vhodné zkompilovat pevná data v modelech, takže použití atributu Range a DateTime nedoporučuje se.

Následující kód ukazuje kombinování atributů na jednom řádku:

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace MvcMovie.Models;

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

V další části série si projdeme aplikaci a provedeme několik vylepšení automaticky generovaných Details a Delete metod.

Další materiály

V této části:

  • Do modelu se přidá Movie logika ověření.
  • Ujistěte se, že se ověřovací pravidla vynucují pokaždé, když uživatel vytvoří nebo upraví film.

Udržování věcí SUCHÝCH

Jednou z návrhových tenetů MVC je DRY ("Neopakovat sami"). ASP.NET Core MVC doporučuje zadat funkce nebo chování pouze jednou a pak se projeví všude v aplikaci. Tím se sníží množství kódu, který potřebujete napsat, a kód, který děláte, bude náchylnější k chybám, snadněji se testuje a usnadňuje údržbu.

Podpora ověřování poskytovaná MVC a Entity Framework Core Code First je dobrým příkladem principu DRY v akci. Ověřovací pravidla můžete deklarativním způsobem zadat na jednom místě (ve třídě modelu) a pravidla se vynucují všude v aplikaci.

Odstranění dříve upravených dat

V dalším kroku se přidají ověřovací pravidla, která neumožňují hodnoty null. Spusťte aplikaci, přejděte na /Movies/Index, odstraňte všechny uvedené filmy a zastavte aplikaci. Aplikace použije počáteční data při příštím spuštění.

Přidání ověřovacích pravidel do modelu videa

Obor názvů DataAnnotations poskytuje sadu předdefinovaných ověřovacích atributů, které se aplikují deklarativním způsobem na třídu nebo vlastnost. Obor názvů DataAnnotations obsahuje také atributy formátování, jako je DataType, které pomáhají s formátováním a neposkytují žádné ověřování.

Movie Aktualizujte třídu tak, aby využívala předdefinované ověřovací atributy Required, StringLengthRegularExpression, Range a DataType atribut formátování.

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace MvcMovie.Models;

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

Ověřovací atributy určují chování, které chcete vynutit u vlastností modelu, na které se použijí:

  • MinimumLength Atributy Required označují, že vlastnost musí mít hodnotu, ale nic nebrání uživateli v zadávání prázdných znaků, aby toto ověření splnil.

  • Atribut RegularExpression slouží k omezení množiny znaků, které je možné zadat. Pro vlastnost Genre ve výše uvedeném kódu platí následující:

    • Může obsahovat pouze písmena.
    • Počáteční písmeno musí být velké. Prázdné znaky jsou povolené, zatímco čísla a speciální znaky nejsou povolené.
  • Regulární výraz (RegularExpression) u vlastnosti Rating:

    • Vyžaduje, aby prvním znakem bylo velké písmeno.
    • Na dalších místech povoluje speciální znaky a číslice. PG-13 je platná hodnota pro vlastnost Rating, ale ne pro vlastnost Genre.
  • Atribut Range omezuje hodnotu v konkrétním rozsahu.

  • Atribut StringLength umožňuje nastavit maximální délku vlastnosti řetězce a volitelně její minimální délku.

  • Typy hodnot (například decimal, int, float, DateTime) jsou ze své podstaty povinné a nevyžadují atribut [Required].

Díky automatickému vynucování ověřovacích pravidel ASP.NET Core je vaše aplikace robustnější. Zajišťuje také, že nemůžete zapomenout něco ověřit a neúmyslně nechat do databáze chybná data.

Uživatelské rozhraní chyby ověření

Spusťte aplikaci a přejděte do kontroleru Filmy.

Vyberte odkaz Vytvořit nový a přidejte nový film. Vyplňte formulář některými neplatnými hodnotami. Jakmile ověření na straně klienta jQuery zjistí chybu, zobrazí se chybová zpráva.

Formulář pro zobrazení videa s více chybami ověření na straně klienta jQuery

Poznámka:

V desetinných polích možná nebudete moct zadávat desetinné čárky. Pokud chcete podporovat ověřování jQuery pro neanglické národní prostředí, které používají čárku (",") pro desetinnou čárku a jiné formáty kalendářních dat než v angličtině, musíte provést kroky ke globalizaci aplikace. Pokyny k přidání desetinné čárky najdete v tomto komentáři GitHubu 4076 .

Všimněte si, že formulář automaticky vykreslí odpovídající chybovou zprávu ověření v každém poli obsahujícím neplatnou hodnotu. Chyby se vynucují na straně klienta (pomocí JavaScriptu i jQuery) i na straně serveru (v případě, že má uživatel zakázaný JavaScript).

Významnou výhodou je, že abyste toto ověřovací uživatelské rozhraní povolili, nemusíte měnit jeden řádek kódu ve MoviesController třídě nebo v Create.cshtml zobrazení. Kontroler a zobrazení, které jste vytvořili dříve v tomto kurzu, automaticky získaly ověřovací pravidla, která jste určili pomocí ověřovacích atributů ve vlastnostech Movie třídy modelu. Otestujte ověření pomocí Edit metody akce a použije se stejné ověření.

Data formuláře se neodesílají na server, dokud nedojde k žádným chybám ověření na straně klienta. Můžete to ověřit tak, že do HTTP Post metody vložíte zarážku pomocí nástroje Fiddler nebo F12 Vývojářské nástroje.

Jak funguje ověřování

Možná vás zajímá, jak se vygenerovalo uživatelské rozhraní pro ověřování bez jakýchkoli aktualizací kódu v kontroleru nebo zobrazeních. Následující kód ukazuje dvě Create metody.

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

// POST: Movies/Create
// To protect from overposting attacks, enable the specific properties you want to bind to.
// For more details, see http://go.microsoft.com/fwlink/?LinkId=317598.
[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(nameof(Index));
    }
    return View(movie);
}

První metoda akce (HTTP GET) Create zobrazí počáteční formulář Pro vytvoření. Druhá ([HttpPost]) verze zpracovává příspěvek formuláře. Druhá Create metoda ( [HttpPost] verze) volá ModelState.IsValid , jestli má video nějaké chyby ověření. Volání této metody vyhodnotí všechny ověřovací atributy, které byly použity na objekt. Pokud objekt obsahuje chyby ověření, Create metoda formulář znovu zobrazí. Pokud nedojde k žádným chybám, metoda uloží nový film do databáze. V našem příkladu filmu není formulář publikován na server, pokud na straně klienta byly zjištěny chyby ověření; Druhá Create metoda se nikdy nevolá, pokud dojde k chybám ověření na straně klienta. Pokud v prohlížeči zakážete JavaScript, ověření klienta je zakázané a můžete otestovat metodu ModelState.IsValid HTTP POSTCreate, která detekuje případné chyby ověření.

V metodě můžete nastavit zarážku [HttpPost] Create a ověřit, že se metoda nikdy nevolá, ověření na straně klienta neodesílá data formuláře při zjištění chyb ověření. Pokud v prohlížeči zakážete JavaScript, odešlete formulář s chybami, zobrazí se zarážka. Stále získáte úplné ověření bez JavaScriptu.

Následující obrázek ukazuje, jak zakázat JavaScript v prohlížeči Firefox.

Firefox: Na kartě Obsah možnosti zrušte zaškrtnutí políčka Povolit JavaScript.

Následující obrázek ukazuje, jak zakázat JavaScript v prohlížeči Chrome.

Google Chrome: V části Nastavení obsahu v JavaScriptu vyberte Nepovolit spuštění JavaScriptu žádnému webu.

Po zakázání JavaScriptu publikujte neplatná data a krokujte ladicí program.

Při ladění u příspěvku o neplatných datech intellisense ve službě ModelState.IsValid zobrazuje hodnotu false.

Část Create.cshtml šablony zobrazení je zobrazena v následujícím kódu:

<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.*@

Předchozí kód se používá metodami akce k zobrazení počátečního formuláře a k jeho opětovnému zobrazení v případě chyby.

Pomocný rutina vstupní značky používá atributy DataAnnotations a vytváří atributy HTML potřebné pro ověřování jQuery na straně klienta. Pomocník ověřovací značky zobrazí chyby ověření. Další informace najdete v tématu Ověření .

To, co je v tomto přístupu opravdu hezké, je, že kontroler ani Create šablona zobrazení neví nic o skutečných ověřovacích pravidlech, která se vynucují, nebo o konkrétních zobrazených chybových zprávách. Ověřovací pravidla a chybové řetězce jsou určeny pouze ve Movie třídě. Stejná ověřovací pravidla se automaticky použijí v Edit zobrazení a všechny ostatní šablony zobrazení, které můžete vytvořit, aby model upravte.

Když potřebujete změnit logiku ověřování, můžete to udělat přesně na jednom místě přidáním ověřovacích atributů do modelu (v tomto příkladu Movie třídy). Nemusíte se starat o různé části aplikace, které jsou nekonzistentní s tím, jak se pravidla vynucují – veškerá logika ověřování se definuje na jednom místě a bude použita všude. Díky tomu je kód velmi čistý a snadno se udržuje a vyvíjí. A znamená to, že budete plně dodržovat zásadu DRY.

Použití atributů datového typu

Movie.cs Otevřete soubor a prozkoumejte Movie třídu. Obor System.ComponentModel.DataAnnotations názvů poskytuje kromě předdefinované sady ověřovacích atributů i atributy formátování. Již jsme použili DataType hodnotu výčtu na datum vydání a na pole cen. Následující kód zobrazuje ReleaseDate vlastnosti a Price vlastnosti s příslušným DataType atributem.

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

Atributy DataType poskytují pouze rady pro modul zobrazení pro formátování dat a poskytuje elementy/atributy, jako <a> jsou adresy URL a <a href="mailto:EmailAddress.com"> e-mail. Atribut můžete použít RegularExpression k ověření formátu dat. Atribut DataType se používá k určení datového typu, který je konkrétnější než vnitřní typ databáze, nejsou ověřovacími atributy. V tomto případě chceme sledovat pouze datum, nikoli čas. Výčet DataType poskytuje mnoho datových typů, například Datum, Čas, Telefonní číslo, Měna, EmailAddress a další. Atribut DataType může také aplikaci povolit, aby automaticky poskytovala funkce specifické pro typ. Například mailto: lze vytvořit odkaz pro DataType.EmailAddressa selektor data lze zadat v DataType.Date prohlížečích, které podporují HTML5. Atributy DataType generují atributy HTML 5 data- (vyslovující datové pomlčky), které můžou prohlížeče HTML 5 pochopit. Atributy DataType neposkytují žádné ověření.

DataType.Date nezadá formát zobrazeného data. Ve výchozím nastavení se datové pole zobrazí podle výchozích formátů založených na serveru CultureInfo.

Atribut DisplayFormat se používá k explicitní zadání formátu data:

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

Nastavení ApplyFormatInEditMode určuje, že formátování se má použít také při zobrazení hodnoty v textovém poli pro úpravy. (U některých polí to možná nechcete – například pro hodnoty měny, pravděpodobně nechcete, aby se symbol měny v textovém poli pro úpravy.)

Atribut můžete použít DisplayFormat samostatně, ale obecně je vhodné atribut použít DataType . Atribut DataType vyjadřuje sémantiku dat na rozdíl od toho, jak je vykreslit na obrazovce, a poskytuje následující výhody, které se s DisplayFormat nedostanou:

  • Prohlížeč může povolit funkce HTML5 (například zobrazení ovládacího prvku kalendáře, symbol měny odpovídající národnímu prostředí, e-mailové odkazy atd.)

  • Ve výchozím nastavení prohlížeč vykresluje data pomocí správného formátu na základě vašeho národního prostředí.

  • Atribut DataType může povolit MVC zvolit správnou šablonu pole pro vykreslení dat (pokud DisplayFormat se používá sama o sobě, používá šablonu řetězce).

Poznámka:

Ověřování jQuery nefunguje s atributem Range a DateTime. Následující kód například vždy zobrazí chybu ověření na straně klienta, i když je datum v zadaném rozsahu:

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

K použití atributu s atributem Range DateTimebudete muset zakázat ověření data jQuery. Obecně není vhodné zkompilovat pevná data v modelech, takže použití atributu Range a DateTime nedoporučuje se.

Následující kód ukazuje kombinování atributů na jednom řádku:

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace MvcMovie.Models;

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

V další části série si projdeme aplikaci a provedeme několik vylepšení automaticky generovaných Details a Delete metod.

Další materiály

V této části:

  • Do modelu se přidá Movie logika ověření.
  • Ujistěte se, že se ověřovací pravidla vynucují pokaždé, když uživatel vytvoří nebo upraví film.

Udržování věcí SUCHÝCH

Jednou z návrhových tenetů MVC je DRY ("Neopakovat sami"). ASP.NET Core MVC doporučuje zadat funkce nebo chování pouze jednou a pak se projeví všude v aplikaci. Tím se sníží množství kódu, který potřebujete napsat, a kód, který děláte, bude náchylnější k chybám, snadněji se testuje a usnadňuje údržbu.

Podpora ověřování poskytovaná MVC a Entity Framework Core Code First je dobrým příkladem principu DRY v akci. Ověřovací pravidla můžete deklarativním způsobem zadat na jednom místě (ve třídě modelu) a pravidla se vynucují všude v aplikaci.

Přidání ověřovacích pravidel do modelu videa

Obor názvů DataAnnotations poskytuje sadu předdefinovaných ověřovacích atributů, které se aplikují deklarativním způsobem na třídu nebo vlastnost. Obor názvů DataAnnotations obsahuje také atributy formátování, jako je DataType, které pomáhají s formátováním a neposkytují žádné ověřování.

Movie Aktualizujte třídu tak, aby využívala předdefinované ověřovací atributy Required, StringLengthRegularExpression, Range a DataType atribut formátování.

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace MvcMovie.Models;

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

Ověřovací atributy určují chování, které chcete vynutit u vlastností modelu, na které se použijí:

  • MinimumLength Atributy Required označují, že vlastnost musí mít hodnotu, ale nic nebrání uživateli v zadávání prázdných znaků, aby toto ověření splnil.

  • Atribut RegularExpression slouží k omezení množiny znaků, které je možné zadat. Pro vlastnost Genre ve výše uvedeném kódu platí následující:

    • Může obsahovat pouze písmena.
    • Počáteční písmeno musí být velké. Prázdné znaky jsou povolené, zatímco čísla a speciální znaky nejsou povolené.
  • Regulární výraz (RegularExpression) u vlastnosti Rating:

    • Vyžaduje, aby prvním znakem bylo velké písmeno.
    • Na dalších místech povoluje speciální znaky a číslice. PG-13 je platná hodnota pro vlastnost Rating, ale ne pro vlastnost Genre.
  • Atribut Range omezuje hodnotu v konkrétním rozsahu.

  • Atribut StringLength umožňuje nastavit maximální délku vlastnosti řetězce a volitelně její minimální délku.

  • Typy hodnot (například decimal, int, float, DateTime) jsou ze své podstaty povinné a nevyžadují atribut [Required].

Díky automatickému vynucování ověřovacích pravidel ASP.NET Core je vaše aplikace robustnější. Zajišťuje také, že nemůžete zapomenout něco ověřit a neúmyslně nechat do databáze chybná data.

Uživatelské rozhraní chyby ověření

Spusťte aplikaci a přejděte do kontroleru Filmy.

Vyberte odkaz Vytvořit nový a přidejte nový film. Vyplňte formulář některými neplatnými hodnotami. Jakmile ověření na straně klienta jQuery zjistí chybu, zobrazí se chybová zpráva.

Formulář pro zobrazení videa s více chybami ověření na straně klienta jQuery

Poznámka:

V desetinných polích možná nebudete moct zadávat desetinné čárky. Pokud chcete podporovat ověřování jQuery pro neanglické národní prostředí, které používají čárku (",") pro desetinnou čárku a jiné formáty kalendářních dat než v angličtině, musíte provést kroky ke globalizaci aplikace. Pokyny k přidání desetinné čárky najdete v tomto komentáři GitHubu 4076 .

Všimněte si, že formulář automaticky vykreslí odpovídající chybovou zprávu ověření v každém poli obsahujícím neplatnou hodnotu. Chyby se vynucují na straně klienta (pomocí JavaScriptu i jQuery) i na straně serveru (v případě, že má uživatel zakázaný JavaScript).

Významnou výhodou je, že abyste toto ověřovací uživatelské rozhraní povolili, nemusíte měnit jeden řádek kódu ve MoviesController třídě nebo v Create.cshtml zobrazení. Kontroler a zobrazení, které jste vytvořili dříve v tomto kurzu, automaticky získaly ověřovací pravidla, která jste určili pomocí ověřovacích atributů ve vlastnostech Movie třídy modelu. Otestujte ověření pomocí Edit metody akce a použije se stejné ověření.

Data formuláře se neodesílají na server, dokud nedojde k žádným chybám ověření na straně klienta. Můžete to ověřit tak, že do HTTP Post metody vložíte zarážku pomocí nástroje Fiddler nebo F12 Vývojářské nástroje.

Jak funguje ověřování

Možná vás zajímá, jak se vygenerovalo uživatelské rozhraní pro ověřování bez jakýchkoli aktualizací kódu v kontroleru nebo zobrazeních. Následující kód ukazuje dvě Create metody.

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

// POST: Movies/Create
// To protect from overposting attacks, enable the specific properties you want to bind to.
// For more details, see http://go.microsoft.com/fwlink/?LinkId=317598.
[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(nameof(Index));
    }
    return View(movie);
}

První metoda akce (HTTP GET) Create zobrazí počáteční formulář Pro vytvoření. Druhá ([HttpPost]) verze zpracovává příspěvek formuláře. Druhá Create metoda ( [HttpPost] verze) volá ModelState.IsValid , jestli má video nějaké chyby ověření. Volání této metody vyhodnotí všechny ověřovací atributy, které byly použity na objekt. Pokud objekt obsahuje chyby ověření, Create metoda formulář znovu zobrazí. Pokud nedojde k žádným chybám, metoda uloží nový film do databáze. V našem příkladu filmu není formulář publikován na server, pokud na straně klienta byly zjištěny chyby ověření; Druhá Create metoda se nikdy nevolá, pokud dojde k chybám ověření na straně klienta. Pokud v prohlížeči zakážete JavaScript, ověření klienta je zakázané a můžete otestovat metodu ModelState.IsValid HTTP POSTCreate, která detekuje případné chyby ověření.

V metodě můžete nastavit zarážku [HttpPost] Create a ověřit, že se metoda nikdy nevolá, ověření na straně klienta neodesílá data formuláře při zjištění chyb ověření. Pokud v prohlížeči zakážete JavaScript, odešlete formulář s chybami, zobrazí se zarážka. Stále získáte úplné ověření bez JavaScriptu.

Následující obrázek ukazuje, jak zakázat JavaScript v prohlížeči Firefox.

Firefox: Na kartě Obsah možnosti zrušte zaškrtnutí políčka Povolit JavaScript.

Následující obrázek ukazuje, jak zakázat JavaScript v prohlížeči Chrome.

Google Chrome: V části Nastavení obsahu v JavaScriptu vyberte Nepovolit spuštění JavaScriptu žádnému webu.

Po zakázání JavaScriptu publikujte neplatná data a krokujte ladicí program.

Při ladění u příspěvku o neplatných datech intellisense ve službě ModelState.IsValid zobrazuje hodnotu false.

Část Create.cshtml šablony zobrazení je zobrazena v následujícím kódu:

<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.*@

Předchozí kód se používá metodami akce k zobrazení počátečního formuláře a k jeho opětovnému zobrazení v případě chyby.

Pomocný rutina vstupní značky používá atributy DataAnnotations a vytváří atributy HTML potřebné pro ověřování jQuery na straně klienta. Pomocník ověřovací značky zobrazí chyby ověření. Další informace najdete v tématu Ověření .

To, co je v tomto přístupu opravdu hezké, je, že kontroler ani Create šablona zobrazení neví nic o skutečných ověřovacích pravidlech, která se vynucují, nebo o konkrétních zobrazených chybových zprávách. Ověřovací pravidla a chybové řetězce jsou určeny pouze ve Movie třídě. Stejná ověřovací pravidla se automaticky použijí v Edit zobrazení a všechny ostatní šablony zobrazení, které můžete vytvořit, aby model upravte.

Když potřebujete změnit logiku ověřování, můžete to udělat přesně na jednom místě přidáním ověřovacích atributů do modelu (v tomto příkladu Movie třídy). Nemusíte se starat o různé části aplikace, které jsou nekonzistentní s tím, jak se pravidla vynucují – veškerá logika ověřování se definuje na jednom místě a bude použita všude. Díky tomu je kód velmi čistý a snadno se udržuje a vyvíjí. A znamená to, že budete plně dodržovat zásadu DRY.

Použití atributů datového typu

Movie.cs Otevřete soubor a prozkoumejte Movie třídu. Obor System.ComponentModel.DataAnnotations názvů poskytuje kromě předdefinované sady ověřovacích atributů i atributy formátování. Již jsme použili DataType hodnotu výčtu na datum vydání a na pole cen. Následující kód zobrazuje ReleaseDate vlastnosti a Price vlastnosti s příslušným DataType atributem.

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

Atributy DataType poskytují pouze rady pro modul zobrazení pro formátování dat a poskytuje elementy/atributy, jako <a> jsou adresy URL a <a href="mailto:EmailAddress.com"> e-mail. Atribut můžete použít RegularExpression k ověření formátu dat. Atribut DataType se používá k určení datového typu, který je konkrétnější než vnitřní typ databáze, nejsou ověřovacími atributy. V tomto případě chceme sledovat pouze datum, nikoli čas. Výčet DataType poskytuje mnoho datových typů, například Datum, Čas, Telefonní číslo, Měna, EmailAddress a další. Atribut DataType může také aplikaci povolit, aby automaticky poskytovala funkce specifické pro typ. Například mailto: lze vytvořit odkaz pro DataType.EmailAddressa selektor data lze zadat v DataType.Date prohlížečích, které podporují HTML5. Atributy DataType generují atributy HTML 5 data- (vyslovující datové pomlčky), které můžou prohlížeče HTML 5 pochopit. Atributy DataType neposkytují žádné ověření.

DataType.Date nezadá formát zobrazeného data. Ve výchozím nastavení se datové pole zobrazí podle výchozích formátů založených na serveru CultureInfo.

Atribut DisplayFormat se používá k explicitní zadání formátu data:

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

Nastavení ApplyFormatInEditMode určuje, že formátování se má použít také při zobrazení hodnoty v textovém poli pro úpravy. (U některých polí to možná nechcete – například pro hodnoty měny, pravděpodobně nechcete, aby se symbol měny v textovém poli pro úpravy.)

Atribut můžete použít DisplayFormat samostatně, ale obecně je vhodné atribut použít DataType . Atribut DataType vyjadřuje sémantiku dat na rozdíl od toho, jak je vykreslit na obrazovce, a poskytuje následující výhody, které se s DisplayFormat nedostanou:

  • Prohlížeč může povolit funkce HTML5 (například zobrazení ovládacího prvku kalendáře, symbol měny odpovídající národnímu prostředí, e-mailové odkazy atd.)

  • Ve výchozím nastavení prohlížeč vykresluje data pomocí správného formátu na základě vašeho národního prostředí.

  • Atribut DataType může povolit MVC zvolit správnou šablonu pole pro vykreslení dat (pokud DisplayFormat se používá sama o sobě, používá šablonu řetězce).

Poznámka:

Ověřování jQuery nefunguje s atributem Range a DateTime. Následující kód například vždy zobrazí chybu ověření na straně klienta, i když je datum v zadaném rozsahu:

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

K použití atributu s atributem Range DateTimebudete muset zakázat ověření data jQuery. Obecně není vhodné zkompilovat pevná data v modelech, takže použití atributu Range a DateTime nedoporučuje se.

Následující kód ukazuje kombinování atributů na jednom řádku:

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace MvcMovie.Models;

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

V další části série si projdeme aplikaci a provedeme několik vylepšení automaticky generovaných Details a Delete metod.

Další materiály

V této části:

  • Do modelu se přidá Movie logika ověření.
  • Ujistěte se, že se ověřovací pravidla vynucují pokaždé, když uživatel vytvoří nebo upraví film.

Udržování věcí SUCHÝCH

Jednou z návrhových tenetů MVC je DRY ("Neopakovat sami"). ASP.NET Core MVC doporučuje zadat funkce nebo chování pouze jednou a pak se projeví všude v aplikaci. Tím se sníží množství kódu, který potřebujete napsat, a kód, který děláte, bude náchylnější k chybám, snadněji se testuje a usnadňuje údržbu.

Podpora ověřování poskytovaná MVC a Entity Framework Core Code First je dobrým příkladem principu DRY v akci. Ověřovací pravidla můžete deklarativním způsobem zadat na jednom místě (ve třídě modelu) a pravidla se vynucují všude v aplikaci.

Přidání ověřovacích pravidel do modelu videa

Obor názvů DataAnnotations poskytuje sadu předdefinovaných ověřovacích atributů, které se aplikují deklarativním způsobem na třídu nebo vlastnost. Obor názvů DataAnnotations obsahuje také atributy formátování, jako je DataType, které pomáhají s formátováním a neposkytují žádné ověřování.

Movie Aktualizujte třídu tak, aby využívala předdefinované Requiredatributy , StringLengthRegularExpression, a Range ověřování.

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace MvcMovie.Models
{
    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; }
    }
}

Ověřovací atributy určují chování, které chcete vynutit u vlastností modelu, na které se použijí:

  • MinimumLength Atributy Required označují, že vlastnost musí mít hodnotu, ale nic nebrání uživateli v zadávání prázdných znaků, aby toto ověření splnil.

  • Atribut RegularExpression slouží k omezení množiny znaků, které je možné zadat. Pro vlastnost Genre ve výše uvedeném kódu platí následující:

    • Může obsahovat pouze písmena.
    • Počáteční písmeno musí být velké. Prázdné znaky jsou povolené, zatímco čísla a speciální znaky nejsou povolené.
  • Regulární výraz (RegularExpression) u vlastnosti Rating:

    • Vyžaduje, aby prvním znakem bylo velké písmeno.
    • Na dalších místech povoluje speciální znaky a číslice. PG-13 je platná hodnota pro vlastnost Rating, ale ne pro vlastnost Genre.
  • Atribut Range omezuje hodnotu v konkrétním rozsahu.

  • Atribut StringLength umožňuje nastavit maximální délku vlastnosti řetězce a volitelně její minimální délku.

  • Typy hodnot (například decimal, int, float, DateTime) jsou ze své podstaty povinné a nevyžadují atribut [Required].

Díky automatickému vynucování ověřovacích pravidel ASP.NET Core je vaše aplikace robustnější. Zajišťuje také, že nemůžete zapomenout něco ověřit a neúmyslně nechat do databáze chybná data.

Uživatelské rozhraní chyby ověření

Spusťte aplikaci a přejděte do kontroleru Filmy.

Vyberte odkaz Vytvořit nový a přidejte nový film. Vyplňte formulář některými neplatnými hodnotami. Jakmile ověření na straně klienta jQuery zjistí chybu, zobrazí se chybová zpráva.

Formulář pro zobrazení videa s více chybami ověření na straně klienta jQuery

Poznámka:

V desetinných polích možná nebudete moct zadávat desetinné čárky. Pokud chcete podporovat ověřování jQuery pro neanglické národní prostředí, které používají čárku (",") pro desetinnou čárku a jiné formáty kalendářních dat než v angličtině, musíte provést kroky ke globalizaci aplikace. Pokyny k přidání desetinné čárky najdete v tomto komentáři GitHubu 4076 .

Všimněte si, že formulář automaticky vykreslí odpovídající chybovou zprávu ověření v každém poli obsahujícím neplatnou hodnotu. Chyby se vynucují na straně klienta (pomocí JavaScriptu i jQuery) i na straně serveru (v případě, že má uživatel zakázaný JavaScript).

Významnou výhodou je, že abyste toto ověřovací uživatelské rozhraní povolili, nemusíte měnit jeden řádek kódu ve MoviesController třídě nebo v Create.cshtml zobrazení. Kontroler a zobrazení, které jste vytvořili dříve v tomto kurzu, automaticky získaly ověřovací pravidla, která jste určili pomocí ověřovacích atributů ve vlastnostech Movie třídy modelu. Otestujte ověření pomocí Edit metody akce a použije se stejné ověření.

Data formuláře se neodesílají na server, dokud nedojde k žádným chybám ověření na straně klienta. Můžete to ověřit tak, že do HTTP Post metody vložíte zarážku pomocí nástroje Fiddler nebo F12 Vývojářské nástroje.

Jak funguje ověřování

Možná vás zajímá, jak se vygenerovalo uživatelské rozhraní pro ověřování bez jakýchkoli aktualizací kódu v kontroleru nebo zobrazeních. Následující kód ukazuje dvě Create metody.

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

// POST: Movies/Create
// To protect from overposting attacks, enable the specific properties you want to bind to.
// For more details, see http://go.microsoft.com/fwlink/?LinkId=317598.
[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(nameof(Index));
    }
    return View(movie);
}

První metoda akce (HTTP GET) Create zobrazí počáteční formulář Pro vytvoření. Druhá ([HttpPost]) verze zpracovává příspěvek formuláře. Druhá Create metoda ( [HttpPost] verze) volá ModelState.IsValid , jestli má video nějaké chyby ověření. Volání této metody vyhodnotí všechny ověřovací atributy, které byly použity na objekt. Pokud objekt obsahuje chyby ověření, Create metoda formulář znovu zobrazí. Pokud nedojde k žádným chybám, metoda uloží nový film do databáze. V našem příkladu filmu není formulář publikován na server, pokud na straně klienta byly zjištěny chyby ověření; Druhá Create metoda se nikdy nevolá, pokud dojde k chybám ověření na straně klienta. Pokud v prohlížeči zakážete JavaScript, ověření klienta je zakázané a můžete otestovat metodu ModelState.IsValid HTTP POSTCreate, která detekuje případné chyby ověření.

V metodě můžete nastavit zarážku [HttpPost] Create a ověřit, že se metoda nikdy nevolá, ověření na straně klienta neodesílá data formuláře při zjištění chyb ověření. Pokud v prohlížeči zakážete JavaScript, odešlete formulář s chybami, zobrazí se zarážka. Stále získáte úplné ověření bez JavaScriptu.

Následující obrázek ukazuje, jak zakázat JavaScript v prohlížeči Firefox.

Firefox: Na kartě Obsah možnosti zrušte zaškrtnutí políčka Povolit JavaScript.

Následující obrázek ukazuje, jak zakázat JavaScript v prohlížeči Chrome.

Google Chrome: V části Nastavení obsahu v JavaScriptu vyberte Nepovolit spuštění JavaScriptu žádnému webu.

Po zakázání JavaScriptu publikujte neplatná data a krokujte ladicí program.

Při ladění u příspěvku o neplatných datech intellisense ve službě ModelState.IsValid zobrazuje hodnotu false.

Část Create.cshtml šablony zobrazení je zobrazena v následujícím kódu:

<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.*@

Předchozí kód se používá metodami akce k zobrazení počátečního formuláře a k jeho opětovnému zobrazení v případě chyby.

Pomocný rutina vstupní značky používá atributy DataAnnotations a vytváří atributy HTML potřebné pro ověřování jQuery na straně klienta. Pomocník ověřovací značky zobrazí chyby ověření. Další informace najdete v tématu Ověření .

To, co je v tomto přístupu opravdu hezké, je, že kontroler ani Create šablona zobrazení neví nic o skutečných ověřovacích pravidlech, která se vynucují, nebo o konkrétních zobrazených chybových zprávách. Ověřovací pravidla a chybové řetězce jsou určeny pouze ve Movie třídě. Stejná ověřovací pravidla se automaticky použijí v Edit zobrazení a všechny ostatní šablony zobrazení, které můžete vytvořit, aby model upravte.

Když potřebujete změnit logiku ověřování, můžete to udělat přesně na jednom místě přidáním ověřovacích atributů do modelu (v tomto příkladu Movie třídy). Nemusíte se starat o různé části aplikace, které jsou nekonzistentní s tím, jak se pravidla vynucují – veškerá logika ověřování se definuje na jednom místě a bude použita všude. Díky tomu je kód velmi čistý a snadno se udržuje a vyvíjí. A znamená to, že budete plně dodržovat zásadu DRY.

Použití atributů datového typu

Movie.cs Otevřete soubor a prozkoumejte Movie třídu. Obor System.ComponentModel.DataAnnotations názvů poskytuje kromě předdefinované sady ověřovacích atributů i atributy formátování. Již jsme použili DataType hodnotu výčtu na datum vydání a na pole cen. Následující kód zobrazuje ReleaseDate vlastnosti a Price vlastnosti s příslušným DataType atributem.

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

Atributy DataType poskytují pouze rady pro modul zobrazení pro formátování dat a poskytuje elementy/atributy, jako <a> jsou adresy URL a <a href="mailto:EmailAddress.com"> e-mail. Atribut můžete použít RegularExpression k ověření formátu dat. Atribut DataType se používá k určení datového typu, který je konkrétnější než vnitřní typ databáze, nejsou ověřovacími atributy. V tomto případě chceme sledovat pouze datum, nikoli čas. Výčet DataType poskytuje mnoho datových typů, například Datum, Čas, Telefonní číslo, Měna, EmailAddress a další. Atribut DataType může také aplikaci povolit, aby automaticky poskytovala funkce specifické pro typ. Například mailto: lze vytvořit odkaz pro DataType.EmailAddressa selektor data lze zadat v DataType.Date prohlížečích, které podporují HTML5. Atributy DataType generují atributy HTML 5 data- (vyslovující datové pomlčky), které můžou prohlížeče HTML 5 pochopit. Atributy DataType neposkytují žádné ověření.

DataType.Date nezadá formát zobrazeného data. Ve výchozím nastavení se datové pole zobrazí podle výchozích formátů založených na serveru CultureInfo.

Atribut DisplayFormat se používá k explicitní zadání formátu data:

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

Nastavení ApplyFormatInEditMode určuje, že formátování se má použít také při zobrazení hodnoty v textovém poli pro úpravy. (U některých polí to možná nechcete – například pro hodnoty měny, pravděpodobně nechcete, aby se symbol měny v textovém poli pro úpravy.)

Atribut můžete použít DisplayFormat samostatně, ale obecně je vhodné atribut použít DataType . Atribut DataType vyjadřuje sémantiku dat na rozdíl od toho, jak je vykreslit na obrazovce, a poskytuje následující výhody, které se s DisplayFormat nedostanou:

  • Prohlížeč může povolit funkce HTML5 (například zobrazení ovládacího prvku kalendáře, symbol měny odpovídající národnímu prostředí, e-mailové odkazy atd.)

  • Ve výchozím nastavení prohlížeč vykresluje data pomocí správného formátu na základě vašeho národního prostředí.

  • Atribut DataType může povolit MVC zvolit správnou šablonu pole pro vykreslení dat (pokud DisplayFormat se používá sama o sobě, používá šablonu řetězce).

Poznámka:

Ověřování jQuery nefunguje s atributem Range a DateTime. Následující kód například vždy zobrazí chybu ověření na straně klienta, i když je datum v zadaném rozsahu:

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

K použití atributu s atributem Range DateTimebudete muset zakázat ověření data jQuery. Obecně není vhodné zkompilovat pevná data v modelech, takže použití atributu Range a DateTime nedoporučuje se.

Následující kód ukazuje kombinování atributů na jednom řádku:

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace MvcMovie.Models
{
    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; }
    }
}

V další části série si projdeme aplikaci a provedeme několik vylepšení automaticky generovaných Details a Delete metod.

Další materiály

V této části:

  • Do modelu se přidá Movie logika ověření.
  • Ujistěte se, že se ověřovací pravidla vynucují pokaždé, když uživatel vytvoří nebo upraví film.

Udržování věcí SUCHÝCH

Jednou z návrhových tenetů MVC je DRY ("Neopakovat sami"). ASP.NET Core MVC doporučuje zadat funkce nebo chování pouze jednou a pak se projeví všude v aplikaci. Tím se sníží množství kódu, který potřebujete napsat, a kód, který děláte, bude náchylnější k chybám, snadněji se testuje a usnadňuje údržbu.

Podpora ověřování poskytovaná MVC a Entity Framework Core Code First je dobrým příkladem principu DRY v akci. Ověřovací pravidla můžete deklarativním způsobem zadat na jednom místě (ve třídě modelu) a pravidla se vynucují všude v aplikaci.

Přidání ověřovacích pravidel do modelu videa

Obor názvů DataAnnotations poskytuje sadu předdefinovaných ověřovacích atributů, které se aplikují deklarativním způsobem na třídu nebo vlastnost. Obor názvů DataAnnotations obsahuje také atributy formátování, jako je DataType, které pomáhají s formátováním a neposkytují žádné ověřování.

Movie Aktualizujte třídu tak, aby využívala předdefinované Requiredatributy , StringLengthRegularExpression, a Range ověřování.

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

Ověřovací atributy určují chování, které chcete vynutit u vlastností modelu, na které se použijí:

  • MinimumLength Atributy Required označují, že vlastnost musí mít hodnotu, ale nic nebrání uživateli v zadávání prázdných znaků, aby toto ověření splnil.

  • Atribut RegularExpression slouží k omezení množiny znaků, které je možné zadat. Pro vlastnost Genre ve výše uvedeném kódu platí následující:

    • Může obsahovat pouze písmena.
    • První písmeno musí být velké. Prázdné znaky jsou povolené, zatímco čísla a speciální znaky nejsou povolené.
  • Regulární výraz (RegularExpression) u vlastnosti Rating:

    • Vyžaduje, aby prvním znakem bylo velké písmeno.
    • Na dalších místech povoluje speciální znaky a číslice. PG-13 je platná hodnota pro vlastnost Rating, ale ne pro vlastnost Genre.
  • Atribut Range omezuje hodnotu v konkrétním rozsahu.

  • Atribut StringLength umožňuje nastavit maximální délku vlastnosti řetězce a volitelně její minimální délku.

  • Typy hodnot (například decimal, int, float, DateTime) jsou ze své podstaty povinné a nevyžadují atribut [Required].

Díky automatickému vynucování ověřovacích pravidel ASP.NET Core je vaše aplikace robustnější. Zajišťuje také, že nemůžete zapomenout něco ověřit a neúmyslně nechat do databáze chybná data.

Uživatelské rozhraní chyby ověření

Spusťte aplikaci a přejděte do kontroleru Filmy.

Klepnutím na odkaz Vytvořit nový přidáte nový film. Vyplňte formulář některými neplatnými hodnotami. Jakmile ověření na straně klienta jQuery zjistí chybu, zobrazí se chybová zpráva.

Formulář pro zobrazení videa s více chybami ověření na straně klienta jQuery

Poznámka:

V desetinných polích možná nebudete moct zadávat desetinné čárky. Pokud chcete podporovat ověřování jQuery pro neanglické národní prostředí, které používají čárku (",") pro desetinnou čárku a jiné formáty kalendářních dat než v angličtině, musíte provést kroky ke globalizaci aplikace. Pokyny k přidání desetinné čárky najdete v tomto komentáři GitHubu 4076 .

Všimněte si, že formulář automaticky vykreslí odpovídající chybovou zprávu ověření v každém poli obsahujícím neplatnou hodnotu. Chyby se vynucují na straně klienta (pomocí JavaScriptu i jQuery) i na straně serveru (v případě, že má uživatel zakázaný JavaScript).

Významnou výhodou je, že abyste toto ověřovací uživatelské rozhraní povolili, nemusíte měnit jeden řádek kódu ve MoviesController třídě nebo v Create.cshtml zobrazení. Kontroler a zobrazení, které jste vytvořili dříve v tomto kurzu, automaticky získaly ověřovací pravidla, která jste určili pomocí ověřovacích atributů ve vlastnostech Movie třídy modelu. Otestujte ověření pomocí Edit metody akce a použije se stejné ověření.

Data formuláře se neodesílají na server, dokud nedojde k žádným chybám ověření na straně klienta. Můžete to ověřit tak, že do HTTP Post metody vložíte zarážku pomocí nástroje Fiddler nebo F12 Vývojářské nástroje.

Jak funguje ověřování

Možná vás zajímá, jak se vygenerovalo uživatelské rozhraní pro ověřování bez jakýchkoli aktualizací kódu v kontroleru nebo zobrazeních. Následující kód ukazuje dvě Create metody.

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

První metoda akce (HTTP GET) Create zobrazí počáteční formulář Pro vytvoření. Druhá ([HttpPost]) verze zpracovává příspěvek formuláře. Druhá Create metoda ( [HttpPost] verze) volá ModelState.IsValid , jestli má video nějaké chyby ověření. Volání této metody vyhodnotí všechny ověřovací atributy, které byly použity na objekt. Pokud objekt obsahuje chyby ověření, Create metoda formulář znovu zobrazí. Pokud nedojde k žádným chybám, metoda uloží nový film do databáze. V našem příkladu filmu není formulář publikován na server, pokud na straně klienta byly zjištěny chyby ověření; Druhá Create metoda se nikdy nevolá, pokud dojde k chybám ověření na straně klienta. Pokud v prohlížeči zakážete JavaScript, ověření klienta je zakázané a můžete otestovat metodu ModelState.IsValid HTTP POSTCreate, která detekuje případné chyby ověření.

V metodě můžete nastavit zarážku [HttpPost] Create a ověřit, že se metoda nikdy nevolá, ověření na straně klienta neodesílá data formuláře při zjištění chyb ověření. Pokud v prohlížeči zakážete JavaScript, odešlete formulář s chybami, zobrazí se zarážka. Stále získáte úplné ověření bez JavaScriptu.

Následující obrázek ukazuje, jak zakázat JavaScript v prohlížeči Firefox.

Firefox: Na kartě Obsah možnosti zrušte zaškrtnutí políčka Povolit JavaScript.

Následující obrázek ukazuje, jak zakázat JavaScript v prohlížeči Chrome.

Google Chrome: V části Nastavení obsahu v JavaScriptu vyberte Nepovolit spuštění JavaScriptu žádnému webu.

Po zakázání JavaScriptu publikujte neplatná data a krokujte ladicí program.

Při ladění u příspěvku o neplatných datech intellisense ve službě ModelState.IsValid zobrazuje hodnotu false.

Část Create.cshtml šablony zobrazení je zobrazená v následujícím kódu:


<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.*@

Předchozí kód se používá metodami akce k zobrazení počátečního formuláře a k jeho opětovnému zobrazení v případě chyby.

Pomocný rutina vstupní značky používá atributy DataAnnotations a vytváří atributy HTML potřebné pro ověřování jQuery na straně klienta. Pomocník ověřovací značky zobrazí chyby ověření. Další informace najdete v tématu Ověření .

To, co je v tomto přístupu opravdu hezké, je, že kontroler ani Create šablona zobrazení neví nic o skutečných ověřovacích pravidlech, která se vynucují, nebo o konkrétních zobrazených chybových zprávách. Ověřovací pravidla a chybové řetězce jsou určeny pouze ve Movie třídě. Stejná ověřovací pravidla se automaticky použijí v Edit zobrazení a všechny ostatní šablony zobrazení, které můžete vytvořit, aby model upravte.

Když potřebujete změnit logiku ověřování, můžete to udělat přesně na jednom místě přidáním ověřovacích atributů do modelu (v tomto příkladu Movie třídy). Nemusíte se starat o různé části aplikace, které jsou nekonzistentní s tím, jak se pravidla vynucují – veškerá logika ověřování se definuje na jednom místě a bude použita všude. Díky tomu je kód velmi čistý a snadno se udržuje a vyvíjí. A znamená to, že budete plně dodržovat zásadu DRY.

Použití atributů datového typu

Movie.cs Otevřete soubor a prozkoumejte Movie třídu. Obor System.ComponentModel.DataAnnotations názvů poskytuje kromě předdefinované sady ověřovacích atributů i atributy formátování. Již jsme použili DataType hodnotu výčtu na datum vydání a na pole cen. Následující kód zobrazuje ReleaseDate vlastnosti a Price vlastnosti s příslušným DataType atributem.

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

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

Atributy DataType poskytují pouze nápovědu pro modul zobrazení k formátování dat (a poskytuje elementy a atributy, jako <a> jsou adresy URL a <a href="mailto:EmailAddress.com"> e-maily). Atribut můžete použít RegularExpression k ověření formátu dat. Atribut DataType se používá k určení datového typu, který je konkrétnější než vnitřní typ databáze, nejsou ověřovacími atributy. V tomto případě chceme sledovat pouze datum, nikoli čas. Výčet DataType poskytuje mnoho datových typů, například Datum, Čas, Telefonní číslo, Měna, EmailAddress a další. Atribut DataType může také aplikaci povolit, aby automaticky poskytovala funkce specifické pro typ. Například mailto: lze vytvořit odkaz pro DataType.EmailAddressa selektor data lze zadat v DataType.Date prohlížečích, které podporují HTML5. Atributy DataType generují atributy HTML 5 data- (vyslovující datové pomlčky), které můžou prohlížeče HTML 5 pochopit. Atributy DataType neposkytují žádné ověření.

DataType.Date nezadá formát zobrazeného data. Ve výchozím nastavení se datové pole zobrazí podle výchozích formátů založených na serveru CultureInfo.

Atribut DisplayFormat se používá k explicitní zadání formátu data:

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

Nastavení ApplyFormatInEditMode určuje, že formátování se má použít také při zobrazení hodnoty v textovém poli pro úpravy. (U některých polí to možná nechcete – například pro hodnoty měny, pravděpodobně nechcete, aby se symbol měny v textovém poli pro úpravy.)

Atribut můžete použít DisplayFormat samostatně, ale obecně je vhodné atribut použít DataType . Atribut DataType vyjadřuje sémantiku dat na rozdíl od toho, jak je vykreslit na obrazovce, a poskytuje následující výhody, které se s DisplayFormat nedostanou:

  • Prohlížeč může povolit funkce HTML5 (například zobrazení ovládacího prvku kalendáře, symbol měny odpovídající národnímu prostředí, e-mailové odkazy atd.)

  • Ve výchozím nastavení prohlížeč vykresluje data pomocí správného formátu na základě vašeho národního prostředí.

  • Atribut DataType může povolit MVC zvolit správnou šablonu pole pro vykreslení dat (pokud DisplayFormat se používá sama o sobě, používá šablonu řetězce).

Poznámka:

Ověřování jQuery nefunguje s atributem Range a DateTime. Následující kód například vždy zobrazí chybu ověření na straně klienta, i když je datum v zadaném rozsahu:

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

K použití atributu s atributem Range DateTimebudete muset zakázat ověření data jQuery. Obecně není vhodné zkompilovat pevná data v modelech, takže použití atributu Range a DateTime nedoporučuje se.

Následující kód ukazuje kombinování atributů na jednom řádku:

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

V další části série si projdeme aplikaci a provedeme několik vylepšení automaticky generovaných Details a Delete metod.

Další materiály