IDataErrorInfo Arabirimi ile Doğrulama (VB)

tarafından Stephen Walther

Stephen Walther, bir model sınıfında IDataErrorInfo arabirimini uygulayarak özel doğrulama hata iletilerinin nasıl görüntüleneceğini gösterir.

Bu öğreticinin amacı, bir ASP.NET MVC uygulamasında doğrulama gerçekleştirmeye yönelik bir yaklaşımı açıklamaktır. Gerekli form alanları için değer sağlamadan birinin HTML formu göndermesini nasıl önleyeceğinizi öğrenirsiniz. Bu öğreticide, IErrorDataInfo arabirimini kullanarak doğrulama gerçekleştirmeyi öğreneceksiniz.

Varsayımlar

Bu öğreticide MoviesDB veritabanını ve Filmler veritabanı tablosunu kullanacağım. Bu tabloda aşağıdaki sütunlar bulunur:

Sütun Adı Veri Türü Null'lara İzin Ver
Id int Yanlış
Başlık Nvarchar(100) Yanlış
Yönetmen Nvarchar(100) Yanlış
DateReleased DateTime Yanlış

Bu öğreticide, veritabanı modeli sınıflarımı oluşturmak için Microsoft Entity Framework kullanıyorum. Entity Framework tarafından oluşturulan Movie sınıfı Şekil 1'de görüntülenir.

Movie varlığı

