MVC’de LocalizedDisplayNameAttribute Attribute’u Yazmak

Merhaba sevgili okuyucularım.Yeni yıla ilk olarak LocalizedDisplayNameAttribute Attribute’u yazma konusunu ele alarak giriş yapacağız :).
Nedir bu LocalizedDisplayNameAttribute? diye bir soru yönelttiğinizi duyar gibiyim.
Bu sorunun cevabını verebilmek için, MVC temellerine dayalı bilgilerinizin en az temel aşamada olması gerektiğini önceden söylüyorum.Asıl mevzu şundan ibarettir.Model katmanında, veritabanımızdan herhangi bir tablonun kolonlarını, Linq To SQL mimarisi sayesinde property olarak elde ediyor ve Validation vs. gibi işlemlerine tabi tutmak için bu kolonları Bind ediyorduk.Daha sonra MetadataType Attribute’u ile bu kontrollerin hangi sınıfta yapılacağını belirtiyorduk.
İşte bu, MetadataType ile gösterilen sınıfta manuel olarak yazdığımız bilgilerin çoklu dil destek yapısına uygun olmalarını sağlayabiliriz.Anımsarsanız, Required yapısı verilen property değerinin boş geçilemeyeceğini söylemektedir ve ErrorMessage özelliğine verilen uyarıyı, aksi durumda kullanıcıya göstermektedir.Bu ErrorMessage özelliğine verdiğimiz değer manuel olduğundan dolayı, sitemizin o anki seçilen dili ne olursa olsun aynı manuel dilde yazılacaktır.Bu ve buna benzer Attribute’larda çoklu dil desteği veren özellikler mevcuttur.Bu yazımda, bu Attribute’ların (Required ve StringLenght Attribute’lari) çoklu dil desteğine uygun hale getirmeyi göreceğiz.Ama konumuzun ana içeriği bunlardan dolayı değildir.LocalizedDisplayNameAttribute isminde bir Attribute yazacağız.Buna sebep olan mevzu ise, DisplayName Attribute’unun, çoklu dil desteğine uygun bir yapı vermemesidir.Evet biraz uzun oldu ama DisplayName özelliği gibi, herhangi bir property ye verdiğimiz Attribute sayesinde, o anki seçili dile uygun isimleri gösterecek Attribute’u yazmak bu yazının ana konusudur.

Öncelikle bundan önceki yazılarımda genellikle kullanmışlığım olan, Required ve StringLenght Attribute’larinin çoklu dil desteğine uygun bir biçimde oluşturalım.

Konuya devam etmeden önce, Asp.NET MVC Çoklu Dil Fonksiyonları – 1 ve Asp.NET MVC Çoklu Dil Fonksiyonları – 2 başlıklı yazılara göz atmanızı tavsiye ediyorum.

Örnek olarak, herhangi bir veri modelimizde, örnek bir tablonun kolonları üzerinde, Required ve StringLength Attribute’larıyla özellikleri verelim.Ancak aksi durumda kullanıcının karşılaşacağı mesajın, o anki dil yapısına uygun bir biçimde verilmesini sağlayalım.

        [DisplayName("Kolon 1 :")]
//Kolon1 propertysi "Kolon 1 :" adında gözükecektir.
        [Required(ErrorMessageResourceName = "Kolon1HataRequired", ErrorMessageResourceType = typeof(Resources.lang))]
//Kolon1 propertysi boş bırakıldığı zaman, "lang" ismindeki Resource dosyasında "Kolon1HataRequired" ismindeki Name alanındaki Value değeri yazılacaktır.
        [StringLength(15, ErrorMessageResourceName = "Kolon1HataStringLength", ErrorMessageResourceType = typeof(Resources.lang))]
//Kolon1 properysi en fazla 15 karakter olabilecek, aksi taktirde "lang" ismindeki Resource dosyasında "Kolon1HataStringLength" ismindeki Name alanında Value değeri yazılacaktır.
        public int Kolon1{ get; set; }

        [DisplayName("Kolon 2")]

        [Required(ErrorMessageResourceName = "Kolon2HataRequired", ErrorMessageResourceType = typeof(Resources.lang))]

        [StringLength(15, ErrorMessageResourceName = "Kolon2HataStringLength", ErrorMessageResourceType = typeof(Resources.lang))]

        public string Kolon2 { get; set; }

