Čá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 v tomto článku ve verzi .NET 9.
Upozorňující
Tato verze ASP.NET Core se už nepodporuje. Další informace najdete v zásadách podpory .NET a .NET Core. Aktuální verzi najdete v tomto článku ve verzi .NET 9.
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 v tomto článku ve verzi .NET 9.
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
, StringLength
RegularExpression
, 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
AtributyRequired
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.
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.
Následující obrázek ukazuje, jak zakázat JavaScript v prohlížeči Chrome.
Po zakázání JavaScriptu publikujte neplatná data a krokujte ladicí program.
Čá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.EmailAddress
a 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 (pokudDisplayFormat
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
DateTime
budete 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
, StringLength
RegularExpression
, 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
AtributyRequired
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.
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.
Následující obrázek ukazuje, jak zakázat JavaScript v prohlížeči Chrome.
Po zakázání JavaScriptu publikujte neplatná data a krokujte ladicí program.
Čá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.EmailAddress
a 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 (pokudDisplayFormat
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
DateTime
budete 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
, StringLength
RegularExpression
, 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
AtributyRequired
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.
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.
Následující obrázek ukazuje, jak zakázat JavaScript v prohlížeči Chrome.
Po zakázání JavaScriptu publikujte neplatná data a krokujte ladicí program.
Čá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.EmailAddress
a 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 (pokudDisplayFormat
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
DateTime
budete 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é Required
atributy , StringLength
RegularExpression
, 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
AtributyRequired
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.
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.
Následující obrázek ukazuje, jak zakázat JavaScript v prohlížeči Chrome.
Po zakázání JavaScriptu publikujte neplatná data a krokujte ladicí program.
Čá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.EmailAddress
a 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 (pokudDisplayFormat
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
DateTime
budete 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é Required
atributy , StringLength
RegularExpression
, 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
AtributyRequired
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.
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.
Následující obrázek ukazuje, jak zakázat JavaScript v prohlížeči Chrome.
Po zakázání JavaScriptu publikujte neplatná data a krokujte ladicí program.
Čá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.EmailAddress
a 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 (pokudDisplayFormat
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
DateTime
budete 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.