Şekil 01: Film varlığı (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Not

Veritabanı modeli sınıflarınızı oluşturmak üzere Entity Framework kullanma hakkında daha fazla bilgi edinmek için Entity Framework ile Model Sınıfları Oluşturma başlıklı öğreticime bakın.

Denetleyici Sınıfı

Filmleri listelemek ve yeni filmler oluşturmak için Giriş denetleyicisini kullanırız. Bu sınıfın kodu Listeleme 1'de yer alır.

Liste 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

Listeleme 1'deki Giriş denetleyicisi sınıfı iki Create() eylemi içerir. İlk eylem, yeni film oluşturmaya yönelik HTML formunu görüntüler. İkinci Create() eylemi, yeni filmin veritabanına gerçek ekleme işlemini gerçekleştirir. İlk Create() eylemi tarafından görüntülenen form sunucuya gönderildiğinde ikinci Create() eylemi çağrılır.

İkinci Create() eyleminin aşağıdaki kod satırlarını içerdiğine dikkat edin:

' Validate
If (Not ModelState.IsValid) Then
Return View()
End If

IsValid özelliği, doğrulama hatası olduğunda false döndürür. Bu durumda, film oluşturmaya yönelik HTML formunu içeren Oluştur görünümü yeniden görüntülenir.

Kısmi Sınıf Oluşturma

Movie sınıfı Entity Framework tarafından oluşturulur. MovieDBModel.edmx dosyasını Çözüm Gezgini penceresinde genişletip MoviesDBModel.Tasarım Aracı açarsanız Movie sınıfının kodunu görebilirsiniz. Kod Düzenleyicisi'ndeki vb dosyası (bkz. Şekil 2).

Movie varlığının kodu

Şekil 02: Film varlığının kodu (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Movie sınıfı kısmi bir sınıftır. Bu, Movie sınıfının işlevselliğini genişletmek için aynı ada sahip başka bir kısmi sınıf ekleyebileceğimiz anlamına gelir. Doğrulama mantığımızı yeni kısmi sınıfa ekleyeceğiz.

Listeleme 2'deki sınıfı Models klasörüne ekleyin.

Listeleme 2 - Models\Movie.vb

Public Partial Class Movie

End Class

Liste 2'deki sınıfın kısmi değiştirici içerdiğine dikkat edin. Bu sınıfa eklediğiniz tüm yöntemler veya özellikler, Entity Framework tarafından oluşturulan Movie sınıfının bir parçası olur.

OnChanging ve OnChanged Kısmi Yöntemler Ekleme

Entity Framework bir varlık sınıfı oluşturduğunda, Entity Framework sınıfa otomatik olarak kısmi yöntemler ekler. Entity Framework, sınıfın her özelliğine karşılık gelen OnChanging ve OnChanged kısmi yöntemleri oluşturur.

Movie sınıfı söz konusu olduğunda Entity Framework aşağıdaki yöntemleri oluşturur:

  • OnIdChanging
  • OnIdChanged
  • OnTitleChanging
  • OnTitleChanged
  • OnDirectorChanging
  • OnDirectorChanged
  • OnDateReleasedChanging
  • OnDateReleasedChanged

İlgili özellik değiştirilmeden hemen önce OnChanging yöntemi çağrılır. Özellik değiştirildikten hemen sonra OnChanged yöntemi çağrılır.

Movie sınıfına doğrulama mantığı eklemek için bu kısmi yöntemlerden yararlanabilirsiniz. Listeleme 3'teki Film sınıfı güncelleştirmesi, Başlık ve Yönetmen özelliklerine boş değerler atandığını doğrular.

Not

Kısmi yöntem, uygulamanız gerekmeyen bir sınıfta tanımlanan bir yöntemdir. Kısmi bir yöntem uygulamazsanız, derleyici yöntem imzasını ve yöntemine yapılan tüm çağrıları kaldırır, böylece kısmi yöntemle ilişkili çalışma zamanı maliyetleri yoktur. Visual Studio Code Düzenleyicisi'nde kısmi bir yöntem eklemek için kısmi anahtar sözcüğünü yazabilir ve ardından uygulanacak kısmi değerlerin listesini görüntülemek için bir boşluk ekleyebilirsiniz.

Liste 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

Örneğin, Title özelliğine boş bir dize atamayı denerseniz, _errors adlı sözlüğe bir hata iletisi atanır.

Bu noktada, Title özelliğine boş bir dize atadığınızda ve özel _errors alanına bir hata eklendiğinde hiçbir şey olmaz. Bu doğrulama hatalarını ASP.NET MVC çerçevesine göstermek için IDataErrorInfo arabirimini uygulamamız gerekir.

IDataErrorInfo Arabirimini Uygulama

IDataErrorInfo arabirimi, ilk sürümden bu yana .NET framework'ün bir parçası olmuştur. Bu arabirim çok basit bir arabirimdir:

Public Interface IDataErrorInfo
  Default ReadOnly Property Item(ByVal columnName As String) As String
  ReadOnly Property [Error]() As String
End Interface

Bir sınıf IDataErrorInfo arabirimini uygularsa, ASP.NET MVC çerçevesi sınıfının bir örneğini oluştururken bu arabirimi kullanır. Örneğin, Home controller Create() eylemi Movie sınıfının bir örneğini kabul eder:

<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

ASP.NET MVC çerçevesi, model bağlayıcısı (DefaultModelBinder) kullanarak Create() eylemine geçirilen Film örneğini oluşturur. Model bağlayıcısı, HTML form alanlarını Movie nesnesinin bir örneğine bağlayarak Movie nesnesinin bir örneğini oluşturmakla sorumludur.

DefaultModelBinder, bir sınıfın IDataErrorInfo arabirimini uygulayıp uygulamadığını algılar. Bir sınıf bu arabirimi uygularsa model bağlayıcısı, sınıfın her özelliği için IDataErrorInfo.this dizin oluşturucusunu çağırır. Dizin oluşturucu bir hata iletisi döndürürse model bağlayıcısı bu hata iletisini otomatik olarak model durumuna ekler.

DefaultModelBinder ayrıca IDataErrorInfo.Error özelliğini de denetler. Bu özellik, sınıfıyla ilişkili özelliğe özgü olmayan doğrulama hatalarını temsil etmek için tasarlanmıştır. Örneğin, Movie sınıfının birden çok özelliğinin değerlerine bağlı olan bir geçerlilik kuralını zorunlu kılmak isteyebilirsiniz. Bu durumda Error özelliğinden bir doğrulama hatası döndürebilirsiniz.

Listing 4'teki güncelleştirilmiş Movie sınıfı, IDataErrorInfo arabirimini uygular.

Listeleme 4 - Models\Movie.vb (IDataErrorInfo uygular)

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

Liste 4'te dizin oluşturucu özelliği, dizin oluşturucuya geçirilen özellik adına karşılık gelen bir anahtar içerip içermediğini görmek için _errors koleksiyonunu denetler. özelliğiyle ilişkili doğrulama hatası yoksa boş bir dize döndürülür.

Değiştirilen Movie sınıfını kullanmak için Giriş denetleyicisini herhangi bir şekilde değiştirmeniz gerekmez. Şekil 3'te görüntülenen sayfa, Başlık veya Yönetmen form alanları için değer girildiğinde ne olduğunu gösterir.

Otomatik olarak eylem yöntemleri oluşturma

Şekil 03: Eksik değerleri olan bir form (Tam boyutlu görüntüyü görüntülemek için tıklayın)

DateReleased değerinin otomatik olarak doğrulandığına dikkat edin. DateReleased özelliği NULL değerleri kabul etmediğinden, DefaultModelBinder değeri olmadığında bu özellik için otomatik olarak bir doğrulama hatası oluşturur. DateReleased özelliğinin hata iletisini değiştirmek istiyorsanız özel bir model bağlayıcısı oluşturmanız gerekir.

Özet

Bu öğreticide, doğrulama hata iletileri oluşturmak için IDataErrorInfo arabirimini kullanmayı öğrendiniz. İlk olarak, Entity Framework tarafından oluşturulan kısmi Movie sınıfının işlevselliğini genişleten kısmi bir Movie sınıfı oluşturduk. Ardından, OnTitleChanging() ve OnDirectorChanging() film sınıfı kısmi yöntemlerine doğrulama mantığı ekledik. Son olarak, bu doğrulama iletilerini ASP.NET MVC çerçevesine sunmak için IDataErrorInfo arabirimini uyguladık.