Yukarıdaki kodları incelersek eğer, Required ve StringLength Attribute’larının “ErrorMessageResourceName” özelliğine Resource dosyamızdaki Name alanındaki adı verirken, “ErrorMessageResourceType” özelliğine ise, Value değerini çalıştıracak Resource dosyasını belirtiyoruz.

Eğer bu şekilde kullanırsak, aksi durumlarla karşılaşıldığı zaman o anki dil yapısıyla kullanıcıya bildirim yapabiliriz.

Ancak dikkat ederseniz, DisplayName Attribute’unda direkt Resource dosyasına bağlanma gibi bir şansımız olmadığından dolayı yukarıdaki kodlarda manuel olarak isim vermek zorunda kaldım.

Peki ben DisplayName Attribute’unun değeri Türkçe dil yapısında “Kolon 1” olan bir kolonu, İngilizce dil yapısında “Column 1” olarak nasıl değiştirebilirim? sorusunun yanıtı, LocalizedDisplayNameAttribute isminde bir Attribute yazmaktır.Aslında bu ismi vermek zorunda değiliz.Standartı bozmamak için, bir yapı olarak kullanacağımızdan dolayı Attribute’umuzu bu isimde yazacağız.

Bu Attribute’un yazımına başlamadan önce, msdn.microsoft.com sitesinde bulunan LocalizedDisplayNameAttribute Class ve LocalizedDisplayNameAttribute Members başlıklı yazıları inceleyebilirsiniz.Şimdi LocalizedDisplayNameAttribute isimli Attribute’u muzun nasıl yazıldığını inceleyelim.

Önceki yazılarımda Attribute yazmayı irdelemiştik.Anımsarsanız eğer, MVC’de Attribute yazmak için, oluşturduğumuz sınıfı “Attribute” sınıfından türetmemiz gerekmekteydi.LocalizedDisplayNameAttribute Attribute’unu yazarken,”Attribute” sınıfından değil “DisplayNameAttribute” sınıfından türeteceğim.Çünkü, “DisplayNameAttribute” sınıfı “Attribute” sınıfından türediği için, doğal olarak Attribute olarak kullanılabilecek yapıda olacaktır.

using System;
using System.ComponentModel;
using System.Reflection;
//System kütüphansi dışında, ComponentModel ve Reflection kütüphanelerini projemize ekliyoruz.
namespace MvcApplication15.Attributes
{
    public class LocalizedDisplayNameAttribute : DisplayNameAttribute
    {
        PropertyInfo KeyDegeri;
        Type LangResource;
        //Hangi dil yapısının olduğunu söyleyen sınıf tipi
        public string NameDegeri { get; set; }
        //Resource dosyasında ki Name değerimi tutacak değişken
        public LocalizedDisplayNameAttribute(string NameDegeri)
            : base(NameDegeri)
        {
            this.NameDegeri = NameDegeri;
        }
        public Type _LangResource
        {
            get { return LangResource; }
            set
            {
                LangResource = value;
                KeyDegeri = LangResource.GetProperty(NameDegeri, BindingFlags.Static | BindingFlags.NonPublic);
            }
        }
        public override string DisplayName
        {
            get
            {
                if (KeyDegeri == null)
                {
                    return base.DisplayName;
                }
                return (string)KeyDegeri.GetValue(KeyDegeri.DeclaringType, null);
            }
        }
    }
}

Attribute’umuzu yukarıdaki gibi yazıyoruz.Kodları izah konusunda derin bir detay olduğu için bu alanı atlıyorum.Şimdi yazdığımız bu Attribute’u kullanalım.

        [LocalizedDisplayName("KategoriDisplayName", _LangResource = typeof(Resources.lang))]
        public int Kolon1{ get; set; }

Yukarıda gördüğünüz gibi, Kolon1 adına sahip propertynin DisplayName Attribute’una denk olan LocalizedDisplayName Attribute’unda, Resource dosyasının Name alanında bulunan “KategoriDisplayName” alanının Value değeri, o an kullanılan dil yapısına göre yazılacaktır.

Artık bu yazımında sonuna gelmiş bulunmaktayız.Faydalanmanız dileğiyle.
Bir sonraki yazımda görüşmek üzere..
İyi çalışmalar..

Bunlar da hoşunuza gidebilir...

1 Cevap

  1. indirim kodu dedi ki:

    asp.net core ile beraber Display artık extend edilemiyor.

Bir cevap yazın

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

*