MVC Attribute Oluşturma

Bu yazımda, genellikle kontrol ve doğrulama işlemlerinde kullanılan attribute kavramını ve attribute oluşturmayı irdeleyeceğiz.Attribute, metod kavramında olduğu gibi, bir kere yaz her yerde kullan düşüncesiyle geliştirilmiş yapılardır.

Attribute’lar arka planda nesneler üzerinden işlem yaparlar ve aslında birer nesnedirler.İki tür attribute yapısı bulunmaktadır.

  • CLR içinde gelen attribute
  • Yazılımcının kendisinin oluşturduğu attribute

Attribute’lar hakkında detaylı bilgi edinmek istiyorsanız, C#’ta Nitelikler (Attributes) başlıklı yazıyı inceleyebilirsiniz.
Attribute’lar aşağıdaki gibi kullanılmaktadırlar.

        [AttributeAdi]
        public void Metodumuz()
        {

        }
//veya
        [AttributeAdi]
        public class Classımız
        {

        }

Asp.NET Web Form mimarisinden ziyade, Asp.NET MVC mimarisinde daha yoğun attribute kullanımı yapmaktayız.Haliyle, bugüne kadar MVC konularıyla ilgilenen biri farkında olsun ya da olmasın attribute kavramını kullanmıştır.MVC ile ilgili yazılarımı kronolojik olarak incelerseniz eğer, Model ve Controller katmanında olsun, başka sınıflarda olsun attributelar kullanmıştık.

MVC’de kullandığımız bazı attributeları şöyle bi hatırlayalım..

[HttpPost]

Controller katmanında Post işleminden sonra çalışacak metodu gösteren attribute.

[Bind(Include = "..")]

Model katmanında hangi propertylerin validation işlemlerine tabii tutulacağını Bind eden attribute.

[MetadataType(typeof(Sinif))]

Model katmanında, “Bind” attributeu ile işaretlenen propertylerin kontrollerinin hangi sınıfta yapılacağını söyleyen attribute.
Yukarıda MVC’de kullandığımız bazı attributelar verilmiştir.Eğer bu yazıyı okuyorsanız, MVC hakkında az çok bilginiz var demektir.O halde bu attributeların metodlar üzerinde nasıl yapıda bulunduklarını rahatça anımsayabilecek seviyedesinizdir.Zaten yazımın ilk başlarında attributeların nasıl kullanıldıklarını yazmış olduğumdan, bu attributeların nasıl kullanıldıklarını gösterme lüzumu görmüyorum.

Bu yazıda, bir attribute nasıl oluşturulur onu irdeleyeceğimizi belirtmiştik.Ben örnek olarak, “Authorize” attributeuna benzer bir nitelik oluşturacağım.

Authorize, Asp.NET MVC Membership yapısında bir güvenlik attributeudur.Membership dediğimiz yapı, üyelik yapısı olduğu için, bende her projemde bu gibi durumları kendim hazırlayıp yazma ve oluşturma taraflısı olduğum için, Membership konusuna hakim değilim.Bu yüzden Authorize isimli attributea ve Membership konusuna bu yazımda ve sanırım hiç bir yazımda yer vermeyeceğim.

Ancak Authorize attributeunun işlevini şöyle detaylandırabilirim.Controller katmanında herhangi bir Authorize nitelikli ActionResult tipinden metod çalıştırıldığı zaman, eğer üye girişi yapılmış ise bu metod çalıştırılacak ve View katmanındaki gerekli dosyası açılacaktır, yok eğer üye girişi yapılmamış ise bu metod çalışmayacaktır ve üye giriş sayfasına yönlendirilecektir.

Anlayacağınız, Authorize attributeunu kullandığım ActionResult tipinden olan metoduma, sisteme giriş yapmayanların erişebilmesini engelleme işlemi yapmaktadır.

Benim bu yazımda oluşturacağım örnek ise, aynı işlemi yapacak olan bir attribute yazmaktır.Ancak bu yazacağım attribute’un içeriğinde sadece basit bir kontrol bulunacaktır.

