Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Megjegyzés:
Ez nem a cikk legújabb verziója. Az aktuális kiadásról a cikk .NET 10-es verziójában olvashat.
Figyelmeztetés
A ASP.NET Core ezen verziója már nem támogatott. További információt a .NET és a .NET Core támogatási szabályzatában talál. A jelen cikk .NET 9-es verzióját lásd az aktuális kiadásért .
Készítette: Rick Anderson
Ebben a szakaszban:
- A rendszer érvényesítési logikát ad hozzá a
Moviemodellhez. - Győződjön meg arról, hogy az érvényesítési szabályok érvénybe lépnek, amikor egy felhasználó létrehoz vagy szerkeszt egy filmet.
A dolgok szárazon tartása
Az MVC egyik tervezési terve a DRY ("Ne ismételje meg magad"). ASP.NET Core MVC arra ösztönzi, hogy csak egyszer adjon meg funkciókat vagy viselkedést, majd mindenhol megjelenjen az alkalmazásban. Ez csökkenti az írandó kód mennyiségét, kevésbé hajlamossá teszi az írott kódot a hibázásra, és könnyebben tesztelhetővé és karbantarthatóvá teszi.
Az MVC és az Entity Framework Core által biztosított érvényesítési támogatás jó példa a DRY elvre működés közben. Az érvényesítési szabályokat deklaratív módon megadhatja egy helyen (a modellosztályban), és a szabályok az alkalmazásban mindenhol érvénybe lépnek.
Ellenőrzés a .NET 10-ben
A .NET 10-ben az egyesített érvényesítési API-k át lettek helyezve a Microsoft.Extensions.Validation NuGet-csomagba. Ez a módosítás az érvényesítési API-kat ASP.NET Core HTTP-forgatókönyveken kívül is elérhetővé teszi.
Az Microsoft.Extensions.Validation API-k használata:
Adja hozzá a következő csomaghivatkozást:
<PackageReference Include="Microsoft.Extensions.Validation" Version="10.0.0" />A funkció változatlan marad, de most explicit csomaghivatkozásra van szükség.
Érvényesítési szolgáltatások regisztrálása függőséginjektálással:
builder.Services.AddValidation();
A korábban szerkesztett adatok törlése
A következő lépésben olyan érvényesítési szabályok lesznek hozzáadva, amelyek nem teszik lehetővé a null értékeket.
Futtassa az alkalmazást, keresse meg /Movies/Index, törölje az összes felsorolt filmet, és állítsa le az alkalmazást. Az alkalmazás a következő futtatáskor fogja használni a magadatokat.
Érvényesítési szabályok hozzáadása a filmmodellhez
A DataAnnotations névtér olyan beépített érvényesítési attribútumokat biztosít, amelyeket deklaratív módon alkalmazunk egy osztályra vagy tulajdonságra. A DataAnnotations olyan formázási attribútumokat is tartalmaz, mint a DataType, amelyek segítenek a formázásban, és nem biztosítanak semmilyen ellenőrzést.
Frissítse a Movie osztályt, hogy kihasználja a beépített érvényesítési attribútumok Required, StringLength, RegularExpression, Range és a DataType formázási attribútum előnyeit.
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; }
}
Az érvényesítési attribútumok megadják a modelltulajdonságokon érvényesítendő viselkedést:
Az
RequiredésMinimumLengthaz attribútumok azt jelzik, hogy egy tulajdonságnak értékkel kell rendelkeznie, de semmi sem akadályozza meg, hogy a felhasználó üres területre lépjen az ellenőrzés teljesítéséhez.A
RegularExpressionattribútummal korlátozható, hogy mely karakterek adhatóak meg. Az előző kódban a "Műfaj":- Csak betűket szabad használni.
- Az első betűnek nagybetűsnek kell lennie. A számok mellett fehér szóközök is megengedettek, a speciális karakterek pedig nem.
A
RegularExpression"Értékelés":- Az első karakternek nagybetűsnek kell lennie.
- Lehetővé teszi a speciális karaktereket és számokat a következő szóközökben. A "PG-13" érvényes egy minősítésre, de nem felel meg a "Műfaj" kifejezésnek.
A
Rangeattribútum egy adott tartományon belülre korlátozza az értéket.Az
StringLengthattribútum lehetővé teszi egy sztringtulajdonság maximális hosszának és opcionális minimális hosszának beállítását.Az értéktípusokra (például
decimal,int,float,DateTime) alapvetően szükség van, és nincs szükség a[Required]attribútumra.
A ASP.NET Core által automatikusan kikényszerített érvényesítési szabályok segítenek az alkalmazás robusztusabbá tétele. Emellett gondoskodik arról, hogy ne felejtsen el ellenőrizni valamit, és véletlenül rossz adatokat engedjen be az adatbázisba.
Érvényesítési hiba felhasználói felülete
Nyissa meg az alkalmazást, és lépjen a Filmek kontrollerhez.
Új film hozzáadásához válassza az Új létrehozása hivatkozást. Töltse ki az űrlapot érvénytelen értékekkel. Amint a jQuery ügyféloldali ellenőrzése észleli a hibát, hibaüzenet jelenik meg.
Megjegyzés:
Elképzelhető, hogy nem tud tizedesvesszőt beírni a tizedestizedes mezőkbe. Ha támogatni szeretné jQuery-érvényesítési olyan nem angol nyelvű területi beállításokhoz, amelyek vesszőt (",") használnak tizedesvesszőhöz, és nem US-English dátumformátumokat, lépéseket kell tennie az alkalmazás globalizálásához. A decimális vessző hozzáadására vonatkozó utasításokért tekintse meg a GitHub 4076-os megjegyzését.
Figyelje meg, hogy az űrlap automatikusan megjelenít egy megfelelő érvényesítési hibaüzenetet minden olyan mezőben, amely érvénytelen értéket tartalmaz. A hibákat mind ügyféloldalon (JavaScript és jQuery használatával), mind kiszolgálóoldalon kényszerítik, arra az esetre, ha a felhasználó letiltotta a JavaScriptet.
Jelentős előnye, hogy az érvényesítési felhasználói felület engedélyezéséhez nem kellett egyetlen kódsort módosítania az MoviesController osztályban vagy a Create.cshtml nézetben. Az oktatóanyag korábbi részében létrehozott vezérlő és nézetek automatikusan átvették a modellosztály tulajdonságainak Movie érvényesítési attribútumaival megadott érvényesítési szabályokat. Tesztelje az érvényesítést a Edit műveleti metódus használatával, és alkalmazza ugyanazt az érvényesítést.
Az űrlapadatok csak akkor lesznek elküldve a kiszolgálónak, ha nincsenek ügyféloldali érvényesítési hibák. Ezt úgy ellenőrizheti, ha töréspontot helyez a HTTP Post metódusba a Fiddler eszközzel vagy az F12 Fejlesztői eszközökkel.
Az ellenőrzés működése
Felmerülhet a kérdés, hogyan lett létrehozva az érvényesítési felhasználói felület a vezérlőben vagy nézetekben lévő kód frissítése nélkül. Az alábbi kód a két Create metódust mutatja be.
// 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);
}
Az első (HTTP GET) Create műveletmetódus megjeleníti a kezdeti Létrehozás űrlapot. A második ([HttpPost]) verzió kezeli az űrlap-bejegyzést. A második Create metódus (a [HttpPost] verzió) kéri ModelState.IsValid annak ellenőrzésére, hogy a film rendelkezik-e érvényesítési hibával. A metódus meghívása kiértékeli az objektumra alkalmazott érvényesítési attribútumokat. Ha az objektum érvényesítési hibákba ütközik, a Create metódus újra megjeleníti az űrlapot. Ha nincsenek hibák, a metódus menti az új filmet az adatbázisban. A filmes példánkban az űrlap nem lesz közzétéve a kiszolgálónak, ha ellenőrzési hibák észlelhetők az ügyféloldalon; a második Create metódus soha nem lesz meghívva ügyféloldali érvényesítési hibák esetén. Ha letiltja a JavaScriptet a böngészőben, az ügyfélérvényesítés le van tiltva, és tesztelheti a HTTP POST Create metódust ModelState.IsValid , amely észleli az ellenőrzési hibákat.
Beállíthat egy töréspontot a [HttpPost] Create metódusban, és ellenőrizheti, hogy a metódus soha nem lett meghívva, az ügyféloldali ellenőrzés nem küldi el az űrlapadatokat érvényesítési hibák észlelésekor. Ha letiltja a JavaScriptet a böngészőben, majd hibaüzenetekkel küldi el az űrlapot, a töréspont el lesz érve. JavaScript nélkül továbbra is teljes körű ellenőrzést kap.
Az alábbi kép bemutatja, hogyan tilthatja le a JavaScriptet a Firefox böngészőben.
Az alábbi kép bemutatja, hogyan tilthatja le a JavaScriptet a Chrome böngészőben.
A JavaScript letiltása után tegye közzé az érvénytelen adatokat, és lépjen végig a hibakeresőn.
A nézetsablon egy része Create.cshtml az alábbi korrektúra szerint jelenik meg:
<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.*@
A műveleti metódusok az előző korrektúrát használják a kezdeti űrlap megjelenítéséhez és hiba esetén való újbóli megjelenítéséhez.
A beviteli címke segédje a DataAnnotations attribútumokat használja, és az ügyféloldali jQuery-ellenőrzéshez szükséges HTML-attribútumokat hoz létre. Az Érvényesítési címke súgója érvényesítési hibákat jelenít meg. További információt az Ellenőrzés című témakörben talál.
Ami igazán jó ebben a megközelítésben, hogy sem a vezérlő, sem a Create nézetsablon nem tud semmit a tényleges érvényesítési szabályokról vagy a megjelenő konkrét hibaüzenetekről. Az érvényesítési szabályok és a hibasztringek csak az Movie osztályban vannak megadva. Ugyanezeket az érvényesítési szabályokat a rendszer automatikusan alkalmazza a Edit nézetre, és minden más olyan nézetsablonra, amelyet létrehozhat, amely szerkessze a modellt.
Ha módosítania kell az érvényesítési logikát, ezt pontosan egy helyen teheti meg úgy, hogy érvényesítési attribútumokat ad hozzá a modellhez (ebben a példában az Movie osztályhoz). Nem kell aggódnia amiatt, hogy az alkalmazás különböző részei nem összhangban vannak a szabályok kikényszerítésével – az összes érvényesítési logika egy helyen lesz definiálva, és mindenhol használható lesz. Így a kód nagyon tiszta marad, és megkönnyíti a karbantartást és a fejlődést. És ez azt jelenti, hogy teljes mértékben tiszteletben fogja tartani a DRY alapelvet.
DataType-attribútumok használata
Nyissa meg a Movie.cs fájlt, és vizsgálja meg az osztályt Movie . A System.ComponentModel.DataAnnotations névtér az érvényesítési attribútumok beépített készletén kívül formázási attribútumokat is tartalmaz. Már alkalmaztunk egy DataType enumerálási értéket a kiadási dátumra és az ármezőkre. Az alábbi kód megmutatja a ReleaseDate tulajdonságokat, a megfelelő Price attribútummal.
[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; }
Az DataType attribútumok csak tippeket nyújtanak a nézetmotor számára az adatok formázásához, és olyan elemeket/attribútumokat szolgáltatnak, mint az <a> URL-címek és <a href="mailto:EmailAddress.com"> az e-mailek. Az RegularExpression attribútummal ellenőrizheti az adatok formátumát. Az DataType attribútum egy olyan adattípus megadására szolgál, amely pontosabb az adatbázis belső típusánál, és nem érvényesítési attribútumok. Ebben az esetben csak a dátumot szeretnénk nyomon követni, nem az időpontot. Az DataType Enumerálás számos adattípust biztosít, például dátumot, időt, telefonszámot, pénznemet, e-mailcímet stb. Az DataType attribútum azt is lehetővé teszi, hogy az alkalmazás automatikusan típusspecifikus szolgáltatásokat biztosítson. Például létrehozhat egy mailto: hivatkozást a DataType.EmailAddress számára, és HTML5-öt támogató böngészőkben egy dátumválasztót is biztosíthat DataType.Date számára. Az DataType attribútumok HTML 5 data- (kifejezett adatkötőjel) attribútumokat bocsátanak ki, amelyeket a HTML 5 böngészők képesek megérteni. Az DataType attribútumok nem biztosítanak ellenőrzést.
DataType.Date nem adja meg a megjelenített dátum formátumát. Alapértelmezés szerint az adatmező a kiszolgáló alapértelmezett formátumai CultureInfoszerint jelenik meg.
Az DisplayFormat attribútum a dátumformátum explicit megadására szolgál:
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime ReleaseDate { get; set; }
A ApplyFormatInEditMode beállítás azt határozza meg, hogy a formázást akkor is alkalmazni kell, ha az érték szerkesztésre szolgáló szövegdobozban jelenik meg. (Előfordulhat, hogy bizonyos mezők esetében nem szeretné , például a pénznemértékek esetében valószínűleg nem szeretné a szövegmezőben lévő pénznemszimbólumot szerkeszteni.)
Az attribútumot önmagában is használhatja DisplayFormat , de általában érdemes használni az DataType attribútumot. Az DataType attribútum az adatok szemantikáját közvetíti a képernyőn való megjelenítés helyett, és az alábbi előnyöket nyújtja, amelyeket a DisplayFormat nem használ:
A böngésző engedélyezheti a HTML5-funkciókat (például naptár vezérlőelem, a területi beállításnak megfelelő pénznemszimbólum, e-mail-hivatkozások stb.)
Alapértelmezés szerint a böngésző a területi beállítások alapján a megfelelő formátumban jeleníti meg az adatokat.
Az
DataTypeattribútum lehetővé teszi, hogy az MVC kiválasztja a megfelelő mezősablont az adatok megjelenítéséhez (haDisplayFormatönmagában használja a sztringsablont).
Megjegyzés:
A jQuery érvényesítése nem működik megfelelően a Range attribútummal és a DateTime. Az alábbi kód például mindig megjelenít egy ügyféloldali érvényesítési hibát, még akkor is, ha a dátum a megadott tartományban van:
[Range(typeof(DateTime), "1/1/1966", "1/1/2020")]
A Range attribútum DateTime használatához le kell tiltania a jQuery dátumérvényesítést. Általában nem tanácsos rögzített dátumokat összeállítani a modellekben, ezért az Range attribútum és a DateTime használata kerülendő.
Az alábbi kód egy sorban egyesíti az attribútumokat:
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; }
}
A sorozat következő részében áttekintjük az alkalmazást, és továbbfejlesztjük az automatikusan létrehozott Details és Delete metódusokat.
További erőforrások
Ebben a szakaszban:
- A rendszer érvényesítési logikát ad hozzá a
Moviemodellhez. - Győződjön meg arról, hogy az érvényesítési szabályok érvénybe lépnek, amikor egy felhasználó létrehoz vagy szerkeszt egy filmet.
A dolgok szárazon tartása
Az MVC egyik tervezési terve a DRY ("Ne ismételje meg magad"). ASP.NET Core MVC arra ösztönzi, hogy csak egyszer adjon meg funkciókat vagy viselkedést, majd mindenhol megjelenjen az alkalmazásban. Ez csökkenti az írandó kód mennyiségét, kevésbé hajlamossá teszi az írott kódot a hibázásra, és könnyebben tesztelhetővé és karbantarthatóvá teszi.
Az MVC és az Entity Framework Core Code First által biztosított érvényesítési támogatás jó példa a DRY elvre. Az érvényesítési szabályokat deklaratív módon megadhatja egy helyen (a modellosztályban), és a szabályok az alkalmazásban mindenhol érvénybe lépnek.
A korábban szerkesztett adatok törlése
A következő lépésben olyan érvényesítési szabályok lesznek hozzáadva, amelyek nem teszik lehetővé a null értékeket.
Futtassa az alkalmazást, keresse meg /Movies/Index, törölje az összes felsorolt filmet, és állítsa le az alkalmazást. Az alkalmazás a következő futtatáskor fogja használni a magadatokat.
Érvényesítési szabályok hozzáadása a filmmodellhez
A DataAnnotations névtér olyan beépített érvényesítési attribútumokat biztosít, amelyeket deklaratív módon alkalmazunk egy osztályra vagy tulajdonságra. A DataAnnotations olyan formázási attribútumokat is tartalmaz, mint a DataType, amelyek segítenek a formázásban, és nem biztosítanak semmilyen ellenőrzést.
Frissítse a Movie osztályt, hogy kihasználja a beépített érvényesítési attribútumok Required, StringLength, RegularExpression, Range és a DataType formázási attribútum előnyeit.
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; }
}
Az érvényesítési attribútumok megadják a modelltulajdonságokon érvényesítendő viselkedést:
Az
RequiredésMinimumLengthaz attribútumok azt jelzik, hogy egy tulajdonságnak értékkel kell rendelkeznie, de semmi sem akadályozza meg, hogy a felhasználó üres területre lépjen az ellenőrzés teljesítéséhez.A
RegularExpressionattribútummal korlátozható, hogy mely karakterek adhatóak meg. Az előző kódban a "Műfaj":- Csak betűket szabad használni.
- Az első betűnek nagybetűsnek kell lennie. A számok mellett fehér szóközök is megengedettek, a speciális karakterek pedig nem.
A
RegularExpression"Értékelés":- Az első karakternek nagybetűsnek kell lennie.
- Lehetővé teszi a speciális karaktereket és számokat a következő szóközökben. A "PG-13" érvényes egy minősítésre, de nem felel meg a "Műfaj" kifejezésnek.
A
Rangeattribútum egy adott tartományon belülre korlátozza az értéket.Az
StringLengthattribútum lehetővé teszi egy sztringtulajdonság maximális hosszának és opcionális minimális hosszának beállítását.Az értéktípusokra (például
decimal,int,float,DateTime) alapvetően szükség van, és nincs szükség a[Required]attribútumra.
A ASP.NET Core által automatikusan kikényszerített érvényesítési szabályok segítenek az alkalmazás robusztusabbá tétele. Emellett gondoskodik arról, hogy ne felejtsen el ellenőrizni valamit, és véletlenül rossz adatokat engedjen be az adatbázisba.
Érvényesítési hiba felhasználói felülete
Nyissa meg az alkalmazást, és lépjen a Filmek kontrollerhez.
Új film hozzáadásához válassza az Új létrehozása hivatkozást. Töltse ki az űrlapot érvénytelen értékekkel. Amint a jQuery ügyféloldali ellenőrzése észleli a hibát, hibaüzenet jelenik meg.
Megjegyzés:
Elképzelhető, hogy nem tud tizedesvesszőt beírni a tizedestizedes mezőkbe. Ha támogatni szeretné jQuery-érvényesítési olyan nem angol nyelvű területi beállításokhoz, amelyek vesszőt (",") használnak tizedesvesszőhöz, és nem US-English dátumformátumokat, lépéseket kell tennie az alkalmazás globalizálásához. A decimális vessző hozzáadására vonatkozó utasításokért tekintse meg a GitHub 4076-os megjegyzését.
Figyelje meg, hogy az űrlap automatikusan megjelenít egy megfelelő érvényesítési hibaüzenetet minden olyan mezőben, amely érvénytelen értéket tartalmaz. A hibákat mind ügyféloldalon (JavaScript és jQuery használatával), mind kiszolgálóoldalon kényszerítik, arra az esetre, ha a felhasználó letiltotta a JavaScriptet.
Jelentős előnye, hogy az érvényesítési felhasználói felület engedélyezéséhez nem kellett egyetlen kódsort módosítania az MoviesController osztályban vagy a Create.cshtml nézetben. Az oktatóanyag korábbi részében létrehozott vezérlő és nézetek automatikusan átvették a modellosztály tulajdonságainak Movie érvényesítési attribútumaival megadott érvényesítési szabályokat. Tesztelje az érvényesítést a Edit műveleti metódus használatával, és alkalmazza ugyanazt az érvényesítést.
Az űrlapadatok csak akkor lesznek elküldve a kiszolgálónak, ha nincsenek ügyféloldali érvényesítési hibák. Ezt úgy ellenőrizheti, ha töréspontot helyez a HTTP Post metódusba a Fiddler eszközzel vagy az F12 Fejlesztői eszközökkel.
Az ellenőrzés működése
Felmerülhet a kérdés, hogyan lett létrehozva az érvényesítési felhasználói felület a vezérlőben vagy nézetekben lévő kód frissítése nélkül. Az alábbi kód a két Create metódust mutatja be.
// 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);
}
Az első (HTTP GET) Create műveletmetódus megjeleníti a kezdeti Létrehozás űrlapot. A második ([HttpPost]) verzió kezeli az űrlap-bejegyzést. A második Create metódus (a [HttpPost] verzió) kéri ModelState.IsValid annak ellenőrzésére, hogy a film rendelkezik-e érvényesítési hibával. A metódus meghívása kiértékeli az objektumra alkalmazott érvényesítési attribútumokat. Ha az objektum érvényesítési hibákba ütközik, a Create metódus újra megjeleníti az űrlapot. Ha nincsenek hibák, a metódus menti az új filmet az adatbázisban. A filmes példánkban az űrlap nem lesz közzétéve a kiszolgálónak, ha ellenőrzési hibák észlelhetők az ügyféloldalon; a második Create metódus soha nem lesz meghívva ügyféloldali érvényesítési hibák esetén. Ha letiltja a JavaScriptet a böngészőben, az ügyfélérvényesítés le van tiltva, és tesztelheti a HTTP POST Create metódust ModelState.IsValid , amely észleli az ellenőrzési hibákat.
Beállíthat egy töréspontot a [HttpPost] Create metódusban, és ellenőrizheti, hogy a metódus soha nem lett meghívva, az ügyféloldali ellenőrzés nem küldi el az űrlapadatokat érvényesítési hibák észlelésekor. Ha letiltja a JavaScriptet a böngészőben, majd hibaüzenetekkel küldi el az űrlapot, a töréspont el lesz érve. JavaScript nélkül továbbra is teljes körű ellenőrzést kap.
Az alábbi kép bemutatja, hogyan tilthatja le a JavaScriptet a Firefox böngészőben.
Az alábbi kép bemutatja, hogyan tilthatja le a JavaScriptet a Chrome böngészőben.
A JavaScript letiltása után tegye közzé az érvénytelen adatokat, és lépjen végig a hibakeresőn.
A nézetsablon egy része Create.cshtml az alábbi korrektúra szerint jelenik meg:
<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.*@
A műveleti metódusok az előző korrektúrát használják a kezdeti űrlap megjelenítéséhez és hiba esetén való újbóli megjelenítéséhez.
A beviteli címke segédje a DataAnnotations attribútumokat használja, és az ügyféloldali jQuery-ellenőrzéshez szükséges HTML-attribútumokat hoz létre. Az Érvényesítési címke súgója érvényesítési hibákat jelenít meg. További információt az Ellenőrzés című témakörben talál.
Ami igazán jó ebben a megközelítésben, hogy sem a vezérlő, sem a Create nézetsablon nem tud semmit a tényleges érvényesítési szabályokról vagy a megjelenő konkrét hibaüzenetekről. Az érvényesítési szabályok és a hibasztringek csak az Movie osztályban vannak megadva. Ugyanezeket az érvényesítési szabályokat a rendszer automatikusan alkalmazza a Edit nézetre, és minden más olyan nézetsablonra, amelyet létrehozhat, amely szerkessze a modellt.
Ha módosítania kell az érvényesítési logikát, ezt pontosan egy helyen teheti meg úgy, hogy érvényesítési attribútumokat ad hozzá a modellhez (ebben a példában az Movie osztályhoz). Nem kell aggódnia amiatt, hogy az alkalmazás különböző részei nem összhangban vannak a szabályok kikényszerítésével – az összes érvényesítési logika egy helyen lesz definiálva, és mindenhol használható lesz. Így a kód nagyon tiszta marad, és megkönnyíti a karbantartást és a fejlődést. És ez azt jelenti, hogy teljes mértékben tiszteletben fogja tartani a DRY alapelvet.
DataType-attribútumok használata
Nyissa meg a Movie.cs fájlt, és vizsgálja meg az osztályt Movie . A System.ComponentModel.DataAnnotations névtér az érvényesítési attribútumok beépített készletén kívül formázási attribútumokat is tartalmaz. Már alkalmaztunk egy DataType enumerálási értéket a kiadási dátumra és az ármezőkre. Az alábbi kód megmutatja a ReleaseDate tulajdonságokat, a megfelelő Price attribútummal.
[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; }
Az DataType attribútumok csak tippeket nyújtanak a nézetmotor számára az adatok formázásához, és olyan elemeket/attribútumokat szolgáltatnak, mint az <a> URL-címek és <a href="mailto:EmailAddress.com"> az e-mailek. Az RegularExpression attribútummal ellenőrizheti az adatok formátumát. Az DataType attribútum egy olyan adattípus megadására szolgál, amely pontosabb az adatbázis belső típusánál, és nem érvényesítési attribútumok. Ebben az esetben csak a dátumot szeretnénk nyomon követni, nem az időpontot. Az DataType Enumerálás számos adattípust biztosít, például dátumot, időt, telefonszámot, pénznemet, e-mailcímet stb. Az DataType attribútum azt is lehetővé teszi, hogy az alkalmazás automatikusan típusspecifikus szolgáltatásokat biztosítson. Például létrehozhat egy mailto: hivatkozást a DataType.EmailAddress számára, és HTML5-öt támogató böngészőkben egy dátumválasztót is biztosíthat DataType.Date számára. Az DataType attribútumok HTML 5 data- (kifejezett adatkötőjel) attribútumokat bocsátanak ki, amelyeket a HTML 5 böngészők képesek megérteni. Az DataType attribútumok nem biztosítanak ellenőrzést.
DataType.Date nem adja meg a megjelenített dátum formátumát. Alapértelmezés szerint az adatmező a kiszolgáló alapértelmezett formátumai CultureInfoszerint jelenik meg.
Az DisplayFormat attribútum a dátumformátum explicit megadására szolgál:
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime ReleaseDate { get; set; }
A ApplyFormatInEditMode beállítás azt határozza meg, hogy a formázást akkor is alkalmazni kell, ha az érték szerkesztésre szolgáló szövegdobozban jelenik meg. (Előfordulhat, hogy bizonyos mezők esetében nem szeretné , például a pénznemértékek esetében valószínűleg nem szeretné a szövegmezőben lévő pénznemszimbólumot szerkeszteni.)
Az attribútumot önmagában is használhatja DisplayFormat , de általában érdemes használni az DataType attribútumot. Az DataType attribútum az adatok szemantikáját közvetíti a képernyőn való megjelenítés helyett, és az alábbi előnyöket nyújtja, amelyeket a DisplayFormat nem használ:
A böngésző engedélyezheti a HTML5-funkciókat (például naptár vezérlőelem, a területi beállításnak megfelelő pénznemszimbólum, e-mail-hivatkozások stb.)
Alapértelmezés szerint a böngésző a területi beállítások alapján a megfelelő formátumban jeleníti meg az adatokat.
Az
DataTypeattribútum lehetővé teszi, hogy az MVC kiválasztja a megfelelő mezősablont az adatok megjelenítéséhez (haDisplayFormatönmagában használja a sztringsablont).
Megjegyzés:
A jQuery érvényesítése nem működik megfelelően a Range attribútummal és a DateTime. Az alábbi kód például mindig megjelenít egy ügyféloldali érvényesítési hibát, még akkor is, ha a dátum a megadott tartományban van:
[Range(typeof(DateTime), "1/1/1966", "1/1/2020")]
A Range attribútum DateTime használatához le kell tiltania a jQuery dátumérvényesítést. Általában nem tanácsos rögzített dátumokat összeállítani a modellekben, ezért az Range attribútum és a DateTime használata kerülendő.
Az alábbi kód egy sorban egyesíti az attribútumokat:
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; }
}
A sorozat következő részében áttekintjük az alkalmazást, és továbbfejlesztjük az automatikusan létrehozott Details és Delete metódusokat.
További erőforrások
Ebben a szakaszban:
- A rendszer érvényesítési logikát ad hozzá a
Moviemodellhez. - Győződjön meg arról, hogy az érvényesítési szabályok érvénybe lépnek, amikor egy felhasználó létrehoz vagy szerkeszt egy filmet.
A dolgok szárazon tartása
Az MVC egyik tervezési terve a DRY ("Ne ismételje meg magad"). ASP.NET Core MVC arra ösztönzi, hogy csak egyszer adjon meg funkciókat vagy viselkedést, majd mindenhol megjelenjen az alkalmazásban. Ez csökkenti az írandó kód mennyiségét, kevésbé hajlamossá teszi az írott kódot a hibázásra, és könnyebben tesztelhetővé és karbantarthatóvá teszi.
Az MVC és az Entity Framework Core Code First által biztosított érvényesítési támogatás jó példa a DRY elvre. Az érvényesítési szabályokat deklaratív módon megadhatja egy helyen (a modellosztályban), és a szabályok az alkalmazásban mindenhol érvénybe lépnek.
Érvényesítési szabályok hozzáadása a filmmodellhez
A DataAnnotations névtér olyan beépített érvényesítési attribútumokat biztosít, amelyeket deklaratív módon alkalmazunk egy osztályra vagy tulajdonságra. A DataAnnotations olyan formázási attribútumokat is tartalmaz, mint a DataType, amelyek segítenek a formázásban, és nem biztosítanak semmilyen ellenőrzést.
Frissítse a Movie osztályt, hogy kihasználja a beépített érvényesítési attribútumok Required, StringLength, RegularExpression, Range és a DataType formázási attribútum előnyeit.
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; }
}
Az érvényesítési attribútumok megadják a modelltulajdonságokon érvényesítendő viselkedést:
Az
RequiredésMinimumLengthaz attribútumok azt jelzik, hogy egy tulajdonságnak értékkel kell rendelkeznie, de semmi sem akadályozza meg, hogy a felhasználó üres területre lépjen az ellenőrzés teljesítéséhez.A
RegularExpressionattribútummal korlátozható, hogy mely karakterek adhatóak meg. Az előző kódban a "Műfaj":- Csak betűket szabad használni.
- Az első betűnek nagybetűsnek kell lennie. A számok mellett fehér szóközök is megengedettek, a speciális karakterek pedig nem.
A
RegularExpression"Értékelés":- Az első karakternek nagybetűsnek kell lennie.
- Lehetővé teszi a speciális karaktereket és számokat a következő szóközökben. A "PG-13" érvényes egy minősítésre, de nem felel meg a "Műfaj" kifejezésnek.
A
Rangeattribútum egy adott tartományon belülre korlátozza az értéket.Az
StringLengthattribútum lehetővé teszi egy sztringtulajdonság maximális hosszának és opcionális minimális hosszának beállítását.Az értéktípusokra (például
decimal,int,float,DateTime) alapvetően szükség van, és nincs szükség a[Required]attribútumra.
A ASP.NET Core által automatikusan kikényszerített érvényesítési szabályok segítenek az alkalmazás robusztusabbá tétele. Emellett gondoskodik arról, hogy ne felejtsen el ellenőrizni valamit, és véletlenül rossz adatokat engedjen be az adatbázisba.
Érvényesítési hiba felhasználói felülete
Nyissa meg az alkalmazást, és lépjen a Filmek kontrollerhez.
Új film hozzáadásához válassza az Új létrehozása hivatkozást. Töltse ki az űrlapot érvénytelen értékekkel. Amint a jQuery ügyféloldali ellenőrzése észleli a hibát, hibaüzenet jelenik meg.
Megjegyzés:
Elképzelhető, hogy nem tud tizedesvesszőt beírni a tizedestizedes mezőkbe. Ha támogatni szeretné jQuery-érvényesítési olyan nem angol nyelvű területi beállításokhoz, amelyek vesszőt (",") használnak tizedesvesszőhöz, és nem US-English dátumformátumokat, lépéseket kell tennie az alkalmazás globalizálásához. A decimális vessző hozzáadására vonatkozó utasításokért tekintse meg a GitHub 4076-os megjegyzését.
Figyelje meg, hogy az űrlap automatikusan megjelenít egy megfelelő érvényesítési hibaüzenetet minden olyan mezőben, amely érvénytelen értéket tartalmaz. A hibákat mind ügyféloldalon (JavaScript és jQuery használatával), mind kiszolgálóoldalon kényszerítik, arra az esetre, ha a felhasználó letiltotta a JavaScriptet.
Jelentős előnye, hogy az érvényesítési felhasználói felület engedélyezéséhez nem kellett egyetlen kódsort módosítania az MoviesController osztályban vagy a Create.cshtml nézetben. Az oktatóanyag korábbi részében létrehozott vezérlő és nézetek automatikusan átvették a modellosztály tulajdonságainak Movie érvényesítési attribútumaival megadott érvényesítési szabályokat. Tesztelje az érvényesítést a Edit műveleti metódus használatával, és alkalmazza ugyanazt az érvényesítést.
Az űrlapadatok csak akkor lesznek elküldve a kiszolgálónak, ha nincsenek ügyféloldali érvényesítési hibák. Ezt úgy ellenőrizheti, ha töréspontot helyez a HTTP Post metódusba a Fiddler eszközzel vagy az F12 Fejlesztői eszközökkel.
Az ellenőrzés működése
Felmerülhet a kérdés, hogyan lett létrehozva az érvényesítési felhasználói felület a vezérlőben vagy nézetekben lévő kód frissítése nélkül. Az alábbi kód a két Create metódust mutatja be.
// 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);
}
Az első (HTTP GET) Create műveletmetódus megjeleníti a kezdeti Létrehozás űrlapot. A második ([HttpPost]) verzió kezeli az űrlap-bejegyzést. A második Create metódus (a [HttpPost] verzió) kéri ModelState.IsValid annak ellenőrzésére, hogy a film rendelkezik-e érvényesítési hibával. A metódus meghívása kiértékeli az objektumra alkalmazott érvényesítési attribútumokat. Ha az objektum érvényesítési hibákba ütközik, a Create metódus újra megjeleníti az űrlapot. Ha nincsenek hibák, a metódus menti az új filmet az adatbázisban. A filmes példánkban az űrlap nem lesz közzétéve a kiszolgálónak, ha ellenőrzési hibák észlelhetők az ügyféloldalon; a második Create metódus soha nem lesz meghívva ügyféloldali érvényesítési hibák esetén. Ha letiltja a JavaScriptet a böngészőben, az ügyfélérvényesítés le van tiltva, és tesztelheti a HTTP POST Create metódust ModelState.IsValid , amely észleli az ellenőrzési hibákat.
Beállíthat egy töréspontot a [HttpPost] Create metódusban, és ellenőrizheti, hogy a metódus soha nem lett meghívva, az ügyféloldali ellenőrzés nem küldi el az űrlapadatokat érvényesítési hibák észlelésekor. Ha letiltja a JavaScriptet a böngészőben, majd hibaüzenetekkel küldi el az űrlapot, a töréspont el lesz érve. JavaScript nélkül továbbra is teljes körű ellenőrzést kap.
Az alábbi kép bemutatja, hogyan tilthatja le a JavaScriptet a Firefox böngészőben.
Az alábbi kép bemutatja, hogyan tilthatja le a JavaScriptet a Chrome böngészőben.
A JavaScript letiltása után tegye közzé az érvénytelen adatokat, és lépjen végig a hibakeresőn.
A nézetsablon egy része Create.cshtml az alábbi korrektúra szerint jelenik meg:
<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.*@
A műveleti metódusok az előző korrektúrát használják a kezdeti űrlap megjelenítéséhez és hiba esetén való újbóli megjelenítéséhez.
A beviteli címke segédje a DataAnnotations attribútumokat használja, és az ügyféloldali jQuery-ellenőrzéshez szükséges HTML-attribútumokat hoz létre. Az Érvényesítési címke súgója érvényesítési hibákat jelenít meg. További információt az Ellenőrzés című témakörben talál.
Ami igazán jó ebben a megközelítésben, hogy sem a vezérlő, sem a Create nézetsablon nem tud semmit a tényleges érvényesítési szabályokról vagy a megjelenő konkrét hibaüzenetekről. Az érvényesítési szabályok és a hibasztringek csak az Movie osztályban vannak megadva. Ugyanezeket az érvényesítési szabályokat a rendszer automatikusan alkalmazza a Edit nézetre, és minden más olyan nézetsablonra, amelyet létrehozhat, amely szerkessze a modellt.
Ha módosítania kell az érvényesítési logikát, ezt pontosan egy helyen teheti meg úgy, hogy érvényesítési attribútumokat ad hozzá a modellhez (ebben a példában az Movie osztályhoz). Nem kell aggódnia amiatt, hogy az alkalmazás különböző részei nem összhangban vannak a szabályok kikényszerítésével – az összes érvényesítési logika egy helyen lesz definiálva, és mindenhol használható lesz. Így a kód nagyon tiszta marad, és megkönnyíti a karbantartást és a fejlődést. És ez azt jelenti, hogy teljes mértékben tiszteletben fogja tartani a DRY alapelvet.
DataType-attribútumok használata
Nyissa meg a Movie.cs fájlt, és vizsgálja meg az osztályt Movie . A System.ComponentModel.DataAnnotations névtér az érvényesítési attribútumok beépített készletén kívül formázási attribútumokat is tartalmaz. Már alkalmaztunk egy DataType enumerálási értéket a kiadási dátumra és az ármezőkre. Az alábbi kód megmutatja a ReleaseDate tulajdonságokat, a megfelelő Price attribútummal.
[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; }
Az DataType attribútumok csak tippeket nyújtanak a nézetmotor számára az adatok formázásához, és olyan elemeket/attribútumokat szolgáltatnak, mint az <a> URL-címek és <a href="mailto:EmailAddress.com"> az e-mailek. Az RegularExpression attribútummal ellenőrizheti az adatok formátumát. Az DataType attribútum egy olyan adattípus megadására szolgál, amely pontosabb az adatbázis belső típusánál, és nem érvényesítési attribútumok. Ebben az esetben csak a dátumot szeretnénk nyomon követni, nem az időpontot. Az DataType Enumerálás számos adattípust biztosít, például dátumot, időt, telefonszámot, pénznemet, e-mailcímet stb. Az DataType attribútum azt is lehetővé teszi, hogy az alkalmazás automatikusan típusspecifikus szolgáltatásokat biztosítson. Például létrehozhat egy mailto: hivatkozást a DataType.EmailAddress számára, és HTML5-öt támogató böngészőkben egy dátumválasztót is biztosíthat DataType.Date számára. Az DataType attribútumok HTML 5 data- (kifejezett adatkötőjel) attribútumokat bocsátanak ki, amelyeket a HTML 5 böngészők képesek megérteni. Az DataType attribútumok nem biztosítanak ellenőrzést.
DataType.Date nem adja meg a megjelenített dátum formátumát. Alapértelmezés szerint az adatmező a kiszolgáló alapértelmezett formátumai CultureInfoszerint jelenik meg.
Az DisplayFormat attribútum a dátumformátum explicit megadására szolgál:
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime ReleaseDate { get; set; }
A ApplyFormatInEditMode beállítás azt határozza meg, hogy a formázást akkor is alkalmazni kell, ha az érték szerkesztésre szolgáló szövegdobozban jelenik meg. (Előfordulhat, hogy bizonyos mezők esetében nem szeretné , például a pénznemértékek esetében valószínűleg nem szeretné a szövegmezőben lévő pénznemszimbólumot szerkeszteni.)
Az attribútumot önmagában is használhatja DisplayFormat , de általában érdemes használni az DataType attribútumot. Az DataType attribútum az adatok szemantikáját közvetíti a képernyőn való megjelenítés helyett, és az alábbi előnyöket nyújtja, amelyeket a DisplayFormat nem használ:
A böngésző engedélyezheti a HTML5-funkciókat (például naptár vezérlőelem, a területi beállításnak megfelelő pénznemszimbólum, e-mail-hivatkozások stb.)
Alapértelmezés szerint a böngésző a területi beállítások alapján a megfelelő formátumban jeleníti meg az adatokat.
Az
DataTypeattribútum lehetővé teszi, hogy az MVC kiválasztja a megfelelő mezősablont az adatok megjelenítéséhez (haDisplayFormatönmagában használja a sztringsablont).
Megjegyzés:
A jQuery érvényesítése nem működik megfelelően a Range attribútummal és a DateTime. Az alábbi kód például mindig megjelenít egy ügyféloldali érvényesítési hibát, még akkor is, ha a dátum a megadott tartományban van:
[Range(typeof(DateTime), "1/1/1966", "1/1/2020")]
A Range attribútum DateTime használatához le kell tiltania a jQuery dátumérvényesítést. Általában nem tanácsos rögzített dátumokat összeállítani a modellekben, ezért az Range attribútum és a DateTime használata kerülendő.
Az alábbi kód egy sorban egyesíti az attribútumokat:
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; }
}
A sorozat következő részében áttekintjük az alkalmazást, és továbbfejlesztjük az automatikusan létrehozott Details és Delete metódusokat.
További erőforrások
Ebben a szakaszban:
- A rendszer érvényesítési logikát ad hozzá a
Moviemodellhez. - Győződjön meg arról, hogy az érvényesítési szabályok érvénybe lépnek, amikor egy felhasználó létrehoz vagy szerkeszt egy filmet.
A dolgok szárazon tartása
Az MVC egyik tervezési terve a DRY ("Ne ismételje meg magad"). ASP.NET Core MVC arra ösztönzi, hogy csak egyszer adjon meg funkciókat vagy viselkedést, majd mindenhol megjelenjen az alkalmazásban. Ez csökkenti az írandó kód mennyiségét, kevésbé hajlamossá teszi az írott kódot a hibázásra, és könnyebben tesztelhetővé és karbantarthatóvá teszi.
Az MVC és az Entity Framework Core Code First által biztosított érvényesítési támogatás jó példa a DRY elvre. Az érvényesítési szabályokat deklaratív módon megadhatja egy helyen (a modellosztályban), és a szabályok az alkalmazásban mindenhol érvénybe lépnek.
Érvényesítési szabályok hozzáadása a filmmodellhez
A DataAnnotations névtér olyan beépített érvényesítési attribútumokat biztosít, amelyeket deklaratív módon alkalmazunk egy osztályra vagy tulajdonságra. A DataAnnotations olyan formázási attribútumokat is tartalmaz, mint a DataType, amelyek segítenek a formázásban, és nem biztosítanak semmilyen ellenőrzést.
Frissítse az Movie osztályt a beépített Required, StringLength, RegularExpression és Range érvényesítési attribútumok kihasználására.
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; }
}
}
Az érvényesítési attribútumok megadják a modelltulajdonságokon érvényesítendő viselkedést:
Az
RequiredésMinimumLengthaz attribútumok azt jelzik, hogy egy tulajdonságnak értékkel kell rendelkeznie, de semmi sem akadályozza meg, hogy a felhasználó üres területre lépjen az ellenőrzés teljesítéséhez.A
RegularExpressionattribútummal korlátozható, hogy mely karakterek adhatóak meg. Az előző kódban a "Műfaj":- Csak betűket szabad használni.
- Az első betűnek nagybetűsnek kell lennie. A számok mellett fehér szóközök is megengedettek, a speciális karakterek pedig nem.
A
RegularExpression"Értékelés":- Az első karakternek nagybetűsnek kell lennie.
- Lehetővé teszi a speciális karaktereket és számokat a következő szóközökben. A "PG-13" érvényes egy minősítésre, de nem felel meg a "Műfaj" kifejezésnek.
A
Rangeattribútum egy adott tartományon belülre korlátozza az értéket.Az
StringLengthattribútum lehetővé teszi egy sztringtulajdonság maximális hosszának és opcionális minimális hosszának beállítását.Az értéktípusokra (például
decimal,int,float,DateTime) alapvetően szükség van, és nincs szükség a[Required]attribútumra.
A ASP.NET Core által automatikusan kikényszerített érvényesítési szabályok segítenek az alkalmazás robusztusabbá tétele. Emellett gondoskodik arról, hogy ne felejtsen el ellenőrizni valamit, és véletlenül rossz adatokat engedjen be az adatbázisba.
Érvényesítési hiba felhasználói felülete
Nyissa meg az alkalmazást, és lépjen a Filmek kontrollerhez.
Új film hozzáadásához válassza az Új létrehozása hivatkozást. Töltse ki az űrlapot érvénytelen értékekkel. Amint a jQuery ügyféloldali ellenőrzése észleli a hibát, hibaüzenet jelenik meg.
Megjegyzés:
Elképzelhető, hogy nem tud tizedesvesszőt beírni a tizedestizedes mezőkbe. Ha támogatni szeretné jQuery-érvényesítési olyan nem angol nyelvű területi beállításokhoz, amelyek vesszőt (",") használnak tizedesvesszőhöz, és nem US-English dátumformátumokat, lépéseket kell tennie az alkalmazás globalizálásához. A decimális vessző hozzáadására vonatkozó utasításokért tekintse meg a GitHub 4076-os megjegyzését.
Figyelje meg, hogy az űrlap automatikusan megjelenít egy megfelelő érvényesítési hibaüzenetet minden olyan mezőben, amely érvénytelen értéket tartalmaz. A hibákat mind ügyféloldalon (JavaScript és jQuery használatával), mind kiszolgálóoldalon kényszerítik, arra az esetre, ha a felhasználó letiltotta a JavaScriptet.
Jelentős előnye, hogy az érvényesítési felhasználói felület engedélyezéséhez nem kellett egyetlen kódsort módosítania az MoviesController osztályban vagy a Create.cshtml nézetben. Az oktatóanyag korábbi részében létrehozott vezérlő és nézetek automatikusan átvették a modellosztály tulajdonságainak Movie érvényesítési attribútumaival megadott érvényesítési szabályokat. Tesztelje az érvényesítést a Edit műveleti metódus használatával, és alkalmazza ugyanazt az érvényesítést.
Az űrlapadatok csak akkor lesznek elküldve a kiszolgálónak, ha nincsenek ügyféloldali érvényesítési hibák. Ezt úgy ellenőrizheti, ha töréspontot helyez a HTTP Post metódusba a Fiddler eszközzel vagy az F12 Fejlesztői eszközökkel.
Az ellenőrzés működése
Felmerülhet a kérdés, hogyan lett létrehozva az érvényesítési felhasználói felület a vezérlőben vagy nézetekben lévő kód frissítése nélkül. Az alábbi kód a két Create metódust mutatja be.
// 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);
}
Az első (HTTP GET) Create műveletmetódus megjeleníti a kezdeti Létrehozás űrlapot. A második ([HttpPost]) verzió kezeli az űrlap-bejegyzést. A második Create metódus (a [HttpPost] verzió) kéri ModelState.IsValid annak ellenőrzésére, hogy a film rendelkezik-e érvényesítési hibával. A metódus meghívása kiértékeli az objektumra alkalmazott érvényesítési attribútumokat. Ha az objektum érvényesítési hibákba ütközik, a Create metódus újra megjeleníti az űrlapot. Ha nincsenek hibák, a metódus menti az új filmet az adatbázisban. A filmes példánkban az űrlap nem lesz közzétéve a kiszolgálónak, ha ellenőrzési hibák észlelhetők az ügyféloldalon; a második Create metódus soha nem lesz meghívva ügyféloldali érvényesítési hibák esetén. Ha letiltja a JavaScriptet a böngészőben, az ügyfélérvényesítés le van tiltva, és tesztelheti a HTTP POST Create metódust ModelState.IsValid , amely észleli az ellenőrzési hibákat.
Beállíthat egy töréspontot a [HttpPost] Create metódusban, és ellenőrizheti, hogy a metódus soha nem lett meghívva, az ügyféloldali ellenőrzés nem küldi el az űrlapadatokat érvényesítési hibák észlelésekor. Ha letiltja a JavaScriptet a böngészőben, majd hibaüzenetekkel küldi el az űrlapot, a töréspont el lesz érve. JavaScript nélkül továbbra is teljes körű ellenőrzést kap.
Az alábbi kép bemutatja, hogyan tilthatja le a JavaScriptet a Firefox böngészőben.
Az alábbi kép bemutatja, hogyan tilthatja le a JavaScriptet a Chrome böngészőben.
A JavaScript letiltása után tegye közzé az érvénytelen adatokat, és lépjen végig a hibakeresőn.
A nézetsablon egy része Create.cshtml az alábbi korrektúra szerint jelenik meg:
<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.*@
A műveleti metódusok az előző korrektúrát használják a kezdeti űrlap megjelenítéséhez és hiba esetén való újbóli megjelenítéséhez.
A beviteli címke segédje a DataAnnotations attribútumokat használja, és az ügyféloldali jQuery-ellenőrzéshez szükséges HTML-attribútumokat hoz létre. Az Érvényesítési címke súgója érvényesítési hibákat jelenít meg. További információt az Ellenőrzés című témakörben talál.
Ami igazán jó ebben a megközelítésben, hogy sem a vezérlő, sem a Create nézetsablon nem tud semmit a tényleges érvényesítési szabályokról vagy a megjelenő konkrét hibaüzenetekről. Az érvényesítési szabályok és a hibasztringek csak az Movie osztályban vannak megadva. Ugyanezeket az érvényesítési szabályokat a rendszer automatikusan alkalmazza a Edit nézetre, és minden más olyan nézetsablonra, amelyet létrehozhat, amely szerkessze a modellt.
Ha módosítania kell az érvényesítési logikát, ezt pontosan egy helyen teheti meg úgy, hogy érvényesítési attribútumokat ad hozzá a modellhez (ebben a példában az Movie osztályhoz). Nem kell aggódnia amiatt, hogy az alkalmazás különböző részei nem összhangban vannak a szabályok kikényszerítésével – az összes érvényesítési logika egy helyen lesz definiálva, és mindenhol használható lesz. Így a kód nagyon tiszta marad, és megkönnyíti a karbantartást és a fejlődést. És ez azt jelenti, hogy teljes mértékben tiszteletben fogja tartani a DRY alapelvet.
DataType-attribútumok használata
Nyissa meg a Movie.cs fájlt, és vizsgálja meg az osztályt Movie . A System.ComponentModel.DataAnnotations névtér az érvényesítési attribútumok beépített készletén kívül formázási attribútumokat is tartalmaz. Már alkalmaztunk egy DataType enumerálási értéket a kiadási dátumra és az ármezőkre. Az alábbi kód megmutatja a ReleaseDate tulajdonságokat, a megfelelő Price attribútummal.
[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; }
Az DataType attribútumok csak tippeket nyújtanak a nézetmotor számára az adatok formázásához, és olyan elemeket/attribútumokat szolgáltatnak, mint az <a> URL-címek és <a href="mailto:EmailAddress.com"> az e-mailek. Az RegularExpression attribútummal ellenőrizheti az adatok formátumát. Az DataType attribútum egy olyan adattípus megadására szolgál, amely pontosabb az adatbázis belső típusánál, és nem érvényesítési attribútumok. Ebben az esetben csak a dátumot szeretnénk nyomon követni, nem az időpontot. Az DataType Enumerálás számos adattípust biztosít, például dátumot, időt, telefonszámot, pénznemet, e-mailcímet stb. Az DataType attribútum azt is lehetővé teszi, hogy az alkalmazás automatikusan típusspecifikus szolgáltatásokat biztosítson. Például létrehozhat egy mailto: hivatkozást a DataType.EmailAddress számára, és HTML5-öt támogató böngészőkben egy dátumválasztót is biztosíthat DataType.Date számára. Az DataType attribútumok HTML 5 data- (kifejezett adatkötőjel) attribútumokat bocsátanak ki, amelyeket a HTML 5 böngészők képesek megérteni. Az DataType attribútumok nem biztosítanak ellenőrzést.
DataType.Date nem adja meg a megjelenített dátum formátumát. Alapértelmezés szerint az adatmező a kiszolgáló alapértelmezett formátumai CultureInfoszerint jelenik meg.
Az DisplayFormat attribútum a dátumformátum explicit megadására szolgál:
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime ReleaseDate { get; set; }
A ApplyFormatInEditMode beállítás azt határozza meg, hogy a formázást akkor is alkalmazni kell, ha az érték szerkesztésre szolgáló szövegdobozban jelenik meg. (Előfordulhat, hogy bizonyos mezők esetében nem szeretné , például a pénznemértékek esetében valószínűleg nem szeretné a szövegmezőben lévő pénznemszimbólumot szerkeszteni.)
Az attribútumot önmagában is használhatja DisplayFormat , de általában érdemes használni az DataType attribútumot. Az DataType attribútum az adatok szemantikáját közvetíti a képernyőn való megjelenítés helyett, és az alábbi előnyöket nyújtja, amelyeket a DisplayFormat nem használ:
A böngésző engedélyezheti a HTML5-funkciókat (például naptár vezérlőelem, a területi beállításnak megfelelő pénznemszimbólum, e-mail-hivatkozások stb.)
Alapértelmezés szerint a böngésző a területi beállítások alapján a megfelelő formátumban jeleníti meg az adatokat.
Az
DataTypeattribútum lehetővé teszi, hogy az MVC kiválasztja a megfelelő mezősablont az adatok megjelenítéséhez (haDisplayFormatönmagában használja a sztringsablont).
Megjegyzés:
A jQuery érvényesítése nem működik megfelelően a Range attribútummal és a DateTime. Az alábbi kód például mindig megjelenít egy ügyféloldali érvényesítési hibát, még akkor is, ha a dátum a megadott tartományban van:
[Range(typeof(DateTime), "1/1/1966", "1/1/2020")]
A Range attribútum DateTime használatához le kell tiltania a jQuery dátumérvényesítést. Általában nem tanácsos rögzített dátumokat összeállítani a modellekben, ezért az Range attribútum és a DateTime használata kerülendő.
Az alábbi kód egy sorban egyesíti az attribútumokat:
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; }
}
}
A sorozat következő részében áttekintjük az alkalmazást, és továbbfejlesztjük az automatikusan létrehozott Details és Delete metódusokat.
További erőforrások
Ebben a szakaszban:
- A rendszer érvényesítési logikát ad hozzá a
Moviemodellhez. - Győződjön meg arról, hogy az érvényesítési szabályok érvénybe lépnek, amikor egy felhasználó létrehoz vagy szerkeszt egy filmet.
A dolgok szárazon tartása
Az MVC egyik tervezési terve a DRY ("Ne ismételje meg magad"). ASP.NET Core MVC arra ösztönzi, hogy csak egyszer adjon meg funkciókat vagy viselkedést, majd mindenhol megjelenjen az alkalmazásban. Ez csökkenti az írandó kód mennyiségét, kevésbé hajlamossá teszi az írott kódot a hibázásra, és könnyebben tesztelhetővé és karbantarthatóvá teszi.
Az MVC és az Entity Framework Core Code First által biztosított érvényesítési támogatás jó példa a DRY elvre. Az érvényesítési szabályokat deklaratív módon megadhatja egy helyen (a modellosztályban), és a szabályok az alkalmazásban mindenhol érvénybe lépnek.
Érvényesítési szabályok hozzáadása a filmmodellhez
A DataAnnotations névtér olyan beépített érvényesítési attribútumokat biztosít, amelyeket deklaratív módon alkalmazunk egy osztályra vagy tulajdonságra. A DataAnnotations olyan formázási attribútumokat is tartalmaz, mint a DataType, amelyek segítenek a formázásban, és nem biztosítanak semmilyen ellenőrzést.
Frissítse az Movie osztályt a beépített Required, StringLength, RegularExpression és Range érvényesítési attribútumok kihasználására.
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; }
}
Az érvényesítési attribútumok megadják a modelltulajdonságokon érvényesítendő viselkedést:
Az
RequiredésMinimumLengthaz attribútumok azt jelzik, hogy egy tulajdonságnak értékkel kell rendelkeznie, de semmi sem akadályozza meg, hogy a felhasználó üres területre lépjen az ellenőrzés teljesítéséhez.A
RegularExpressionattribútummal korlátozható, hogy mely karakterek adhatóak meg. Az előző kódban a "Műfaj":- Csak betűket szabad használni.
- Az első betűnek nagybetűsnek kell lennie. A szóközök megengedettek, míg a számok és a speciális karakterek nem.
A
RegularExpression"Értékelés":- Az első karakternek nagybetűsnek kell lennie.
- Lehetővé teszi a speciális karaktereket és számokat a következő szóközökben. A "PG-13" érvényes egy minősítésre, de nem felel meg a "Műfaj" kifejezésnek.
A
Rangeattribútum egy adott tartományon belülre korlátozza az értéket.Az
StringLengthattribútum lehetővé teszi egy sztringtulajdonság maximális hosszának és opcionális minimális hosszának beállítását.Az értéktípusokra (például
decimal,int,float,DateTime) alapvetően szükség van, és nincs szükség a[Required]attribútumra.
A ASP.NET Core által automatikusan kikényszerített érvényesítési szabályok segítenek az alkalmazás robusztusabbá tétele. Emellett gondoskodik arról, hogy ne felejtsen el ellenőrizni valamit, és véletlenül rossz adatokat engedjen be az adatbázisba.
Érvényesítési hiba felhasználói felülete
Nyissa meg az alkalmazást, és lépjen a Filmek kontrollerhez.
Új film hozzáadásához koppintson az Új hivatkozásra . Töltse ki az űrlapot érvénytelen értékekkel. Amint a jQuery ügyféloldali ellenőrzése észleli a hibát, hibaüzenet jelenik meg.
Megjegyzés:
Elképzelhető, hogy nem tud tizedesvesszőt beírni a tizedestizedes mezőkbe. Ha támogatni szeretné jQuery-érvényesítési olyan nem angol nyelvű területi beállításokhoz, amelyek vesszőt (",") használnak tizedesvesszőhöz, és nem US-English dátumformátumokat, lépéseket kell tennie az alkalmazás globalizálásához. A decimális vessző hozzáadására vonatkozó utasításokért tekintse meg a GitHub 4076-os megjegyzését.
Figyelje meg, hogy az űrlap automatikusan megjelenít egy megfelelő érvényesítési hibaüzenetet minden olyan mezőben, amely érvénytelen értéket tartalmaz. A hibákat mind ügyféloldalon (JavaScript és jQuery használatával), mind kiszolgálóoldalon kényszerítik, arra az esetre, ha a felhasználó letiltotta a JavaScriptet.
Jelentős előnye, hogy az érvényesítési felhasználói felület engedélyezéséhez nem kellett egyetlen kódsort módosítania az MoviesController osztályban vagy a Create.cshtml nézetben. Az oktatóanyag korábbi részében létrehozott vezérlő és nézetek automatikusan átvették a modellosztály tulajdonságainak Movie érvényesítési attribútumaival megadott érvényesítési szabályokat. Tesztelje az érvényesítést a Edit műveleti metódus használatával, és alkalmazza ugyanazt az érvényesítést.
Az űrlapadatok csak akkor lesznek elküldve a kiszolgálónak, ha nincsenek ügyféloldali érvényesítési hibák. Ezt úgy ellenőrizheti, ha töréspontot helyez a HTTP Post metódusba a Fiddler eszközzel vagy az F12 Fejlesztői eszközökkel.
Az ellenőrzés működése
Felmerülhet a kérdés, hogyan lett létrehozva az érvényesítési felhasználói felület a vezérlőben vagy nézetekben lévő kód frissítése nélkül. Az alábbi kód a két Create metódust mutatja be.
// 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);
}
Az első (HTTP GET) Create műveletmetódus megjeleníti a kezdeti Létrehozás űrlapot. A második ([HttpPost]) verzió kezeli az űrlap-bejegyzést. A második Create metódus (a [HttpPost] verzió) kéri ModelState.IsValid annak ellenőrzésére, hogy a film rendelkezik-e érvényesítési hibával. A metódus meghívása kiértékeli az objektumra alkalmazott érvényesítési attribútumokat. Ha az objektum érvényesítési hibákba ütközik, a Create metódus újra megjeleníti az űrlapot. Ha nincsenek hibák, a metódus menti az új filmet az adatbázisban. A filmes példánkban az űrlap nem lesz közzétéve a kiszolgálónak, ha ellenőrzési hibák észlelhetők az ügyféloldalon; a második Create metódus soha nem lesz meghívva ügyféloldali érvényesítési hibák esetén. Ha letiltja a JavaScriptet a böngészőben, az ügyfélérvényesítés le van tiltva, és tesztelheti a HTTP POST Create metódust ModelState.IsValid , amely észleli az ellenőrzési hibákat.
Beállíthat egy töréspontot a [HttpPost] Create metódusban, és ellenőrizheti, hogy a metódus soha nem lett meghívva, az ügyféloldali ellenőrzés nem küldi el az űrlapadatokat érvényesítési hibák észlelésekor. Ha letiltja a JavaScriptet a böngészőben, majd hibaüzenetekkel küldi el az űrlapot, a töréspont el lesz érve. JavaScript nélkül továbbra is teljes körű ellenőrzést kap.
Az alábbi kép bemutatja, hogyan tilthatja le a JavaScriptet a Firefox böngészőben.
Az alábbi kép bemutatja, hogyan tilthatja le a JavaScriptet a Chrome böngészőben.
A JavaScript letiltása után tegye közzé az érvénytelen adatokat, és lépjen végig a hibakeresőn.
A nézetsablon része Create.cshtml az alábbi korrektúra szerint jelenik meg:
<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.*@
A műveleti metódusok az előző korrektúrát használják a kezdeti űrlap megjelenítéséhez és hiba esetén való újbóli megjelenítéséhez.
A beviteli címke segédje a DataAnnotations attribútumokat használja, és az ügyféloldali jQuery-ellenőrzéshez szükséges HTML-attribútumokat hoz létre. Az Érvényesítési címke súgója érvényesítési hibákat jelenít meg. További információt az Ellenőrzés című témakörben talál.
Ami igazán jó ebben a megközelítésben, hogy sem a vezérlő, sem a Create nézetsablon nem tud semmit a tényleges érvényesítési szabályokról vagy a megjelenő konkrét hibaüzenetekről. Az érvényesítési szabályok és a hibasztringek csak az Movie osztályban vannak megadva. Ugyanezeket az érvényesítési szabályokat a rendszer automatikusan alkalmazza a Edit nézetre, és minden más olyan nézetsablonra, amelyet létrehozhat, amely szerkessze a modellt.
Ha módosítania kell az érvényesítési logikát, ezt pontosan egy helyen teheti meg úgy, hogy érvényesítési attribútumokat ad hozzá a modellhez (ebben a példában az Movie osztályhoz). Nem kell aggódnia amiatt, hogy az alkalmazás különböző részei nem összhangban vannak a szabályok kikényszerítésével – az összes érvényesítési logika egy helyen lesz definiálva, és mindenhol használható lesz. Így a kód nagyon tiszta marad, és megkönnyíti a karbantartást és a fejlődést. És ez azt jelenti, hogy teljes mértékben tiszteletben fogja tartani a DRY alapelvet.
DataType-attribútumok használata
Nyissa meg a Movie.cs fájlt, és vizsgálja meg az osztályt Movie . A System.ComponentModel.DataAnnotations névtér az érvényesítési attribútumok beépített készletén kívül formázási attribútumokat is tartalmaz. Már alkalmaztunk egy DataType enumerálási értéket a kiadási dátumra és az ármezőkre. Az alábbi kód megmutatja a ReleaseDate tulajdonságokat, a megfelelő Price attribútummal.
[Display(Name = "Release Date")]
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
[Range(1, 100)]
[DataType(DataType.Currency)]
public decimal Price { get; set; }
Az DataType attribútumok csak tippeket adnak a nézetmotornak az adatok formázásához (és olyan elemeket/attribútumokat tartalmaz, mint az <a> URL-címek és <a href="mailto:EmailAddress.com"> az e-mailek). Az RegularExpression attribútummal ellenőrizheti az adatok formátumát. Az DataType attribútum egy olyan adattípus megadására szolgál, amely pontosabb az adatbázis belső típusánál, és nem érvényesítési attribútumok. Ebben az esetben csak a dátumot szeretnénk nyomon követni, nem az időpontot. Az DataType Enumerálás számos adattípust biztosít, például dátumot, időt, telefonszámot, pénznemet, e-mailcímet stb. Az DataType attribútum azt is lehetővé teszi, hogy az alkalmazás automatikusan típusspecifikus szolgáltatásokat biztosítson. Például létrehozhat egy mailto: hivatkozást a DataType.EmailAddress számára, és HTML5-öt támogató böngészőkben egy dátumválasztót is biztosíthat DataType.Date számára. Az DataType attribútumok HTML 5 data- (kifejezett adatkötőjel) attribútumokat bocsátanak ki, amelyeket a HTML 5 böngészők képesek megérteni. Az DataType attribútumok nem biztosítanak ellenőrzést.
DataType.Date nem adja meg a megjelenített dátum formátumát. Alapértelmezés szerint az adatmező a kiszolgáló alapértelmezett formátumai CultureInfoszerint jelenik meg.
Az DisplayFormat attribútum a dátumformátum explicit megadására szolgál:
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime ReleaseDate { get; set; }
A ApplyFormatInEditMode beállítás azt határozza meg, hogy a formázást akkor is alkalmazni kell, ha az érték szerkesztésre szolgáló szövegdobozban jelenik meg. (Előfordulhat, hogy bizonyos mezők esetében nem szeretné , például a pénznemértékek esetében valószínűleg nem szeretné a szövegmezőben lévő pénznemszimbólumot szerkeszteni.)
Az attribútumot önmagában is használhatja DisplayFormat , de általában érdemes használni az DataType attribútumot. Az DataType attribútum az adatok szemantikáját közvetíti a képernyőn való megjelenítés helyett, és az alábbi előnyöket nyújtja, amelyeket a DisplayFormat nem használ:
A böngésző engedélyezheti a HTML5-funkciókat (például naptár vezérlőelem, a területi beállításnak megfelelő pénznemszimbólum, e-mail-hivatkozások stb.)
Alapértelmezés szerint a böngésző a területi beállítások alapján a megfelelő formátumban jeleníti meg az adatokat.
Az
DataTypeattribútum lehetővé teszi, hogy az MVC kiválasztja a megfelelő mezősablont az adatok megjelenítéséhez (haDisplayFormatönmagában használja a sztringsablont).
Megjegyzés:
A jQuery érvényesítése nem működik megfelelően a Range attribútummal és a DateTime. Az alábbi kód például mindig megjelenít egy ügyféloldali érvényesítési hibát, még akkor is, ha a dátum a megadott tartományban van:
[Range(typeof(DateTime), "1/1/1966", "1/1/2020")]
A Range attribútum DateTime használatához le kell tiltania a jQuery dátumérvényesítést. Általában nem tanácsos rögzített dátumokat összeállítani a modellekben, ezért az Range attribútum és a DateTime használata kerülendő.
Az alábbi kód egy sorban egyesíti az attribútumokat:
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; }
}
A sorozat következő részében áttekintjük az alkalmazást, és továbbfejlesztjük az automatikusan létrehozott Details és Delete metódusokat.