MVC EmailAdress Attribute’u Yazmak

Web projelerinde, kullanıcılardan genellikle formlar üzerinden bilgi transferi yaparız.Alınan bilgilerin yapıları veritabanlarına bellirli format yapılarında kayıt ettiririz.Örneğin tarihsel veri girişlerini (99/99/9999) tipindeki bir format yapısında alırız.Tabi bu format yapısını Asp.NET, Asp.NET MVC ya da herhangi bir platformun desteklediği Validation kontrolleriyle ya da kendi elimizle yazarak Jquery, Javascript desteğiyle alabiliriz.Bizim konumuz MVC projeleri üzerinde, kullanıcıdan form tabanlı gelen bilgi transferi neticesinde alınan e-mail adreslerinin istediğimiz formatta yazılımını sağlamak.Bunun için kendimiz özel bir Attribute oluşturacağız.

Konu üzerinde örneğimizi teşkillendirebilmek için önceden hazırlanmış bir MVC projesi içinde çalışacağız.Bu konuları baştan almam hem zaman kaybı, hemde konunun özünden dağılmasına sebep olacaktır.Eğer göz ardı edilen bu konular hakkında bilgi sahibi değilseniz, derhal bu yazıyı bırakıp önceki MVC içerikli yazılarımı okumanızı tavsiye ediyorum.(ya da başka kaynaklardan MVC temellerini öğreniniz)

Elimizdeki MVC projesinde, Model katmanında önceden hazırlanmış bir LINQ To SQL ile oluşturulmuş .dbml uzantılı dosyamız ve Controller’ımız hazır olduğunu düşünelim.Dbml dosyamızda bağlantı kurulan veritabanında bulunan “Email” adında bir tablomuz mevcut olacaktır ve bu tablo içinde sadece “Email” adında bir kolonumuz olacaktır.

Öncelikle “Email” isimli kolonumuza bir Validation işlemi yapabilmek için “partial” bir sınıf tanımlayalım ve “Bind” işlemlerini yapalım.

using System.Web.Mvc;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel;
namespace EmailAdressCalismasi.Models
{
    [Bind(Include = "Email")]
    [MetadataType(typeof(Email_Kontrol))]
    public partial class Email
    {
    }
    class Email_Kontrol
    {
        [DisplayName("E-Posta Adresiniz :")]
        public string Email { get; set; }
    }
}

Yukarıda gördüğünüz gibi “Email” tablosundaki “Email” isimli kolonu “Bind” edip “MetadataType” anahtar sözcüğüyle “Email_Kontrol” isimli sınıfta Validation kontrolleri yapacağımızı söyledik.

“Email_Kontrol” sınıfında string tipinde “Email” adında propertymiz, “Email” isimli kolonu temsil ediyor.Bu kolonun View katmanında gözükecek adını “DisplayName” Attribute’uyla girmiş bulunmaktayız.View katmanında girilecek değerin E-Mail formatında olup olmadığını kontrol edecek Attribute’u da oluşturup propertyimizi işaretleyeceğiz.

Şimdi “EmailAdressAttribute” ismini vereceğimiz Attribute’umuzu oluşturalım.

    [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)]
    //Bu Attribute'un üzerinde kullanılacağı yapıları ayarlıyorum.
    //Field ve Property yapılarında kullanılacaktır.
    public class EmailAdressAttribute : DataTypeAttribute
    {
        readonly Regex regex = new Regex(@"\w+([-+.']\w+)*@\w+([-.]w+)*\.\w+([-.]\w+)*", RegexOptions.Compiled);
        public EmailAdressAttribute()
            : base(DataType.EmailAddress)
        {
            /*
             Kalıtım aldığımız DataTypeAttribute sınıfına ulaşıp, veri tipi
             kontrolünün E-Mail adresi olacağını söylüyoruz.
             */
        }
        public override bool IsValid(object value)
        {
            string str = Convert.ToString(value,CultureInfo.CurrentCulture);
            if (string.IsNullOrEmpty(str))
            {
                return true;
            }
            Match match = regex.Match(str);
            return (match.Success && (match.Length == 0)) && (match.Length == str.Length);
        }
    }

Evet Attribute’umuzu yazmış olduk.Şimdi “partial” olarak oluşturduğumuz “Email” sınıfında bu Attribute’u kullanalım.
Email

Gördüğünüz gibi, “EmailAdressAttribute” ismindeki Attribute’umuz “EmailAdress” olarak eklendi.Ve hatta “ErrorMessage” gibi hata parametrelerini de otomatik olarak algılıyor.Bunun sebebi, bu Attribute’umuz “DataTypeAttribute” isimli metodtan Inherit(kalıtım) edildiği için, ve Constructor metodunda veri tipi E-Mail yapısı seçildiği için gerekli parametrelerini getirtiyor.Halla gördüğünüz gibi, çoklu dil desteğinde kullandığımız “ResourceName” ve “ResourceType” parametrelerini bile getiriyor.

Yukarıdaki resimde gördüğünüz kodları aşağıya yazılı şekilde almakta fayda var.

    [Bind(Include = "Email")]
    [MetadataType(typeof(Email_Kontrol))]
    public partial class Email
    {
    }
    class Email_Kontrol
    {
        [EmailAdress(ErrorMessage="Lütfen uygun formatta E-Mail adresi giriniz.")]
        [DisplayName("E-Posta Adresiniz :")]
        public string Email { get; set; }
    }

Şimdi projemizi çalıştıralım ve uygun formatta olmayan bir E-Mail adresi yazalım.
SonDurum

Gördüğünüz gibi Attribute’umuz sorunsuz çalışmaktadır.
Sonraki yazılarımda görüşmek dileğiyle..
İyi çalışmalar..

Bunlar da hoşunuza gidebilir...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*