Megosztás a következőn keresztül:


A Razor Pages oktatóanyag-sorozatának 8. része

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ódban Genre:

    • 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.

Több jQuery ügyféloldali érvényesítési hibával rendelkező filmnézet-űrlap

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 OnPostAsync metó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:

  1. 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.

  2. Állítson be egy töréspontot a Létrehozás vagy szerkesztés lap OnPostAsync metódusában.

  3. Érvénytelen adatokat tartalmazó űrlap elküldése.

  4. 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 a DataType.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. A DisplayFormat, 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

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ódban Genre:

    • 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.

Több jQuery ügyféloldali érvényesítési hibával rendelkező filmnézet-űrlap

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 OnPostAsync metó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:

  1. 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.

  2. Állítson be egy töréspontot a Létrehozás vagy szerkesztés lap OnPostAsync metódusában.

  3. Érvénytelen adatokat tartalmazó űrlap elküldése.

  4. 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 a DataType.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. A DisplayFormat, 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

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ódban Genre:

    • 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.

Több jQuery ügyféloldali érvényesítési hibával rendelkező filmnézet-űrlap

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 OnPostAsync metó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:

  1. 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.

  2. Állítson be egy töréspontot a Létrehozás vagy szerkesztés lap OnPostAsync metódusában.

  3. Érvénytelen adatokat tartalmazó űrlap elküldése.

  4. 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 a DataType.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. A DisplayFormat, 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

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ódban Genre:

    • 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.

Több jQuery ügyféloldali érvényesítési hibával rendelkező filmnézet-űrlap

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 OnPostAsync metó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:

  1. 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.

  2. Állítson be egy töréspontot a Létrehozás vagy szerkesztés lap OnPostAsync metódusában.

  3. Érvénytelen adatokat tartalmazó űrlap elküldése.

  4. 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 a DataType.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. A DisplayFormat, 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

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ódban Genre:

    • 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.

Több jQuery ügyféloldali érvényesítési hibával rendelkező filmnézet-űrlap

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 OnPostAsync metó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:

  1. 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.

  2. Állítson be egy töréspontot a Létrehozás vagy szerkesztés lap OnPostAsync metódusában.

  3. Érvénytelen adatokat tartalmazó űrlap elküldése.

  4. 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 a DataType.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. A DisplayFormat, 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

Következő lépések