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.
Jegyzet
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ó: .NET és .NET Core támogatási szabályzat. Az aktuális kiadást lásd a .NET 9-es verziójú cikkben.
Készítette: Rick Anderson
Ebben a szakaszban a rendszer hozzáadja az érvényesítési logikát a Movie modellhez. Az érvényesítési szabályok akkor lépnek érvénybe, amikor egy felhasználó létrehoz vagy szerkeszt egy filmet.
Érvényesítés
A szoftverfejlesztés egyik legfontosabb alapelve az DRY ("Don'Repeat Ya saját magunk"). Razor Pages ösztönzi a fejlesztést, ahol a funkciók egyszer vannak megadva, és ez az alkalmazás egészében tükröződik. A DRY segíthet:
- Csökkentse az alkalmazásokban lévő kód mennyiségét.
- A kód kisebb hibalehetőséget biztosít, és könnyebben tesztelhetők és karbantarthatóak.
Az Razor Pages and Entity Framework által biztosított érvényesítési támogatás jó példa a DRY elvre:
- Az érvényesítési szabályok deklaratív módon vannak megadva egy helyen, a modellosztályban.
- A szabályok az alkalmazás minden pontján é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();
Érvényesítési szabályok hozzáadása a filmmodellhez
A System.ComponentModel.DataAnnotations névtér a következőt biztosítja:
- Egy osztályra vagy tulajdonságra deklaratív módon alkalmazott beépített érvényesítési attribútumok készlete.
- Formázási attribútumok, például
[DataType], amelyek segítenek a formázásban, és nem biztosítanak semmilyen ellenőrzést.
Frissítse a Movie osztályt, hogy kihasználhassa a beépített [Required], [StringLength], [RegularExpression]és [Range] érvényesítési attribútumokat.
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace RazorPagesMovie.Models;
public class Movie
{
public int Id { get; set; }
[StringLength(60, MinimumLength = 3)]
[Required]
public string Title { get; set; } = string.Empty;
[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; } = string.Empty;
[RegularExpression(@"^[A-Z]+[a-zA-Z0-9""'\s-]*$")]
[StringLength(5)]
[Required]
public string Rating { get; set; } = string.Empty;
}
Az érvényesítési attribútumok a következő modelltulajdonságokon érvényesítendő viselkedést adják meg:
A
[Required]és[MinimumLength]attribútumok azt jelzik, hogy egy tulajdonságnak értékkel kell rendelkeznie. Semmi sem akadályozza meg, hogy a felhasználó üres területre lépjen, hogy megfeleljen ennek az ellenőrzésnek.A
[RegularExpression]attribútummal korlátozható, hogy mely karakterek adhatóak meg. Az előző kódbanGenre:- 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
RegularExpressionRating:- 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 besorolásra, de egy
Genreesetén meghiúsul.
A
[Range]attribútum egy adott tartományon belülre korlátozza az értéket.A
[StringLength]attribútum megadhat egy sztringtulajdonság maximális hosszát, és opcionálisan a minimális hosszát is.Az olyan értéktípusok, mint a
decimal,int,float,DateTime, eredendően kötelezőek, és nincs szükségük a[Required]attribútumra.
Az előző érvényesítési szabályok bemutatásra használatosak, nem optimálisak egy éles rendszerben. Például az előző példa megakadályozza, hogy csak két karakterből álló filmet adjon meg, és nem engedélyezi a speciális karaktereket a Genremezőben.
Az ASP.NET Core által automatikusan kikényszerített érvényesítési szabályok a következőkben segítenek:
- Az alkalmazás robusztusabbá tétele.
- Csökkentse az érvénytelen adatok adatbázisba való mentésének esélyét.
Érvényesítési hiba felhasználói felülete Razor lapokban
Futtassa az alkalmazást, és navigáljon a Lapok/Filmek lapra.
Válassza az Új létrehozása hivatkozást. Töltse ki az űrlapot érvénytelen értékekkel. Amikor a jQuery ügyféloldali ellenőrzése észleli a hibát, hibaüzenet jelenik meg.
Jegyzet
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 érvényesítési hibaüzenetet az érvénytelen értéket tartalmazó mezőkben. A hibák az ügyféloldalon, a JavaScript és a jQuery használatával, valamint a kiszolgálóoldalon is érvénybe lépnek, ha egy felhasználó letiltotta a JavaScriptet.
Jelentős előnye, hogy a létrehozási vagy szerkesztési oldalakon nem volt szükség kódmódosításra. Miután alkalmazták az adatjegyzeteket a modellre, az érvényesítési felhasználói felület engedélyezve lett. Az oktatóanyagban létrehozott Razor lapok automatikusan átvették az érvényesítési szabályokat a Movie modellosztály tulajdonságainak érvényesítési attribútumaival. Tesztelje az érvényesítést a Szerkesztés lapon, ugyanaz az ellenőrzés lesz alkalmazva.
Az űrlapadatok csak akkor kerülnek a kiszolgálóra, ha nincsenek ügyféloldali érvényesítési hibák. Ellenőrizze, hogy az űrlapadatok nem lettek-e elküldve az alábbi bármelyik módszerrel:
- Tegyen egy töréspontot a
OnPostAsyncmetódusba. Küldje el az űrlapot a létrehozása vagy Mentéslehetőséget választva. A töréspont soha nem kerül észlelésre. - Használja a Fiddler eszközt.
- A böngésző fejlesztői eszközeivel figyelheti a hálózati forgalmat.
Kiszolgálóoldali ellenőrzés
Ha a JavaScript le van tiltva a böngészőben, az űrlap hibákkal való elküldése eljut a kiszolgálóhoz.
Nem kötelező, tesztelje a kiszolgálóoldali ellenőrzést:
Tiltsa le a JavaScriptet a böngészőben. A JavaScript letiltható a böngésző fejlesztői eszközeivel. Ha a JavaScript nem tiltható le a böngészőben, próbálkozzon egy másik böngészővel.
Állítson be egy töréspontot a Létrehozás vagy szerkesztés lap
OnPostAsyncmetódusában.Érvénytelen adatokat tartalmazó űrlap elküldése.
Ellenőrizze, hogy a modell állapota érvénytelen-e:
if (!ModelState.IsValid) { return Page(); }
Másik lehetőségként Tiltsa le az ügyféloldali érvényesítést a kiszolgálón.
Az alábbi kód a Create.cshtml lap egy részét mutatja be, amelyet az oktatóanyag korábbi szakaszában láthat. A Lapok létrehozása és szerkesztése a következőre használja:
- A kezdeti űrlap megjelenítése.
- Az űrlap visszajátszása hiba esetén.
<form method="post">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="Movie.Title" class="control-label"></label>
<input asp-for="Movie.Title" class="form-control" />
<span asp-validation-for="Movie.Title" class="text-danger"></span>
</div>
A bemeneticímke-segéd a DataAnnotations attribútumokat használja, és az ügyféloldali jQuery-ellenőrzéshez szükséges HTML-attribútumokat állít elő. Az érvényesítési Tag Helper érvényesítési hibákat jelenít meg. További információt az Érvényesítési című témakörben talál.
A Létrehozás és szerkesztés lapon nincsenek érvényesítési szabályok. Az érvényesítési szabályok és a hibasztringek csak a Movie osztályban vannak megadva. Ezeket az érvényesítési szabályokat a rendszer automatikusan alkalmazza a Razor modellt szerkesztő Movie lapokra.
Ha az érvényesítési logikát módosítani kell, az csak a modellben történik. Az ellenőrzés következetesen érvényesül az alkalmazásban, az érvényesítési logika egy helyen van definiálva. Az egy helyen végzett ellenőrzés segít a kód tisztán tartásában, és megkönnyíti a karbantartást és a frissítést.
DataType-attribútumok használata
Vizsgálja meg a Movie osztályt. A System.ComponentModel.DataAnnotations névtér a beépített érvényesítési attribútumok mellett formázási attribútumokat is biztosít. A [DataType] attribútum a ReleaseDate és Price tulajdonságokra lesz alkalmazva.
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
[Range(1, 100)]
[DataType(DataType.Currency)]
[Column(TypeName = "decimal(18, 2)")]
public decimal Price { get; set; }
A [DataType] attribútumok a következőt biztosítják:
- Tippek a nézetmotor számára az adatok formázásához.
- Olyan attribútumokat biztosít, mint például az URL-címek
<a>és az e-mailek<a href="mailto:EmailAddress.com">.
Az adatok formátumának ellenőrzéséhez használja a [RegularExpression] attribútumot. A [DataType] attribútum az adatbázis belső típusánál pontosabb adattípus megadására szolgál.
[DataType] attribútumok nem érvényesítési attribútumok. A mintaalkalmazásban csak a dátum jelenik meg idő nélkül.
A DataType számbavétel számos adattípust biztosít, például Date, Time, PhoneNumber, Currency, EmailAddressstb.
A [DataType] attribútumok:
- Engedélyezheti, hogy az alkalmazás automatikusan típusspecifikus szolgáltatásokat biztosítson. Például létrehozhat egy
mailto:hivatkozást aDataType.EmailAddress-hez. - HTML5-öt támogató böngészőkben megjelenhet egy dátumválasztó
DataType.Date. - Generáljon HTML 5
data-, ejtse ki úgy, hogy "adatkötőjel" azokat az attribútumokat, amelyeket az HTML 5 böngészők használnak. - Ne adjon meg semmilyen ellenőrzést.
DataType.Date nem adja meg a megjelenített dátum formátumát. Alapértelmezés szerint az adatmező az alapértelmezett formátumok szerint jelenik meg a kiszolgáló CultureInfoalapján.
Az [Column(TypeName = "decimal(18, 2)")] adatjegyzetre van szükség ahhoz, hogy az Entity Framework Core megfelelően le tudja képezni az Price-et az adatbázisban pénznemként. További információ: adattípusok.
A [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ás akkor lesz alkalmazva, amikor az érték szerkesztésre megjelenik. Ez a viselkedés egyes mezők esetében nem feltétlenül szükséges. Például a pénzösszegek esetében a szerkesztési felhasználói felületen általában nincs szükség a pénznem szimbólumára.
A [DisplayFormat] attribútum önmagában is használható, de általában célszerű a [DataType] attribútumot használni. A [DataType] attribútum az adatok szemantikáját közvetíti, szemben a képernyőn való megjelenítés módjával. A [DataType] attribútum a következő előnyöket biztosítja, amelyek nem érhetők el [DisplayFormat]:
- A böngésző engedélyezheti a HTML5-funkciókat, például megjelenítheti a naptár vezérlőelemét, a területi beállításoknak megfelelő pénznemszimbólumot, e-mail-hivatkozásokat 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.
- A
[DataType]attribútum lehetővé teszi a ASP.NET Core-keretrendszer számára, hogy a megfelelő mezősablont válassza ki az adatok megjelenítéséhez. ADisplayFormat, ha önmagában alkalmazzák, a sztring sablont használja.
Megjegyzés: jQuery-ellenőrzés nem működik a [Range] attribútummal és DateTime. Az alábbi kód például mindig egy ügyféloldali érvényesítési hibát jelenít meg, még akkor is, ha a dátum a megadott tartományban van:
[Range(typeof(DateTime), "1/1/1966", "1/1/2020")]
Ajánlott elkerülni a modellekben a nehéz dátumok összeállítását, ezért a [Range] attribútum és a DateTime használata nem ajánlott. Használja a konfigurációs-et dátumtartományokhoz és más olyan értékekhez, amelyek gyakran változnak, ahelyett hogy kódban határozná meg azokat.
Az alábbi kód egy sorban egyesíti az attribútumokat:
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace RazorPagesMovie.Models;
public class Movie
{
public int Id { get; set; }
[StringLength(60, MinimumLength = 3)]
public string Title { get; set; } = string.Empty;
[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; } = string.Empty;
[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; } = string.Empty;
}
Kezdje el a Razor Lapokkal, és a EF Core bemutatja a speciális EF Core műveleteket a Razor Lapokkal.
Migrálások alkalmazása
Az osztályra alkalmazott DataAnnotations megváltoztatja a sémát. Például a Title mezőre alkalmazott DataAnnotations:
[StringLength(60, MinimumLength = 3)]
[Required]
public string Title { get; set; } = string.Empty;
- A karaktereket 60-ra korlátozza.
- Nem engedélyezi
nullértéket.
A Movie tábla jelenleg a következő sémával rendelkezik:
CREATE TABLE [dbo].[Movie] (
[ID] INT IDENTITY (1, 1) NOT NULL,
[Title] NVARCHAR (MAX) NULL,
[ReleaseDate] DATETIME2 (7) NOT NULL,
[Genre] NVARCHAR (MAX) NULL,
[Price] DECIMAL (18, 2) NOT NULL,
[Rating] NVARCHAR (MAX) NULL,
CONSTRAINT [PK_Movie] PRIMARY KEY CLUSTERED ([ID] ASC)
);
Az előző sémamódosítások nem okozzák, hogy az EF kivételt dobjon. Hozzon létre azonban egy migrálást, hogy a séma összhangban legyen a modellel.
Az Eszközök menüben válassza a(z) NuGet Csomagkezelőt, majd a > Csomagkezelő konzolt. A PMC-ben adja meg a következő parancsokat:
Add-Migration New_DataAnnotations
Update-Database
Update-Database a Up osztály New_DataAnnotations metódusát futtatja.
Vizsgálja meg a Up metódust:
public partial class New_DataAnnotations : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AlterColumn<string>(
name: "Title",
table: "Movie",
type: "nvarchar(60)",
maxLength: 60,
nullable: false,
oldClrType: typeof(string),
oldType: "nvarchar(max)");
migrationBuilder.AlterColumn<string>(
name: "Rating",
table: "Movie",
type: "nvarchar(5)",
maxLength: 5,
nullable: false,
oldClrType: typeof(string),
oldType: "nvarchar(max)");
migrationBuilder.AlterColumn<string>(
name: "Genre",
table: "Movie",
type: "nvarchar(30)",
maxLength: 30,
nullable: false,
oldClrType: typeof(string),
oldType: "nvarchar(max)");
}
A frissített Movie táblázat a következő sémával rendelkezik:
CREATE TABLE [dbo].[Movie] (
[ID] INT IDENTITY (1, 1) NOT NULL,
[Title] NVARCHAR (60) NOT NULL,
[ReleaseDate] DATETIME2 (7) NOT NULL,
[Genre] NVARCHAR (30) NOT NULL,
[Price] DECIMAL (18, 2) NOT NULL,
[Rating] NVARCHAR (5) NOT NULL,
CONSTRAINT [PK_Movie] PRIMARY KEY CLUSTERED ([ID] ASC)
);
Közzététel az Azure-ban
Az Azure-ban való üzembe helyezésről további információt az oktatóanyagban talál: ASP.NET Core-alkalmazás létrehozása az Azure-ban SQL Database-.
Köszönjük, hogy befejezte ezt a bevezetést a Razor Pages számára. Kezdje a Razor Lapok használatát, és a EF Core kiválóan kiegészíti ezt az oktatóanyagot.
További erőforrások
- Tag Helperek űrlapokon az ASP.NET Core-ban
- Az ASP.NET Core globalizációja és lokalizációja
- Tag Segédprogramok az ASP.NET Core-ban
- Szerző Tag Segédek az ASP.NET Core-ban
Következő lépések
Ebben a szakaszban a rendszer hozzáadja az érvényesítési logikát a Movie modellhez. Az érvényesítési szabályok akkor lépnek érvénybe, amikor egy felhasználó létrehoz vagy szerkeszt egy filmet.
Érvényesítés
A szoftverfejlesztés egyik legfontosabb alapelve az DRY ("Don'Repeat Ya saját magunk"). Razor Pages ösztönzi a fejlesztést, ahol a funkciók egyszer vannak megadva, és ez az alkalmazás egészében tükröződik. A DRY segíthet:
- Csökkentse az alkalmazásokban lévő kód mennyiségét.
- A kód kisebb hibalehetőséget biztosít, és könnyebben tesztelhetők és karbantarthatóak.
Az Razor Pages and Entity Framework által biztosított érvényesítési támogatás jó példa a DRY elvre:
- Az érvényesítési szabályok deklaratív módon vannak megadva egy helyen, a modellosztályban.
- A szabályok az alkalmazás minden pontján érvénybe lépnek.
Érvényesítési szabályok hozzáadása a filmmodellhez
A System.ComponentModel.DataAnnotations névtér a következőt biztosítja:
- Egy osztályra vagy tulajdonságra deklaratív módon alkalmazott beépített érvényesítési attribútumok készlete.
- Formázási attribútumok, például
[DataType], amelyek segítenek a formázásban, és nem biztosítanak semmilyen ellenőrzést.
Frissítse a Movie osztályt, hogy kihasználhassa a beépített [Required], [StringLength], [RegularExpression]és [Range] érvényesítési attribútumokat.
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace RazorPagesMovie.Models;
public class Movie
{
public int Id { get; set; }
[StringLength(60, MinimumLength = 3)]
[Required]
public string Title { get; set; } = string.Empty;
[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; } = string.Empty;
[RegularExpression(@"^[A-Z]+[a-zA-Z0-9""'\s-]*$")]
[StringLength(5)]
[Required]
public string Rating { get; set; } = string.Empty;
}
Az érvényesítési attribútumok a következő modelltulajdonságokon érvényesítendő viselkedést adják meg:
A
[Required]és[MinimumLength]attribútumok azt jelzik, hogy egy tulajdonságnak értékkel kell rendelkeznie. Semmi sem akadályozza meg, hogy a felhasználó üres területre lépjen, hogy megfeleljen ennek az ellenőrzésnek.A
[RegularExpression]attribútummal korlátozható, hogy mely karakterek adhatóak meg. Az előző kódbanGenre:- 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
RegularExpressionRating:- 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 besorolásra, de egy
Genreesetén meghiúsul.
A
[Range]attribútum egy adott tartományon belülre korlátozza az értéket.A
[StringLength]attribútum megadhat egy sztringtulajdonság maximális hosszát, és opcionálisan a minimális hosszát is.Az olyan értéktípusok, mint a
decimal,int,float,DateTime, eredendően kötelezőek, és nincs szükségük a[Required]attribútumra.
Az előző érvényesítési szabályok bemutatásra használatosak, nem optimálisak egy éles rendszerben. Például az előző példa megakadályozza, hogy csak két karakterből álló filmet adjon meg, és nem engedélyezi a speciális karaktereket a Genremezőben.
Az ASP.NET Core által automatikusan kikényszerített érvényesítési szabályok a következőkben segítenek:
- Az alkalmazás robusztusabbá tétele.
- Csökkentse az érvénytelen adatok adatbázisba való mentésének esélyét.
Érvényesítési hiba felhasználói felülete Razor lapokban
Futtassa az alkalmazást, és navigáljon a Lapok/Filmek lapra.
Válassza az Új létrehozása hivatkozást. Töltse ki az űrlapot érvénytelen értékekkel. Amikor a jQuery ügyféloldali ellenőrzése észleli a hibát, hibaüzenet jelenik meg.
Jegyzet
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 érvényesítési hibaüzenetet az érvénytelen értéket tartalmazó mezőkben. A hibák az ügyféloldalon, a JavaScript és a jQuery használatával, valamint a kiszolgálóoldalon is érvénybe lépnek, ha egy felhasználó letiltotta a JavaScriptet.
Jelentős előnye, hogy a létrehozási vagy szerkesztési oldalakon nem volt szükség kódmódosításra. Miután alkalmazták az adatjegyzeteket a modellre, az érvényesítési felhasználói felület engedélyezve lett. Az oktatóanyagban létrehozott Razor lapok automatikusan átvették az érvényesítési szabályokat a Movie modellosztály tulajdonságainak érvényesítési attribútumaival. Tesztelje az érvényesítést a Szerkesztés lapon, ugyanaz az ellenőrzés lesz alkalmazva.
Az űrlapadatok csak akkor kerülnek a kiszolgálóra, ha nincsenek ügyféloldali érvényesítési hibák. Ellenőrizze, hogy az űrlapadatok nem lettek-e elküldve az alábbi bármelyik módszerrel:
- Tegyen egy töréspontot a
OnPostAsyncmetódusba. Küldje el az űrlapot a létrehozása vagy Mentéslehetőséget választva. A töréspont soha nem kerül észlelésre. - Használja a Fiddler eszközt.
- A böngésző fejlesztői eszközeivel figyelheti a hálózati forgalmat.
Kiszolgálóoldali ellenőrzés
Ha a JavaScript le van tiltva a böngészőben, az űrlap hibákkal való elküldése eljut a kiszolgálóhoz.
Nem kötelező, tesztelje a kiszolgálóoldali ellenőrzést:
Tiltsa le a JavaScriptet a böngészőben. A JavaScript letiltható a böngésző fejlesztői eszközeivel. Ha a JavaScript nem tiltható le a böngészőben, próbálkozzon egy másik böngészővel.
Állítson be egy töréspontot a Létrehozás vagy szerkesztés lap
OnPostAsyncmetódusában.Érvénytelen adatokat tartalmazó űrlap elküldése.
Ellenőrizze, hogy a modell állapota érvénytelen-e:
if (!ModelState.IsValid) { return Page(); }
Másik lehetőségként Tiltsa le az ügyféloldali érvényesítést a kiszolgálón.
Az alábbi kód a Create.cshtml lap egy részét mutatja be, amelyet az oktatóanyag korábbi szakaszában láthat. A Lapok létrehozása és szerkesztése a következőre használja:
- A kezdeti űrlap megjelenítése.
- Az űrlap visszajátszása hiba esetén.
<form method="post">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="Movie.Title" class="control-label"></label>
<input asp-for="Movie.Title" class="form-control" />
<span asp-validation-for="Movie.Title" class="text-danger"></span>
</div>
A bemeneticímke-segéd a DataAnnotations attribútumokat használja, és az ügyféloldali jQuery-ellenőrzéshez szükséges HTML-attribútumokat állít elő. Az érvényesítési Tag Helper érvényesítési hibákat jelenít meg. További információt az Érvényesítési című témakörben talál.
A Létrehozás és szerkesztés lapon nincsenek érvényesítési szabályok. Az érvényesítési szabályok és a hibasztringek csak a Movie osztályban vannak megadva. Ezeket az érvényesítési szabályokat a rendszer automatikusan alkalmazza a Razor modellt szerkesztő Movie lapokra.
Ha az érvényesítési logikát módosítani kell, az csak a modellben történik. Az ellenőrzés következetesen érvényesül az alkalmazásban, az érvényesítési logika egy helyen van definiálva. Az egy helyen végzett ellenőrzés segít a kód tisztán tartásában, és megkönnyíti a karbantartást és a frissítést.
DataType-attribútumok használata
Vizsgálja meg a Movie osztályt. A System.ComponentModel.DataAnnotations névtér a beépített érvényesítési attribútumok mellett formázási attribútumokat is biztosít. A [DataType] attribútum a ReleaseDate és Price tulajdonságokra lesz alkalmazva.
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
[Range(1, 100)]
[DataType(DataType.Currency)]
[Column(TypeName = "decimal(18, 2)")]
public decimal Price { get; set; }
A [DataType] attribútumok a következőt biztosítják:
- Tippek a nézetmotor számára az adatok formázásához.
- Olyan attribútumokat biztosít, mint például az URL-címek
<a>és az e-mailek<a href="mailto:EmailAddress.com">.
Az adatok formátumának ellenőrzéséhez használja a [RegularExpression] attribútumot. A [DataType] attribútum az adatbázis belső típusánál pontosabb adattípus megadására szolgál.
[DataType] attribútumok nem érvényesítési attribútumok. A mintaalkalmazásban csak a dátum jelenik meg idő nélkül.
A DataType számbavétel számos adattípust biztosít, például Date, Time, PhoneNumber, Currency, EmailAddressstb.
A [DataType] attribútumok:
- Engedélyezheti, hogy az alkalmazás automatikusan típusspecifikus szolgáltatásokat biztosítson. Például létrehozhat egy
mailto:hivatkozást aDataType.EmailAddress-hez. - HTML5-öt támogató böngészőkben megjelenhet egy dátumválasztó
DataType.Date. - Generáljon HTML 5
data-, ejtse ki úgy, hogy "adatkötőjel" azokat az attribútumokat, amelyeket az HTML 5 böngészők használnak. - Ne adjon meg semmilyen ellenőrzést.
DataType.Date nem adja meg a megjelenített dátum formátumát. Alapértelmezés szerint az adatmező az alapértelmezett formátumok szerint jelenik meg a kiszolgáló CultureInfoalapján.
Az [Column(TypeName = "decimal(18, 2)")] adatjegyzetre van szükség ahhoz, hogy az Entity Framework Core megfelelően le tudja képezni az Price-et az adatbázisban pénznemként. További információ: adattípusok.
A [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ás akkor lesz alkalmazva, amikor az érték szerkesztésre megjelenik. Ez a viselkedés egyes mezők esetében nem feltétlenül szükséges. Például a pénzösszegek esetében a szerkesztési felhasználói felületen általában nincs szükség a pénznem szimbólumára.
A [DisplayFormat] attribútum önmagában is használható, de általában célszerű a [DataType] attribútumot használni. A [DataType] attribútum az adatok szemantikáját közvetíti, szemben a képernyőn való megjelenítés módjával. A [DataType] attribútum a következő előnyöket biztosítja, amelyek nem érhetők el [DisplayFormat]:
- A böngésző engedélyezheti a HTML5-funkciókat, például megjelenítheti a naptár vezérlőelemét, a területi beállításoknak megfelelő pénznemszimbólumot, e-mail-hivatkozásokat 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.
- A
[DataType]attribútum lehetővé teszi a ASP.NET Core-keretrendszer számára, hogy a megfelelő mezősablont válassza ki az adatok megjelenítéséhez. ADisplayFormat, ha önmagában alkalmazzák, a sztring sablont használja.
Megjegyzés: jQuery-ellenőrzés nem működik a [Range] attribútummal és DateTime. Az alábbi kód például mindig egy ügyféloldali érvényesítési hibát jelenít meg, még akkor is, ha a dátum a megadott tartományban van:
[Range(typeof(DateTime), "1/1/1966", "1/1/2020")]
Ajánlott elkerülni a modellekben a nehéz dátumok összeállítását, ezért a [Range] attribútum és a DateTime használata nem ajánlott. Használja a konfigurációs-et dátumtartományokhoz és más olyan értékekhez, amelyek gyakran változnak, ahelyett hogy kódban határozná meg azokat.
Az alábbi kód egy sorban egyesíti az attribútumokat:
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace RazorPagesMovie.Models;
public class Movie
{
public int Id { get; set; }
[StringLength(60, MinimumLength = 3)]
public string Title { get; set; } = string.Empty;
[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; } = string.Empty;
[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; } = string.Empty;
}
Kezdje el a Razor Lapokkal, és a EF Core bemutatja a speciális EF Core műveleteket a Razor Lapokkal.
Migrálások alkalmazása
Az osztályra alkalmazott DataAnnotations megváltoztatja a sémát. Például a Title mezőre alkalmazott DataAnnotations:
[StringLength(60, MinimumLength = 3)]
[Required]
public string Title { get; set; } = string.Empty;
- A karaktereket 60-ra korlátozza.
- Nem engedélyezi
nullértéket.
A Movie tábla jelenleg a következő sémával rendelkezik:
CREATE TABLE [dbo].[Movie] (
[ID] INT IDENTITY (1, 1) NOT NULL,
[Title] NVARCHAR (MAX) NULL,
[ReleaseDate] DATETIME2 (7) NOT NULL,
[Genre] NVARCHAR (MAX) NULL,
[Price] DECIMAL (18, 2) NOT NULL,
[Rating] NVARCHAR (MAX) NULL,
CONSTRAINT [PK_Movie] PRIMARY KEY CLUSTERED ([ID] ASC)
);
Az előző sémamódosítások nem okozzák, hogy az EF kivételt dobjon. Hozzon létre azonban egy migrálást, hogy a séma összhangban legyen a modellel.
Az Eszközök menüben válassza a(z) NuGet Csomagkezelőt, majd a > Csomagkezelő konzolt. A PMC-ben adja meg a következő parancsokat:
Add-Migration New_DataAnnotations
Update-Database
Update-Database a Up osztály New_DataAnnotations metódusát futtatja.
Vizsgálja meg a Up metódust:
public partial class New_DataAnnotations : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AlterColumn<string>(
name: "Title",
table: "Movie",
type: "nvarchar(60)",
maxLength: 60,
nullable: false,
oldClrType: typeof(string),
oldType: "nvarchar(max)");
migrationBuilder.AlterColumn<string>(
name: "Rating",
table: "Movie",
type: "nvarchar(5)",
maxLength: 5,
nullable: false,
oldClrType: typeof(string),
oldType: "nvarchar(max)");
migrationBuilder.AlterColumn<string>(
name: "Genre",
table: "Movie",
type: "nvarchar(30)",
maxLength: 30,
nullable: false,
oldClrType: typeof(string),
oldType: "nvarchar(max)");
}
A frissített Movie táblázat a következő sémával rendelkezik:
CREATE TABLE [dbo].[Movie] (
[ID] INT IDENTITY (1, 1) NOT NULL,
[Title] NVARCHAR (60) NOT NULL,
[ReleaseDate] DATETIME2 (7) NOT NULL,
[Genre] NVARCHAR (30) NOT NULL,
[Price] DECIMAL (18, 2) NOT NULL,
[Rating] NVARCHAR (5) NOT NULL,
CONSTRAINT [PK_Movie] PRIMARY KEY CLUSTERED ([ID] ASC)
);
Közzététel az Azure-ban
Az Azure-ban való üzembe helyezésről további információt az oktatóanyagban talál: ASP.NET Core-alkalmazás létrehozása az Azure-ban SQL Database-.
Köszönjük, hogy befejezte ezt a bevezetést a Razor Pages számára. Kezdje a Razor Lapok használatát, és a EF Core kiválóan kiegészíti ezt az oktatóanyagot.
További erőforrások
- Tag Helperek űrlapokon az ASP.NET Core-ban
- Az ASP.NET Core globalizációja és lokalizációja
- Tag Segédprogramok az ASP.NET Core-ban
- Szerző Tag Segédek az ASP.NET Core-ban
Következő lépések
Ebben a szakaszban a rendszer hozzáadja az érvényesítési logikát a Movie modellhez. Az érvényesítési szabályok akkor lépnek érvénybe, amikor egy felhasználó létrehoz vagy szerkeszt egy filmet.
Érvényesítés
A szoftverfejlesztés egyik legfontosabb alapelve az DRY ("Don'Repeat Ya saját magunk"). Razor Pages ösztönzi a fejlesztést, ahol a funkciók egyszer vannak megadva, és ez az alkalmazás egészében tükröződik. A DRY segíthet:
- Csökkentse az alkalmazásokban lévő kód mennyiségét.
- A kód kisebb hibalehetőséget biztosít, és könnyebben tesztelhetők és karbantarthatóak.
Az Razor Pages and Entity Framework által biztosított érvényesítési támogatás jó példa a DRY elvre:
- Az érvényesítési szabályok deklaratív módon vannak megadva egy helyen, a modellosztályban.
- A szabályok az alkalmazás minden pontján érvénybe lépnek.
Érvényesítési szabályok hozzáadása a filmmodellhez
A System.ComponentModel.DataAnnotations névtér a következőt biztosítja:
- Egy osztályra vagy tulajdonságra deklaratív módon alkalmazott beépített érvényesítési attribútumok készlete.
- Formázási attribútumok, például
[DataType], amelyek segítenek a formázásban, és nem biztosítanak semmilyen ellenőrzést.
Frissítse a Movie osztályt, hogy kihasználhassa a beépített [Required], [StringLength], [RegularExpression]és [Range] érvényesítési attribútumokat.
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace RazorPagesMovie.Models;
public class Movie
{
public int Id { get; set; }
[StringLength(60, MinimumLength = 3)]
[Required]
public string Title { get; set; } = string.Empty;
// [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; } = string.Empty;
[RegularExpression(@"^[A-Z]+[a-zA-Z0-9""'\s-]*$")]
[StringLength(5)]
[Required]
public string Rating { get; set; } = string.Empty;
}
Az érvényesítési attribútumok a következő modelltulajdonságokon érvényesítendő viselkedést adják meg:
A
[Required]és[MinimumLength]attribútumok azt jelzik, hogy egy tulajdonságnak értékkel kell rendelkeznie. Semmi sem akadályozza meg, hogy a felhasználó üres területre lépjen, hogy megfeleljen ennek az ellenőrzésnek.A
[RegularExpression]attribútummal korlátozható, hogy mely karakterek adhatóak meg. Az előző kódbanGenre:- 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
RegularExpressionRating:- 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 besorolásra, de egy
Genreesetén meghiúsul.
A
[Range]attribútum egy adott tartományon belülre korlátozza az értéket.A
[StringLength]attribútum megadhat egy sztringtulajdonság maximális hosszát, és opcionálisan a minimális hosszát is.Az olyan értéktípusok, mint a
decimal,int,float,DateTime, eredendően kötelezőek, és nincs szükségük a[Required]attribútumra.
Az előző érvényesítési szabályok bemutatásra használatosak, nem optimálisak egy éles rendszerben. Például az előző példa megakadályozza, hogy csak két karakterből álló filmet adjon meg, és nem engedélyezi a speciális karaktereket a Genremezőben.
Az ASP.NET Core által automatikusan kikényszerített érvényesítési szabályok a következőkben segítenek:
- Az alkalmazás robusztusabbá tétele.
- Csökkentse az érvénytelen adatok adatbázisba való mentésének esélyét.
Érvényesítési hiba felhasználói felülete Razor lapokban
Futtassa az alkalmazást, és navigáljon a Lapok/Filmek lapra.
Válassza az Új létrehozása hivatkozást. Töltse ki az űrlapot érvénytelen értékekkel. Amikor a jQuery ügyféloldali ellenőrzése észleli a hibát, hibaüzenet jelenik meg.
Jegyzet
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 érvényesítési hibaüzenetet az érvénytelen értéket tartalmazó mezőkben. A hibák az ügyféloldalon, a JavaScript és a jQuery használatával, valamint a kiszolgálóoldalon is érvénybe lépnek, ha egy felhasználó letiltotta a JavaScriptet.
Jelentős előnye, hogy a létrehozási vagy szerkesztési oldalakon nem volt szükség kódmódosításra. Miután alkalmazták az adatjegyzeteket a modellre, az érvényesítési felhasználói felület engedélyezve lett. Az oktatóanyagban létrehozott Razor lapok automatikusan átvették az érvényesítési szabályokat a Movie modellosztály tulajdonságainak érvényesítési attribútumaival. Tesztelje az érvényesítést a Szerkesztés lapon, ugyanaz az ellenőrzés lesz alkalmazva.
Az űrlapadatok csak akkor kerülnek a kiszolgálóra, ha nincsenek ügyféloldali érvényesítési hibák. Ellenőrizze, hogy az űrlapadatok nem lettek-e elküldve az alábbi bármelyik módszerrel:
- Tegyen egy töréspontot a
OnPostAsyncmetódusba. Küldje el az űrlapot a létrehozása vagy Mentéslehetőséget választva. A töréspont soha nem kerül észlelésre. - Használja a Fiddler eszközt.
- A böngésző fejlesztői eszközeivel figyelheti a hálózati forgalmat.
Kiszolgálóoldali ellenőrzés
Ha a JavaScript le van tiltva a böngészőben, az űrlap hibákkal való elküldése eljut a kiszolgálóhoz.
Nem kötelező, tesztelje a kiszolgálóoldali ellenőrzést:
Tiltsa le a JavaScriptet a böngészőben. A JavaScript letiltható a böngésző fejlesztői eszközeivel. Ha a JavaScript nem tiltható le a böngészőben, próbálkozzon egy másik böngészővel.
Állítson be egy töréspontot a Létrehozás vagy szerkesztés lap
OnPostAsyncmetódusában.Érvénytelen adatokat tartalmazó űrlap elküldése.
Ellenőrizze, hogy a modell állapota érvénytelen-e:
if (!ModelState.IsValid) { return Page(); }
Másik lehetőségként Tiltsa le az ügyféloldali érvényesítést a kiszolgálón.
Az alábbi kód a Create.cshtml lap egy részét mutatja be, amelyet az oktatóanyag korábbi szakaszában láthat. A Lapok létrehozása és szerkesztése a következőre használja:
- A kezdeti űrlap megjelenítése.
- Az űrlap visszajátszása hiba esetén.
<form method="post">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="Movie.Title" class="control-label"></label>
<input asp-for="Movie.Title" class="form-control" />
<span asp-validation-for="Movie.Title" class="text-danger"></span>
</div>
A bemeneticímke-segéd a DataAnnotations attribútumokat használja, és az ügyféloldali jQuery-ellenőrzéshez szükséges HTML-attribútumokat állít elő. Az érvényesítési Tag Helper érvényesítési hibákat jelenít meg. További információt az Érvényesítési című témakörben talál.
A Létrehozás és szerkesztés lapon nincsenek érvényesítési szabályok. Az érvényesítési szabályok és a hibasztringek csak a Movie osztályban vannak megadva. Ezeket az érvényesítési szabályokat a rendszer automatikusan alkalmazza a Razor modellt szerkesztő Movie lapokra.
Ha az érvényesítési logikát módosítani kell, az csak a modellben történik. Az ellenőrzés következetesen érvényesül az alkalmazásban, az érvényesítési logika egy helyen van definiálva. Az egy helyen végzett ellenőrzés segít a kód tisztán tartásában, és megkönnyíti a karbantartást és a frissítést.
DataType-attribútumok használata
Vizsgálja meg a Movie osztályt. A System.ComponentModel.DataAnnotations névtér a beépített érvényesítési attribútumok mellett formázási attribútumokat is biztosít. A [DataType] attribútum a ReleaseDate és Price tulajdonságokra lesz alkalmazva.
// [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; }
A [DataType] attribútumok a következőt biztosítják:
- Tippek a nézetmotor számára az adatok formázásához.
- Olyan attribútumokat biztosít, mint például az URL-címek
<a>és az e-mailek<a href="mailto:EmailAddress.com">.
Az adatok formátumának ellenőrzéséhez használja a [RegularExpression] attribútumot. A [DataType] attribútum az adatbázis belső típusánál pontosabb adattípus megadására szolgál.
[DataType] attribútumok nem érvényesítési attribútumok. A mintaalkalmazásban csak a dátum jelenik meg idő nélkül.
A DataType számbavétel számos adattípust biztosít, például Date, Time, PhoneNumber, Currency, EmailAddressstb.
A [DataType] attribútumok:
- Engedélyezheti, hogy az alkalmazás automatikusan típusspecifikus szolgáltatásokat biztosítson. Például létrehozhat egy
mailto:hivatkozást aDataType.EmailAddress-hez. - HTML5-öt támogató böngészőkben megjelenhet egy dátumválasztó
DataType.Date. - Generáljon HTML 5
data-, ejtse ki úgy, hogy "adatkötőjel" azokat az attribútumokat, amelyeket az HTML 5 böngészők használnak. - Ne adjon meg semmilyen ellenőrzést.
DataType.Date nem adja meg a megjelenített dátum formátumát. Alapértelmezés szerint az adatmező az alapértelmezett formátumok szerint jelenik meg a kiszolgáló CultureInfoalapján.
Az [Column(TypeName = "decimal(18, 2)")] adatjegyzetre van szükség ahhoz, hogy az Entity Framework Core megfelelően le tudja képezni az Price-et az adatbázisban pénznemként. További információ: adattípusok.
A [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ás akkor lesz alkalmazva, amikor az érték szerkesztésre megjelenik. Ez a viselkedés egyes mezők esetében nem feltétlenül szükséges. Például a pénzösszegek esetében a szerkesztési felhasználói felületen általában nincs szükség a pénznem szimbólumára.
A [DisplayFormat] attribútum önmagában is használható, de általában célszerű a [DataType] attribútumot használni. A [DataType] attribútum az adatok szemantikáját közvetíti, szemben a képernyőn való megjelenítés módjával. A [DataType] attribútum a következő előnyöket biztosítja, amelyek nem érhetők el [DisplayFormat]:
- A böngésző engedélyezheti a HTML5-funkciókat, például megjelenítheti a naptár vezérlőelemét, a területi beállításoknak megfelelő pénznemszimbólumot, e-mail-hivatkozásokat 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.
- A
[DataType]attribútum lehetővé teszi a ASP.NET Core-keretrendszer számára, hogy a megfelelő mezősablont válassza ki az adatok megjelenítéséhez. ADisplayFormat, ha önmagában alkalmazzák, a sztring sablont használja.
Megjegyzés: jQuery-ellenőrzés nem működik a [Range] attribútummal és DateTime. Az alábbi kód például mindig egy ügyféloldali érvényesítési hibát jelenít meg, még akkor is, ha a dátum a megadott tartományban van:
[Range(typeof(DateTime), "1/1/1966", "1/1/2020")]
Ajánlott elkerülni a modellekben a nehéz dátumok összeállítását, ezért a [Range] attribútum és a DateTime használata nem ajánlott. Használja a konfigurációs-et dátumtartományokhoz és más olyan értékekhez, amelyek gyakran változnak, ahelyett hogy kódban határozná meg azokat.
Az alábbi kód egy sorban egyesíti az attribútumokat:
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace RazorPagesMovie.Models;
public class Movie
{
public int Id { get; set; }
[StringLength(60, MinimumLength = 3)]
public string Title { get; set; } = string.Empty;
[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; } = string.Empty;
[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; } = string.Empty;
}
Kezdje el a Razor Lapokkal, és a EF Core bemutatja a speciális EF Core műveleteket a Razor Lapokkal.
Migrálások alkalmazása
Az osztályra alkalmazott DataAnnotations megváltoztatja a sémát. Például a Title mezőre alkalmazott DataAnnotations:
[StringLength(60, MinimumLength = 3)]
[Required]
public string Title { get; set; } = string.Empty;
- A karaktereket 60-ra korlátozza.
- Nem engedélyezi
nullértéket.
A Movie tábla jelenleg a következő sémával rendelkezik:
CREATE TABLE [dbo].[Movie] (
[ID] INT IDENTITY (1, 1) NOT NULL,
[Title] NVARCHAR (MAX) NULL,
[ReleaseDate] DATETIME2 (7) NOT NULL,
[Genre] NVARCHAR (MAX) NULL,
[Price] DECIMAL (18, 2) NOT NULL,
[Rating] NVARCHAR (MAX) NULL,
CONSTRAINT [PK_Movie] PRIMARY KEY CLUSTERED ([ID] ASC)
);
Az előző sémamódosítások nem okozzák, hogy az EF kivételt dobjon. Hozzon létre azonban egy migrálást, hogy a séma összhangban legyen a modellel.
Az Eszközök menüben válassza a(z) NuGet Csomagkezelőt, majd a > Csomagkezelő konzolt. A PMC-ben adja meg a következő parancsokat:
Add-Migration New_DataAnnotations
Update-Database
Update-Database a Up osztály New_DataAnnotations metódusát futtatja.
Vizsgálja meg a Up metódust:
public partial class NewDataAnnotations : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AlterColumn<string>(
name: "Title",
table: "Movie",
type: "nvarchar(60)",
maxLength: 60,
nullable: false,
oldClrType: typeof(string),
oldType: "nvarchar(max)");
migrationBuilder.AlterColumn<string>(
name: "Rating",
table: "Movie",
type: "nvarchar(5)",
maxLength: 5,
nullable: false,
oldClrType: typeof(string),
oldType: "nvarchar(max)");
migrationBuilder.AlterColumn<string>(
name: "Genre",
table: "Movie",
type: "nvarchar(30)",
maxLength: 30,
nullable: false,
oldClrType: typeof(string),
oldType: "nvarchar(max)");
}
A frissített Movie táblázat a következő sémával rendelkezik:
CREATE TABLE [dbo].[Movie] (
[ID] INT IDENTITY (1, 1) NOT NULL,
[Title] NVARCHAR (60) NOT NULL,
[ReleaseDate] DATETIME2 (7) NOT NULL,
[Genre] NVARCHAR (30) NOT NULL,
[Price] DECIMAL (18, 2) NOT NULL,
[Rating] NVARCHAR (5) NOT NULL,
CONSTRAINT [PK_Movie] PRIMARY KEY CLUSTERED ([ID] ASC)
);
Közzététel az Azure-ban
Az Azure-ban való üzembe helyezésről további információt az oktatóanyagban talál: ASP.NET Core-alkalmazás létrehozása az Azure-ban SQL Database-.
Köszönjük, hogy befejezte ezt a bevezetést a Razor Pages számára. Kezdje a Razor Lapok használatát, és a EF Core kiválóan kiegészíti ezt az oktatóanyagot.
További erőforrások
- Tag Helperek űrlapokon az ASP.NET Core-ban
- Az ASP.NET Core globalizációja és lokalizációja
- Tag Segédprogramok az ASP.NET Core-ban
- Szerző Tag Segédek az ASP.NET Core-ban
Következő lépések
Ebben a szakaszban a rendszer hozzáadja az érvényesítési logikát a Movie modellhez. Az érvényesítési szabályok akkor lépnek érvénybe, amikor egy felhasználó létrehoz vagy szerkeszt egy filmet.
Érvényesítés
A szoftverfejlesztés egyik legfontosabb alapelve az DRY ("Don'Repeat Ya saját magunk"). Razor Pages ösztönzi a fejlesztést, ahol a funkciók egyszer vannak megadva, és ez az alkalmazás egészében tükröződik. A DRY segíthet:
- Csökkentse az alkalmazásokban lévő kód mennyiségét.
- A kód kisebb hibalehetőséget biztosít, és könnyebben tesztelhetők és karbantarthatóak.
Az Razor Pages and Entity Framework által biztosított érvényesítési támogatás jó példa a DRY elvre:
- Az érvényesítési szabályok deklaratív módon vannak megadva egy helyen, a modellosztályban.
- A szabályok az alkalmazás minden pontján érvénybe lépnek.
Érvényesítési szabályok hozzáadása a filmmodellhez
A System.ComponentModel.DataAnnotations névtér a következőt biztosítja:
- Egy osztályra vagy tulajdonságra deklaratív módon alkalmazott beépített érvényesítési attribútumok készlete.
- Formázási attribútumok, például
[DataType], amelyek segítenek a formázásban, és nem biztosítanak semmilyen ellenőrzést.
Frissítse a Movie osztályt, hogy kihasználhassa a beépített [Required], [StringLength], [RegularExpression]és [Range] érvényesítési attribútumokat.
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace RazorPagesMovie.Models
{
public class Movie
{
public int ID { get; set; }
[StringLength(60, MinimumLength = 3)]
[Required]
public string Title { get; set; } = string.Empty;
[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; } = string.Empty;
[RegularExpression(@"^[A-Z]+[a-zA-Z0-9""'\s-]*$")]
[StringLength(5)]
[Required]
public string Rating { get; set; } = string.Empty;
}
}
Az érvényesítési attribútumok a következő modelltulajdonságokon érvényesítendő viselkedést adják meg:
A
[Required]és[MinimumLength]attribútumok azt jelzik, hogy egy tulajdonságnak értékkel kell rendelkeznie. Semmi sem akadályozza meg, hogy a felhasználó üres területre lépjen, hogy megfeleljen ennek az ellenőrzésnek.A
[RegularExpression]attribútummal korlátozható, hogy mely karakterek adhatóak meg. Az előző kódbanGenre:- 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
RegularExpressionRating:- 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 besorolásra, de egy
Genreesetén meghiúsul.
A
[Range]attribútum egy adott tartományon belülre korlátozza az értéket.A
[StringLength]attribútum megadhat egy sztringtulajdonság maximális hosszát, és opcionálisan a minimális hosszát is.Az olyan értéktípusok, mint a
decimal,int,float,DateTime, eredendően kötelezőek, és nincs szükségük a[Required]attribútumra.
Az előző érvényesítési szabályok bemutatásra használatosak, nem optimálisak egy éles rendszerben. Például az előző példa megakadályozza, hogy csak két karakterből álló filmet adjon meg, és nem engedélyezi a speciális karaktereket a Genremezőben.
Az ASP.NET Core által automatikusan kikényszerített érvényesítési szabályok a következőkben segítenek:
- Az alkalmazás robusztusabbá tétele.
- Csökkentse az érvénytelen adatok adatbázisba való mentésének esélyét.
Érvényesítési hiba felhasználói felülete Razor lapokban
Futtassa az alkalmazást, és navigáljon a Lapok/Filmek lapra.
Válassza az Új létrehozása hivatkozást. Töltse ki az űrlapot érvénytelen értékekkel. Amikor a jQuery ügyféloldali ellenőrzése észleli a hibát, hibaüzenet jelenik meg.
Jegyzet
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 érvényesítési hibaüzenetet az érvénytelen értéket tartalmazó mezőkben. A hibák az ügyféloldalon, a JavaScript és a jQuery használatával, valamint a kiszolgálóoldalon is érvénybe lépnek, ha egy felhasználó letiltotta a JavaScriptet.
Jelentős előnye, hogy a létrehozási vagy szerkesztési oldalakon nem volt szükség kódmódosításra. Miután alkalmazták az adatjegyzeteket a modellre, az érvényesítési felhasználói felület engedélyezve lett. Az oktatóanyagban létrehozott Razor lapok automatikusan átvették az érvényesítési szabályokat a Movie modellosztály tulajdonságainak érvényesítési attribútumaival. Tesztelje az érvényesítést a Szerkesztés lapon, ugyanaz az ellenőrzés lesz alkalmazva.
Az űrlapadatok csak akkor kerülnek a kiszolgálóra, ha nincsenek ügyféloldali érvényesítési hibák. Ellenőrizze, hogy az űrlapadatok nem lettek-e elküldve az alábbi bármelyik módszerrel:
- Tegyen egy töréspontot a
OnPostAsyncmetódusba. Küldje el az űrlapot a létrehozása vagy Mentéslehetőséget választva. A töréspont soha nem kerül észlelésre. - Használja a Fiddler eszközt.
- A böngésző fejlesztői eszközeivel figyelheti a hálózati forgalmat.
Kiszolgálóoldali ellenőrzés
Ha a JavaScript le van tiltva a böngészőben, az űrlap hibákkal való elküldése eljut a kiszolgálóhoz.
Nem kötelező, tesztelje a kiszolgálóoldali ellenőrzést:
Tiltsa le a JavaScriptet a böngészőben. A JavaScript letiltható a böngésző fejlesztői eszközeivel. Ha nem tudja letiltani a JavaScriptet a böngészőben, próbálkozzon egy másik böngészővel.
Állítson be egy töréspontot a Létrehozás vagy szerkesztés lap
OnPostAsyncmetódusában.Érvénytelen adatokat tartalmazó űrlap elküldése.
Ellenőrizze, hogy a modell állapota érvénytelen-e:
if (!ModelState.IsValid) { return Page(); }
Másik lehetőségként Tiltsa le az ügyféloldali érvényesítést a kiszolgálón.
Az alábbi kód a Create.cshtml lap egy részét mutatja be, amelyet az oktatóanyag korábbi szakaszában láthat. A Lapok létrehozása és szerkesztése a következőre használja:
- A kezdeti űrlap megjelenítése.
- Az űrlap visszajátszása hiba esetén.
<form method="post">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="Movie.Title" class="control-label"></label>
<input asp-for="Movie.Title" class="form-control" />
<span asp-validation-for="Movie.Title" class="text-danger"></span>
</div>
A bemeneticímke-segéd a DataAnnotations attribútumokat használja, és az ügyféloldali jQuery-ellenőrzéshez szükséges HTML-attribútumokat állít elő. Az érvényesítési Tag Helper érvényesítési hibákat jelenít meg. További információt az Érvényesítési című témakörben talál.
A Létrehozás és szerkesztés lapon nincsenek érvényesítési szabályok. Az érvényesítési szabályok és a hibasztringek csak a Movie osztályban vannak megadva. Ezeket az érvényesítési szabályokat a rendszer automatikusan alkalmazza a Razor modellt szerkesztő Movie lapokra.
Ha az érvényesítési logikát módosítani kell, az csak a modellben történik. Az ellenőrzés következetesen érvényesül az alkalmazás egészében, az érvényesítési logika egy helyen van definiálva. Az egy helyen végzett ellenőrzés segít a kód tisztán tartásában, és megkönnyíti a karbantartást és a frissítést.
DataType-attribútumok használata
Vizsgálja meg a Movie osztályt. A System.ComponentModel.DataAnnotations névtér a beépített érvényesítési attribútumok mellett formázási attribútumokat is biztosít. A [DataType] attribútum a ReleaseDate és Price tulajdonságokra lesz alkalmazva.
[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; }
A [DataType] attribútumok a következőt biztosítják:
- Tippek a nézetmotor számára az adatok formázásához.
- Olyan attribútumokat biztosít, mint például az URL-címek
<a>és az e-mailek<a href="mailto:EmailAddress.com">.
Az adatok formátumának ellenőrzéséhez használja a [RegularExpression] attribútumot. A [DataType] attribútum az adatbázis belső típusánál pontosabb adattípus megadására szolgál.
[DataType] attribútumok nem érvényesítési attribútumok. A mintaalkalmazásban csak a dátum jelenik meg idő nélkül.
A DataType számbavétel számos adattípust biztosít, például Date, Time, PhoneNumber, Currency, EmailAddressstb.
A [DataType] attribútumok:
- Engedélyezheti, hogy az alkalmazás automatikusan típusspecifikus szolgáltatásokat biztosítson. Például létrehozhat egy
mailto:hivatkozást aDataType.EmailAddress-hez. - HTML5-öt támogató böngészőkben megjelenhet egy dátumválasztó
DataType.Date. - Generáljon HTML 5
data-, ejtse ki úgy, hogy "adatkötőjel" azokat az attribútumokat, amelyeket az HTML 5 böngészők használnak. - Ne adjon meg semmilyen ellenőrzést.
DataType.Date nem adja meg a megjelenített dátum formátumát. Alapértelmezés szerint az adatmező az alapértelmezett formátumok szerint jelenik meg a kiszolgáló CultureInfoalapján.
Az [Column(TypeName = "decimal(18, 2)")] adatjegyzetre van szükség ahhoz, hogy az Entity Framework Core megfelelően le tudja képezni az Price-et az adatbázisban pénznemként. További információ: adattípusok.
A [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ás akkor lesz alkalmazva, amikor az érték szerkesztésre megjelenik. Ez a viselkedés egyes mezők esetében nem feltétlenül szükséges. Például a pénzösszegek esetében a szerkesztési felhasználói felületen általában nincs szükség a pénznem szimbólumára.
A [DisplayFormat] attribútum önmagában is használható, de általában célszerű a [DataType] attribútumot használni. A [DataType] attribútum az adatok szemantikáját közvetíti, szemben a képernyőn való megjelenítés módjával. A [DataType] attribútum a következő előnyöket biztosítja, amelyek nem érhetők el [DisplayFormat]:
- A böngésző engedélyezheti a HTML5-funkciókat, például megjelenítheti a naptár vezérlőelemét, a területi beállításoknak megfelelő pénznemszimbólumot, e-mail-hivatkozásokat 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.
- A
[DataType]attribútum lehetővé teszi a ASP.NET Core-keretrendszer számára, hogy a megfelelő mezősablont válassza ki az adatok megjelenítéséhez. ADisplayFormat, ha önmagában alkalmazzák, a sztring sablont használja.
Megjegyzés: jQuery-ellenőrzés nem működik a [Range] attribútummal és DateTime. Az alábbi kód például mindig egy ügyféloldali érvényesítési hibát jelenít meg, még akkor is, ha a dátum a megadott tartományban van:
[Range(typeof(DateTime), "1/1/1966", "1/1/2020")]
Ajánlott elkerülni a modellekben a nehéz dátumok összeállítását, ezért a [Range] attribútum és a DateTime használata nem ajánlott. Használja a konfigurációs-et dátumtartományokhoz és más olyan értékekhez, amelyek gyakran változnak, ahelyett hogy kódban határozná meg azokat.
Az alábbi kód egy sorban egyesíti az attribútumokat:
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace RazorPagesMovie.Models
{
public class Movie
{
public int ID { get; set; }
[StringLength(60, MinimumLength = 3)]
public string Title { get; set; } = string.Empty;
[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; } = string.Empty;
[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; } = string.Empty;
}
}
Kezdje el a Razor Lapokkal, és a EF Core bemutatja a speciális EF Core műveleteket a Razor Lapokkal.
Migrálások alkalmazása
Az osztályra alkalmazott DataAnnotations megváltoztatja a sémát. Például a Title mezőre alkalmazott DataAnnotations:
[StringLength(60, MinimumLength = 3)]
[Required]
public string Title { get; set; } = string.Empty;
- A karaktereket 60-ra korlátozza.
- Nem engedélyezi
nullértéket.
A Movie tábla jelenleg a következő sémával rendelkezik:
CREATE TABLE [dbo].[Movie] (
[ID] INT IDENTITY (1, 1) NOT NULL,
[Title] NVARCHAR (MAX) NULL,
[ReleaseDate] DATETIME2 (7) NOT NULL,
[Genre] NVARCHAR (MAX) NULL,
[Price] DECIMAL (18, 2) NOT NULL,
[Rating] NVARCHAR (MAX) NULL,
CONSTRAINT [PK_Movie] PRIMARY KEY CLUSTERED ([ID] ASC)
);
Az előző sémamódosítások nem okozzák, hogy az EF kivételt dobjon. Hozzon létre azonban egy migrálást, hogy a séma összhangban legyen a modellel.
Az Eszközök menüben válassza a(z) NuGet Csomagkezelőt, majd a > Csomagkezelő konzolt. A PMC-ben adja meg a következő parancsokat:
Add-Migration New_DataAnnotations
Update-Database
Update-Database a Up osztály New_DataAnnotations metódusát futtatja.
Vizsgálja meg a Up metódust:
public partial class New_DataAnnotations : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AlterColumn<string>(
name: "Title",
table: "Movie",
type: "nvarchar(60)",
maxLength: 60,
nullable: false,
oldClrType: typeof(string),
oldType: "nvarchar(max)");
migrationBuilder.AlterColumn<string>(
name: "Rating",
table: "Movie",
type: "nvarchar(5)",
maxLength: 5,
nullable: false,
oldClrType: typeof(string),
oldType: "nvarchar(max)");
migrationBuilder.AlterColumn<string>(
name: "Genre",
table: "Movie",
type: "nvarchar(30)",
maxLength: 30,
nullable: false,
oldClrType: typeof(string),
oldType: "nvarchar(max)");
}
A frissített Movie táblázat a következő sémával rendelkezik:
CREATE TABLE [dbo].[Movie] (
[ID] INT IDENTITY (1, 1) NOT NULL,
[Title] NVARCHAR (60) NOT NULL,
[ReleaseDate] DATETIME2 (7) NOT NULL,
[Genre] NVARCHAR (30) NOT NULL,
[Price] DECIMAL (18, 2) NOT NULL,
[Rating] NVARCHAR (5) NOT NULL,
CONSTRAINT [PK_Movie] PRIMARY KEY CLUSTERED ([ID] ASC)
);
Közzététel az Azure-ban
Az Azure-ban való üzembe helyezésről további információt az oktatóanyagban talál: ASP.NET Core-alkalmazás létrehozása az Azure-ban SQL Database-.
Köszönjük, hogy befejezte ezt a bevezetést a Razor Pages számára. Kezdje a Razor Lapok használatát, és a EF Core kiválóan kiegészíti ezt az oktatóanyagot.
További erőforrások
- Tag Helperek űrlapokon az ASP.NET Core-ban
- Az ASP.NET Core globalizációja és lokalizációja
- Tag Segédprogramok az ASP.NET Core-ban
- Szerző Tag Segédek az ASP.NET Core-ban
Következő lépések
Ebben a szakaszban a rendszer hozzáadja az érvényesítési logikát a Movie modellhez. Az érvényesítési szabályok akkor lépnek érvénybe, amikor egy felhasználó létrehoz vagy szerkeszt egy filmet.
Érvényesítés
A szoftverfejlesztés egyik legfontosabb alapelve az DRY ("Don'Repeat Ya saját magunk"). Razor Pages ösztönzi a fejlesztést, ahol a funkciók egyszer vannak megadva, és ez az alkalmazás egészében tükröződik. A DRY segíthet:
- Csökkentse az alkalmazásokban lévő kód mennyiségét.
- A kód kisebb hibalehetőséget biztosít, és könnyebben tesztelhetők és karbantarthatóak.
Az Razor Pages and Entity Framework által biztosított érvényesítési támogatás jó példa a DRY elvre:
- Az érvényesítési szabályok deklaratív módon vannak megadva egy helyen, a modellosztályban.
- A szabályok az alkalmazás minden pontján érvénybe lépnek.
Érvényesítési szabályok hozzáadása a filmmodellhez
A DataAnnotations névtér a következőt biztosítja:
- Egy osztályra vagy tulajdonságra deklaratív módon alkalmazott beépített érvényesítési attribútumok készlete.
- Formázási attribútumok, például
[DataType], amelyek segítenek a formázásban, és nem biztosítanak semmilyen ellenőrzést.
Frissítse a Movie osztályt, hogy kihasználhassa a beépített [Required], [StringLength], [RegularExpression]és [Range] érvényesítési attribútumokat.
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace RazorPagesMovie.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 a következő modelltulajdonságokon érvényesítendő viselkedést adják meg:
A
[Required]és[MinimumLength]attribútumok azt jelzik, hogy egy tulajdonságnak értékkel kell rendelkeznie. Semmi sem akadályozza meg, hogy a felhasználó üres területre lépjen, hogy megfeleljen ennek az ellenőrzésnek.A
[RegularExpression]attribútummal korlátozható, hogy mely karakterek adhatóak meg. Az előző kódbanGenre:- 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
RegularExpressionRating:- 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 besorolásra, de egy
Genreesetén meghiúsul.
A
[Range]attribútum egy adott tartományon belülre korlátozza az értéket.A
[StringLength]attribútum megadhat egy sztringtulajdonság maximális hosszát, és opcionálisan a minimális hosszát is.Az olyan értéktípusok, mint a
decimal,int,float,DateTime, eredendően kötelezőek, és nincs szükségük a[Required]attribútumra.
Az előző érvényesítési szabályok bemutatásra használatosak, nem optimálisak egy éles rendszerben. Például az előző példa megakadályozza, hogy csak két karakterből álló filmet adjon meg, és nem engedélyezi a speciális karaktereket a Genremezőben.
Az ASP.NET Core által automatikusan kikényszerített érvényesítési szabályok a következőkben segítenek:
- Az alkalmazás robusztusabbá tétele.
- Csökkentse az érvénytelen adatok adatbázisba való mentésének esélyét.
Érvényesítési hiba felhasználói felülete Razor lapokban
Futtassa az alkalmazást, és navigáljon a Lapok/Filmek lapra.
Válassza az Új létrehozása hivatkozást. Töltse ki az űrlapot érvénytelen értékekkel. Amikor a jQuery ügyféloldali ellenőrzése észleli a hibát, hibaüzenet jelenik meg.
Jegyzet
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 érvényesítési hibaüzenetet az érvénytelen értéket tartalmazó mezőkben. A hibák az ügyféloldalon, a JavaScript és a jQuery használatával, valamint a kiszolgálóoldalon is érvénybe lépnek, ha egy felhasználó letiltotta a JavaScriptet.
Jelentős előnye, hogy a létrehozási vagy szerkesztési oldalakon nem volt szükség kódmódosításra. Miután alkalmazták az adatjegyzeteket a modellre, az érvényesítési felhasználói felület engedélyezve lett. Az oktatóanyagban létrehozott Razor lapok automatikusan átvették az érvényesítési szabályokat a Movie modellosztály tulajdonságainak érvényesítési attribútumaival. Tesztelje az érvényesítést a Szerkesztés lapon, ugyanaz az ellenőrzés lesz alkalmazva.
Az űrlapadatok csak akkor kerülnek a kiszolgálóra, ha nincsenek ügyféloldali érvényesítési hibák. Ellenőrizze, hogy az űrlapadatok nem lettek-e elküldve az alábbi bármelyik módszerrel:
- Tegyen egy töréspontot a
OnPostAsyncmetódusba. Küldje el az űrlapot a létrehozása vagy Mentéslehetőséget választva. A töréspont soha nem kerül észlelésre. - Használja a Fiddler eszközt.
- A böngésző fejlesztői eszközeivel figyelheti a hálózati forgalmat.
Kiszolgálóoldali ellenőrzés
Ha a JavaScript le van tiltva a böngészőben, az űrlap hibákkal való elküldése eljut a kiszolgálóhoz.
Nem kötelező, tesztelje a kiszolgálóoldali ellenőrzést:
Tiltsa le a JavaScriptet a böngészőben. A JavaScript letiltható a böngésző fejlesztői eszközeivel. Ha a JavaScript nem tiltható le a böngészőben, próbálkozzon egy másik böngészővel.
Állítson be egy töréspontot a Létrehozás vagy szerkesztés lap
OnPostAsyncmetódusában.Érvénytelen adatokat tartalmazó űrlap elküldése.
Ellenőrizze, hogy a modell állapota érvénytelen-e:
if (!ModelState.IsValid) { return Page(); }
Másik lehetőségként Tiltsa le az ügyféloldali érvényesítést a kiszolgálón.
Az alábbi kód a Create.cshtml lap egy részét mutatja be, amelyet az oktatóanyag korábbi szakaszában láthat. A Lapok létrehozása és szerkesztése a következőre használja:
- A kezdeti űrlap megjelenítése.
- Az űrlap visszajátszása hiba esetén.
<form method="post">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="Movie.Title" class="control-label"></label>
<input asp-for="Movie.Title" class="form-control" />
<span asp-validation-for="Movie.Title" class="text-danger"></span>
</div>
A bemeneticímke-segéd a DataAnnotations attribútumokat használja, és az ügyféloldali jQuery-ellenőrzéshez szükséges HTML-attribútumokat állít elő. Az érvényesítési Tag Helper érvényesítési hibákat jelenít meg. További információt az Érvényesítési című témakörben talál.
A Létrehozás és szerkesztés lapon nincsenek érvényesítési szabályok. Az érvényesítési szabályok és a hibasztringek csak a Movie osztályban vannak megadva. Ezeket az érvényesítési szabályokat a rendszer automatikusan alkalmazza a Razor modellt szerkesztő Movie lapokra.
Ha az érvényesítési logikát módosítani kell, az csak a modellben történik. Az ellenőrzés következetesen érvényesül az alkalmazás egészében, az érvényesítési logika egy helyen van definiálva. Az egy helyen végzett ellenőrzés segít a kód tisztán tartásában, és megkönnyíti a karbantartást és a frissítést.
DataType-attribútumok használata
Vizsgálja meg a Movie osztályt. A System.ComponentModel.DataAnnotations névtér a beépített érvényesítési attribútumok mellett formázási attribútumokat is biztosít. A [DataType] attribútum a ReleaseDate és Price tulajdonságokra lesz alkalmazva.
[Display(Name = "Release Date")]
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
[Range(1, 100)]
[DataType(DataType.Currency)]
public decimal Price { get; set; }
A [DataType] attribútumok a következőt biztosítják:
- Tippek a nézetmotor számára az adatok formázásához.
- Olyan attribútumokat biztosít, mint például az URL-címek
<a>és az e-mailek<a href="mailto:EmailAddress.com">.
Az adatok formátumának ellenőrzéséhez használja a [RegularExpression] attribútumot. A [DataType] attribútum az adatbázis belső típusánál pontosabb adattípus megadására szolgál.
[DataType] attribútumok nem érvényesítési attribútumok. A mintaalkalmazásban csak a dátum jelenik meg idő nélkül.
A DataType számbavétel számos adattípust biztosít, például Date, Time, PhoneNumber, Currency, EmailAddressstb.
A [DataType] attribútumok:
- Engedélyezheti, hogy az alkalmazás automatikusan típusspecifikus szolgáltatásokat biztosítson. Például létrehozhat egy
mailto:hivatkozást aDataType.EmailAddress-hez. - HTML5-öt támogató böngészőkben megjelenhet egy dátumválasztó
DataType.Date. - Generáljon HTML 5
data-, ejtse ki úgy, hogy "adatkötőjel" azokat az attribútumokat, amelyeket az HTML 5 böngészők használnak. - Ne adjon meg semmilyen ellenőrzést.
DataType.Date nem adja meg a megjelenített dátum formátumát. Alapértelmezés szerint az adatmező az alapértelmezett formátumok szerint jelenik meg a kiszolgáló CultureInfoalapján.
Az [Column(TypeName = "decimal(18, 2)")] adatjegyzetre van szükség ahhoz, hogy az Entity Framework Core megfelelően le tudja képezni az Price-et az adatbázisban pénznemként. További információ: adattípusok.
A [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ás akkor lesz alkalmazva, amikor az érték szerkesztésre megjelenik. Ez a viselkedés egyes mezők esetében nem feltétlenül szükséges. Például a pénzösszegek esetében a szerkesztési felhasználói felületen általában nincs szükség a pénznem szimbólumára.
A [DisplayFormat] attribútum önmagában is használható, de általában célszerű a [DataType] attribútumot használni. A [DataType] attribútum az adatok szemantikáját közvetíti, szemben a képernyőn való megjelenítés módjával. A [DataType] attribútum a következő előnyöket biztosítja, amelyek nem érhetők el [DisplayFormat]:
- A böngésző engedélyezheti a HTML5-funkciókat, például megjelenítheti a naptár vezérlőelemét, a területi beállításoknak megfelelő pénznemszimbólumot, e-mail-hivatkozásokat 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.
- A
[DataType]attribútum lehetővé teszi a ASP.NET Core-keretrendszer számára, hogy a megfelelő mezősablont válassza ki az adatok megjelenítéséhez. ADisplayFormat, ha önmagában alkalmazzák, a sztring sablont használja.
Megjegyzés: jQuery-ellenőrzés nem működik a [Range] attribútummal és DateTime. Az alábbi kód például mindig egy ügyféloldali érvényesítési hibát jelenít meg, még akkor is, ha a dátum a megadott tartományban van:
[Range(typeof(DateTime), "1/1/1966", "1/1/2020")]
Ajánlott elkerülni a modellekben a nehéz dátumok összeállítását, ezért a [Range] attribútum és a DateTime használata nem ajánlott. Használja a konfigurációs-et dátumtartományokhoz és más olyan értékekhez, amelyek gyakran változnak, ahelyett hogy kódban határozná meg azokat.
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; }
}
Kezdje el a Razor Lapokkal, és a EF Core bemutatja a speciális EF Core műveleteket a Razor Lapokkal.
Migrálások alkalmazása
Az osztályra alkalmazott DataAnnotations megváltoztatja a sémát. Például a Title mezőre alkalmazott DataAnnotations:
[StringLength(60, MinimumLength = 3)]
[Required]
public string Title { get; set; }
- A karaktereket 60-ra korlátozza.
- Nem engedélyezi
nullértéket.
A Movie tábla jelenleg a következő sémával rendelkezik:
CREATE TABLE [dbo].[Movie] (
[ID] INT IDENTITY (1, 1) NOT NULL,
[Title] NVARCHAR (MAX) NULL,
[ReleaseDate] DATETIME2 (7) NOT NULL,
[Genre] NVARCHAR (MAX) NULL,
[Price] DECIMAL (18, 2) NOT NULL,
[Rating] NVARCHAR (MAX) NULL,
CONSTRAINT [PK_Movie] PRIMARY KEY CLUSTERED ([ID] ASC)
);
Az előző sémamódosítások nem okozzák, hogy az EF kivételt dobjon. Hozzon létre azonban egy migrálást, hogy a séma összhangban legyen a modellel.
Az Eszközök menüben válassza a(z) NuGet Csomagkezelőt, majd a > Csomagkezelő konzolt. A PMC-ben adja meg a következő parancsokat:
Add-Migration New_DataAnnotations
Update-Database
Update-Database a Up osztály New_DataAnnotations metódusait futtatja. Vizsgálja meg a Up metódust:
public partial class New_DataAnnotations : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AlterColumn<string>(
name: "Title",
table: "Movie",
maxLength: 60,
nullable: false,
oldClrType: typeof(string),
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "Rating",
table: "Movie",
maxLength: 5,
nullable: false,
oldClrType: typeof(string),
oldNullable: true);
migrationBuilder.AlterColumn<string>(
name: "Genre",
table: "Movie",
maxLength: 30,
nullable: false,
oldClrType: typeof(string),
oldNullable: true);
}
A frissített Movie táblázat a következő sémával rendelkezik:
CREATE TABLE [dbo].[Movie] (
[ID] INT IDENTITY (1, 1) NOT NULL,
[Title] NVARCHAR (60) NOT NULL,
[ReleaseDate] DATETIME2 (7) NOT NULL,
[Genre] NVARCHAR (30) NOT NULL,
[Price] DECIMAL (18, 2) NOT NULL,
[Rating] NVARCHAR (5) NOT NULL,
CONSTRAINT [PK_Movie] PRIMARY KEY CLUSTERED ([ID] ASC)
);
Közzététel az Azure-ban
Az Azure-ban való üzembe helyezésről további információt az oktatóanyagban talál: ASP.NET Core-alkalmazás létrehozása az Azure-ban SQL Database-.
Köszönjük, hogy befejezte ezt a bevezetést a Razor Pages számára. Kezdje a Razor Lapok használatát, és a EF Core kiválóan kiegészíti ezt az oktatóanyagot.
Vállalati webalkalmazás-minták
A megbízható, biztonságos, teljesíthető, tesztelhető és méretezhető ASP.NET Core-alkalmazás létrehozásával kapcsolatos útmutatásért tekintse meg Vállalati webalkalmazás-mintákcímű témakört. Rendelkezésre áll egy mintákat megvalósító, termékminőségű teljes minta-webalkalmazás.
További erőforrások
- Tag Helperek űrlapokon az ASP.NET Core-ban
- Az ASP.NET Core globalizációja és lokalizációja
- Tag Segédprogramok az ASP.NET Core-ban
- Szerző Tag Segédek az ASP.NET Core-ban