IDataErrorInfo Arabirimi ile Doğrulama (C#)

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.

Listeleme 1 - Controllers\HomeController.cs

using System.Linq;
using System.Web.Mvc;
using MvcApplication1.Models;

namespace MvcApplication1.Controllers
{

    public class HomeController : Controller
    {
        private MoviesDBEntities _db = new MoviesDBEntities();

        public ActionResult Index()
        {
            return View(_db.MovieSet.ToList());
        }

        public ActionResult Create()
        {
            return View();
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Create([Bind(Exclude = "Id")] Movie movieToCreate)
        {
            // Validate
            if (!ModelState.IsValid)
                return View();

            // Add to database
            try
            {
                _db.AddToMovieSet(movieToCreate);
                _db.SaveChanges();

                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

    }
}

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 (!ModelState.IsValid)
    return View();

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

using System.Collections.Generic;
using System.ComponentModel;

namespace MvcApplication1.Models
{

    public partial class Movie 
    {

    }
}

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.

Listeleme 3 - Models\Movie.cs

using System.Collections.Generic;
using System.ComponentModel;

namespace MvcApplication1.Models
{

    public partial class Movie : IDataErrorInfo
    {
        private Dictionary<string, string> _errors = new Dictionary<string, string>();

        partial void OnTitleChanging(string value)
        {
            if (value.Trim().Length == 0)
                _errors.Add("Title", "Title is required.");
        }

        partial void OnDirectorChanging(string value)
        {
            if (value.Trim().Length == 0)
                _errors.Add("Director", "Director is required.");
        }

    }
}

Ö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
{
    string this[string columnName] { get; }

    string Error { get; }
}

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 ActionResult Create([Bind(Exclude = "Id")] Movie movieToCreate)
{
    // Validate
    if (!ModelState.IsValid)
        return View();

    // Add to database
    try
    {
        _db.AddToMovieSet(movieToCreate);
        _db.SaveChanges();

        return RedirectToAction("Index");
    }
    catch
    {
        return View();
    }
}

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.cs (IDataErrorInfo uygular)

using System.Collections.Generic;
using System.ComponentModel;

namespace MvcApplication1.Models
{

    public partial class Movie : IDataErrorInfo
    {
        private Dictionary<string, string> _errors = new Dictionary<string, string>();

        partial void OnTitleChanging(string value)
        {
            if (value.Trim().Length == 0)
                _errors.Add("Title", "Title is required.");
        }

        partial void OnDirectorChanging(string value)
        {
            if (value.Trim().Length == 0)
                _errors.Add("Director", "Director is required.");
        }

        #region IDataErrorInfo Members

        public string Error
        {
            get
            {
                return string.Empty;
            }
        }

        public string this[string columnName]
        {
            get
            {
                if (_errors.ContainsKey(columnName))
                    return _errors[columnName];
                return string.Empty;
            }
        }

        #endregion
    }
}

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 girilmemişse ne olduğunu gösterir.

Eylem yöntemlerini otomatik olarak oluşturma

Şekil 03: Eksik değerleri olan bir form (Tam boyutlu resmi 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.