O halde örneğimizi yapmaya başlayalım.

Oluşturduğumuz herhangi bir MVC projesine “Attributelar” isminde bir klasör ekliyorum ve içine “GirisGuvenligi.cs” adında bir sınıf ekliyorum.Bu sınıf içersinde attribute oluşturacağım.Aşağıdaki kodları inceleyiniz.

using System.Web.Mvc;
namespace MVCAttribute.Attributelar
{
    public class GirisGuvenligi : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (HttpContext.Current.Session["Giris"].ToString() == "0")
            {
                filterContext.HttpContext.Response.Redirect("/Giris/Kontrol");
            }
            base.OnActionExecuting(filterContext);
        }
    }
}

Yukarıdaki kodları incelerseniz eğer, “GirisGuvenligi” ismindeki sınıfımıza, “ActionFilterAttribute” sınıfından kalıtım aldırıyoruz.Daha sonra, “OnActionExecuting” metodunu override edip, içinde Session’da “Giris” isimli değişkenin değerinin “0” olup olmadığını kontrol ediyoruz.Eğer “0” ise, “Giris(Controller)” ismindeki Controller sınıfında bulunan “Kontrol” isimli ActionResult tipinden bir sınıfı çalıştıracaktır.Eğer “0” değilse, yapılacak işleme devam edecektir.

“Giris(Controller)” isimli Controller sınıfına da göz atarsak eğer,

using System.Web.Mvc;
using MVCAttribute.Attributelar;
//Attributelar klasörünü kullanabilmek için buraya eklemeliyiz.
namespace MVCAttribute.Controllers
{
    public class GirisController : Controller
    {
        public ActionResult Index()
        {
            if (Session["Giris"] != null)
                Session.Add("Giris", "1");
            else
                Session["Giris"] = "1";

            return View();
        }
        public ActionResult Kontrol()
        {
            return View();
        }
        [GirisGuvenligi]
        public ActionResult GirisYap()
        {
            return View();
        }
    }
}

Yukarıdaki gördüğünüz gibi, “Giris(Controller)” isimli Controller sınıfının bütün ActionResult tipinden metodları bunlardır.Bu metodların View katmanlarında “Giris” klasörü içinde dosyaları oluşturulmuştur.Mantık olarak, öncelikle “Index” metodunu çalıştırıp Session’daki “Giris” değerini doldururuz.”GirisGuvenligi” ismini verdiğimiz attributeumuzu “GirisYap” metodumuzda kullanmışız.Eğer bu metodumuz çalıştırılırsa, “GirisGuvenligi” isimli attribute işleve girer ve Session’daki “Giris” değişkenindeki değere göre ya bize GirisYap sayfasını açar ya da Kontrol sayfasına yönlendirir.

Yukarıdaki kodlarda, “Index” metodunda, Session’daki “Giris” değişkenine “1” değeri atandığından dolayı, “GirisYap” metodu çağrıldığı zaman yönlendirme işlemi olmadan sayfası açılacaktır.Aksi taktirde, “0” diye değiştirip, projeyi başlatırsak eğer, “GirisYap” metodunu çağırdım zaman, Kontrol sayfasına yönlendirecektir.

Eğer, bir Controller sınıfı içinde bütün metodlara güvenlik almak istiyorsak, hepsine teker teker attribute tanımlayacağımıza Class’a bir kere tanımlamamız yeterli olacaktır.

    [GirisGuvenligi]
    public class GirisController : Controller
    {
       ...
    }

Bu yazımızı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...

5 Cevaplar

  1. CİNO MARZANO dedi ki:

    Teşekkürler, ufak birkaç değişiklikle çalıştı.
    Tam istediğim birşeydir.

  2. fuat dedi ki:

    Teşekkürler faydalı bir paylaşım.

  1. 23 Nisan 2016

    […] ne zamanlar MVC Attribute Oluşturma başlıklı yazımda Asp.NET MVC mimarisine özel Attribute oluşturma konusunu ele almıştım. […]

Bir cevap yazın

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

*