Ověřování v rozhraní IDataErrorInfo (VB)
Stephen Walther ukazuje, jak zobrazit vlastní ověřovací chybové zprávy implementací rozhraní IDataErrorInfo ve třídě modelu.
Cílem tohoto kurzu je vysvětlit jeden přístup k ověřování v aplikaci ASP.NET MVC. Naučíte se, jak zabránit tomu, aby někdo odesíll formulář HTML bez zadání hodnot požadovaných polí formuláře. V tomto kurzu se naučíte provádět ověřování pomocí rozhraní IErrorDataInfo.
Předpoklady
V tomto kurzu použiju databázi MoviesDB a tabulku databáze Movies. Tato tabulka obsahuje následující sloupce:
Název sloupce | Datový typ | Povolit hodnoty Null |
---|---|---|
Id | Int | Ne |
Nadpis | Nvarchar(100) | Ne |
Ředitel | Nvarchar(100) | Ne |
DateReleased | DateTime | Ne |
V tomto kurzu používám Microsoft Entity Framework ke generování tříd modelu databáze. Třída Movie vygenerovaná rozhraním Entity Framework je zobrazena na obrázku 1.
Obrázek 01: Entita Film (kliknutím zobrazíte obrázek v plné velikosti)
Poznámka
Další informace o použití Entity Frameworku k vygenerování tříd modelu databáze najdete v mém kurzu Vytváření tříd modelů pomocí Entity Frameworku.
Třída kontroleru
K zobrazení seznamu filmů a vytváření nových filmů používáme ovladač Domů. Kód pro tuto třídu je obsažen ve výpisu 1.
Výpis 1 – Controllers\HomeController.vb
Public Class HomeController
Inherits Controller
Private _db As New MoviesDBEntities()
Public Function Index() As ActionResult
Return View(_db.MovieSet.ToList())
End Function
Public Function Create() As ActionResult
Return View()
End Function
<AcceptVerbs(HttpVerbs.Post)> _
Public Function Create(<Bind(Exclude := "Id")> ByVal movieToCreate As Movie) As ActionResult
' Validate
If (Not ModelState.IsValid) Then
Return View()
End If
' Add to database
Try
_db.AddToMovieSet(movieToCreate)
_db.SaveChanges()
Return RedirectToAction("Index")
Catch
Return View()
End Try
End Function
End Class
Třída domácího kontroleru v seznamu 1 obsahuje dvě akce Create(). První akce zobrazí formulář HTML pro vytvoření nového filmu. Druhá akce Create() provede skutečné vložení nového filmu do databáze. Druhá akce Create() se vyvolá při odeslání formuláře zobrazeného první akcí Create() na server.
Všimněte si, že druhá akce Create() obsahuje následující řádky kódu:
' Validate
If (Not ModelState.IsValid) Then
Return View()
End If
Vlastnost IsValid vrátí hodnotu false, pokud dojde k chybě ověření. V takovém případě se znovu zobrazí zobrazení Vytvořit, které obsahuje formulář HTML pro vytvoření videa.
Vytvoření částečné třídy
Třída Movie je generována Entity Framework. Kód třídy Movie můžete zobrazit, pokud rozbalíte soubor MoviesDBModel.edmx v okně Průzkumník řešení a otevřete MoviesDBModel.Designer. vb soubor v Editoru kódu (viz obrázek 2).
Obrázek 02: Kód entity Movie (kliknutím zobrazíte obrázek v plné velikosti)
Třída Movie je částečná třída. To znamená, že můžeme přidat další částečnou třídu se stejným názvem, abychom rozšířili funkčnost třídy Movie. Do nové částečné třídy přidáme naši logiku ověřování.
Přidejte třídu v seznamu 2 do složky Modely.
Výpis 2 – Modely\Movie.vb
Public Partial Class Movie
End Class
Všimněte si, že třída ve výpisu 2 obsahuje částečný modifikátor. Všechny metody nebo vlastnosti, které přidáte do této třídy, se stanou součástí třídy Movie vygenerované Entity Framework.
Přidání částečných metod OnChanging a OnChanged
Když Entity Framework vygeneruje třídu entity, Entity Framework přidá do třídy automaticky částečné metody. Entity Framework generuje OnChanging a OnChanged částečné metody, které odpovídají každé vlastnosti třídy.
V případě třídy Movie vytvoří Entity Framework následující metody:
- OnIdChanging
- OnIdChanged
- OnTitleChanging
- OnTitleChanged
- OnDirectorChanging
- OnDirectorChanged
- OnDateReleasedChanging
- OnDateReleasedChanged
Metoda OnChanging je volána těsně před změnou odpovídající vlastnosti. Metoda OnChanged je volána hned po změně vlastnosti.
Tyto částečné metody můžete využít k přidání ověřovací logiky do třídy Movie. Třída update Movie v seznamu 3 ověřuje, že vlastnosti Title a Director jsou přiřazeny neempty hodnoty.
Poznámka
Částečná metoda je metoda definovaná ve třídě, kterou nemusíte implementovat. Pokud neimplementujete částečnou metodu, kompilátor odebere podpis metody a všechna volání metody, takže s částečnou metodou nejsou spojené žádné náklady na běh. V editoru Editoru editoru Visual Studio Code můžete přidat částečnou metodu zadáním klíčového slova partial následovanou mezerou pro zobrazení seznamu částí, které se mají implementovat.
Výpis 3 – Models\Movie.vb
Imports System.ComponentModel
Partial Public Class Movie
Implements IDataErrorInfo
Private _errors As New Dictionary(Of String, String)()
Private Sub OnTitleChanging(ByVal value As String)
If value.Trim().Length = 0 Then
_errors.Add("Title", "Title is required.")
End If
End Sub
Private Sub OnDirectorChanging(ByVal value As String)
If value.Trim().Length = 0 Then
_errors.Add("Director", "Director is required.")
End If
End Sub
End Class
Pokud se například pokusíte přiřadit prázdný řetězec vlastnosti Title, pak se slovníku s názvem _errors přiřadí chybová zpráva.
V tomto okamžiku se ve skutečnosti nic nestane, když přiřadíte prázdný řetězec vlastnosti Title a do pole privátního _errors se přidá chyba. Potřebujeme implementovat rozhraní IDataErrorInfo, aby se tyto chyby ověřování zobrazily v architektuře ASP.NET MVC.
Implementace rozhraní IDataErrorInfo
Rozhraní IDataErrorInfo je součástí rozhraní .NET od první verze. Toto rozhraní je velmi jednoduché rozhraní:
Public Interface IDataErrorInfo
Default ReadOnly Property Item(ByVal columnName As String) As String
ReadOnly Property [Error]() As String
End Interface
Pokud třída implementuje rozhraní IDataErrorInfo, rozhraní ASP.NET MVC použije toto rozhraní při vytváření instance třídy. Například akce Vytvořit() domovského kontroleru přijímá instanci třídy Movie:
<AcceptVerbs(HttpVerbs.Post)> _
Public Function Create(<Bind(Exclude := "Id")> ByVal movieToCreate As Movie) As ActionResult
' Validate
If (Not ModelState.IsValid) Then
Return View()
End If
' Add to database
Try
_db.AddToMovieSet(movieToCreate)
_db.SaveChanges()
Return RedirectToAction("Index")
Catch
Return View()
End Try
End Function
Rozhraní ASP.NET MVC vytvoří instanci movie předanou do akce Create() pomocí pořadače modelu (DefaultModelBinder). Pořadač modelu je zodpovědný za vytvoření instance objektu Movie vazbou polí formuláře HTML na instanci objektu Movie.
DefaultModelBinder zjistí, zda třída implementuje IDataErrorInfo rozhraní. Pokud třída implementuje toto rozhraní, vyvolá pořadač modelu indexer IDataErrorInfo.this pro každou vlastnost třídy. Pokud indexer vrátí chybovou zprávu, přidá pořadač modelu tuto chybovou zprávu do stavu modelu automaticky.
DefaultModelBinder také kontroluje vlastnost IDataErrorInfo.Error. Tato vlastnost je určena k reprezentaci chyb ověřování, které nejsou specifické pro vlastnosti spojené s třídou. Můžete například chtít vynutit ověřovací pravidlo, které závisí na hodnotách více vlastností třídy Movie. V takovém případě byste vrátili chybu ověření z vlastnosti Error.
Aktualizovaná třída Movie v výpisu 4 implementuje rozhraní IDataErrorInfo.
Výpis 4 – Models\Movie.vb (implementuje IDataErrorInfo)
Imports System.ComponentModel
Partial Public Class Movie
Implements IDataErrorInfo
Private _errors As New Dictionary(Of String, String)()
Private Sub OnTitleChanging(ByVal value As String)
If value.Trim().Length = 0 Then
_errors.Add("Title", "Title is required.")
End If
End Sub
Private Sub OnDirectorChanging(ByVal value As String)
If value.Trim().Length = 0 Then
_errors.Add("Director", "Director is required.")
End If
End Sub
#Region "IDataErrorInfo Members"
Public ReadOnly Property [Error]() As String Implements IDataErrorInfo.Error
Get
Return String.Empty
End Get
End Property
Default Public ReadOnly Property Item(ByVal columnName As String) As String Implements IDataErrorInfo.Item
Get
If _errors.ContainsKey(columnName) Then
Return _errors(columnName)
End If
Return String.Empty
End Get
End Property
#End Region
End Class
Ve výpisu 4 vlastnost indexeru zkontroluje kolekci _errors a zjistí, jestli obsahuje klíč, který odpovídá názvu vlastnosti předané indexeru. Pokud k vlastnosti není přidružena žádná chyba ověření, vrátí se prázdný řetězec.
Abyste mohli používat upravenou třídu Movie, nemusíte žádným způsobem upravovat řadič Domů. Stránka zobrazená na obrázku 3 znázorňuje, co se stane, když není pro pole formuláře Název nebo Ředitel zadána žádná hodnota.
Obrázek 03: Formulář s chybějícími hodnotami (kliknutím zobrazíte obrázek v plné velikosti)
Všimněte si, že hodnota DateReleased se ověřuje automaticky. Vzhledem k tomu, DateReleased vlastnost nepřijímá hodnoty NULL, DefaultModelBinder generuje chybu ověření pro tuto vlastnost automaticky, pokud nemá hodnotu. Pokud chcete upravit chybovou zprávu pro vlastnost DateReleased, musíte vytvořit vlastní pořadač modelu.
Souhrn
V tomto kurzu jste zjistili, jak pomocí rozhraní IDataErrorInfo generovat chybové zprávy ověřování. Nejprve jsme vytvořili částečnou třídu Movie, která rozšiřuje funkce částečné třídy Movie vygenerované rozhraním Entity Framework. Dále jsme přidali logiku ověřování do částečných metod třídy Movie OnTitleChanging() a OnDirectorChanging(). Nakonec jsme implementovali rozhraní IDataErrorInfo, abychom tyto ověřovací zprávy zpřístupnili rozhraní ASP.NET MVC.