Asp.Net MVC Html Helpers Nedir ?



MVC sayfalarımızı geliştirirken sunum (View) katmanında dinamik içerik kullanmamızı sağlayan özelliklerden biriside html helpers isimli sistemdir. Bu sistem sunum katımızdan metod çağrıları yapabilmemize olanak tanır. Bir helper basit bir metin çıktısından oluşabileceği gibi çok karışık işlemler yaparak ürettiği sonuçları döndüren bir yapıda olabilir.

Html helpers tanımları bir taraftan Html içerisinde daha temiz bir kodlama sağlarken diğer taraftan tek noktadan yönetim sayesinde farklı yerlerde kullandığımız işlemleri basit ve hızlı bir şekilde değiştirme imkanı sunmaktadır.



Html helper tanımlamak oldukça kolaydır. Bir statik sınıf üzerine inşa edilen helper sınıfının basit bir kaç özelliği vardir. Öncelikle bir helper sınıfının tanımlanmış en temel haline bakalım.

1
2
3
4
5
6
7
8
9
10
11
12
using System.Web.Mvc;
namespace HtmlYardimcilari.Helpers
{
    public static class HtmlHelpers
    {
        public static string BirMetot(this HtmlHelper helper)
        {
            return "Merhaba Dicle";
        }
    }


Örnekte temel bir helper sınıfı tasarımı görünüyor. Sizinde gördüğünüz gibi helper sınıfları static anahtar sözcüğü ile işaretlenmelidir. Ayrıca helper metodları this HtmlHelper türünde bir parametre almalıdır. HtmlHelper türünün System.Web.Mvc isim alanında bulunduğunuda örnek kodlardan görüyoruz.

Sınıfımızı ve gerekli metotları oluşturduktan sonra sıra geldi sunum (View) katmanından bu metoda çağrıda bulunup ilgili değeri elde etmeye, bunun için sunum (View) sayfasına sınıfımızın bulunduğu isim alanını (namespace) eklememiz gerekir. Bunun ardından tıpkı diğer helper metodları gibi yeni eklediğimiz metoda çağrıda bulunabiliriz. Kodlarımız şöyle olmalı

?
1
2
3
4
5
6
@using HtmlYardimcilari.Helpers
@{
    ViewBag.Title = "Index";
}
@Html.BirMetot()
Şimde gelin beraber örnek bir helper sınıfı hazırlayalım. Örneğimiz için şöyle bir senaryomuz olduğunu düşünelim. Bir web uygulaması geliştiriyoruz ve kullanıcıya faklı sayfalarda tarih bilgisi göstermek istiyoruz. Böyle bir durumu MVC tarafında ViewBag veya ViewData ile çözebileceğiniz gibi Html tarafında bir javascript ile de çözebilirsiniz. Tabi herbirinin avantaj ve dezavantajlarını analiz etmek gerekir. Bizim konumuz bu olmadığı için şimdilik bunları bir tarafa bırakalım ve bu işi html helpers ile yapmaya karar verdiğimizi düşünelim. Bunun için şöyle bir sınıf hazırlıyoruz.
?
1
2
3
4
5
6
7
public static class HtmlHelpers
{
    public static string VerTarihBugun(this HtmlHelper helper)
    {
        return DateTime.Now.ToString("dd.MM.yyyy");
    }
}
Bu basit helper sınıfımız bize sadece bugünün tarih bilgisini veriyor. Görüldüğü gibi metodumuz HtmlHelpers isimli statik bir sınınfın statik bir metodu olarak tanımlanıyor. Ayrıca HtmlHelper türünden bir parametre alıyor. Bu metodu kullanmak istediğimizde yani sayfamıza tarih bilgisi yazdırmak istediğimizde yapmamız gereken sadece bu helper metodu çağırmak, bunun içinde şöyle bir kod yazıyoruz.

@Html.VerTarihBugun()
Sayfamız serverde işlenip tarayıcıya geldiğinde bu kodu yazdığımız yerde bugün tarihini görüyor olacağız. Gördüğünüz gibi oldukça sade ve basit bir kullanımı var. Ayrıca bu kodlar ayrı bir sınıf olarak hazırlandığından dolayı daha sonra tekrar kullanılabilirliği çok daha kolay olacaktır. Aslında bu noktada helper hakkındaki gerekli bilgilere sahipsiniz. Ancak biraz daha pratik yapmak ve bilgilerimizi pekiştirmek adına senaryomuzu biraz daha geliştirelim. Mesela uygulamamızın geliştirme esnasında şöyle bir durum oldu. Bu tarih bilgisi güzel çalışıyor ama bize ay ve gün isimlerini içeren bir tarih bilgisi gerekti. Gelin VerTarihBugun() metodumuzu kısa tarih ve uzun tarih verecek şekilde yeniden organize edelim. Bunun için ben kullanıcıdan bir parametre isteyerek tarih bilgisini seçebileceğim bir karar yapısı kurdum ve kodlarımız şöyle oldu.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static class HtmlHelpers
{
    public static string VerTarihBugun(this HtmlHelper helper, string format)
    {
        if (format == "kisa")
        {
            return DateTime.Now.ToString("dd.MM.yyyy");
        }
        else
        {
            return DateTime.Now.ToString("dd.MMMM.yyyy dddd");
        }
    }
}
Burada kullanıcı parametre olarak kisa gönderirse kısa format aksi taktirde uzun formatlı tarih bilgisi gönderiliyor. Ancak biz şimdiye kadar yaptığımız kodlamalarda bu metodu hep parametresiz kullanmıştık. Şimdi ise bizden bir format parametresi istiyor. Dolayısıyla eski metot çağrıları hata verecektir. Böyle bir durumda yeni bir metot tanımlayabileceğiniz gibi mevcut metodun parametresine varsayılan bir değerde verebilirsiniz. Ben parametreye varsayılan bir değer vererek bu sorunu çözmek istiyorum. Kodlarım artık şu hale geldi.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static class HtmlHelpers
{
    public static string VerTarihBugun(this HtmlHelper helper, string format = "kisa")
    {
        if (format == "kisa")
        {
            return DateTime.Now.ToString("dd.MM.yyyy");
        }
        else
        {
            return DateTime.Now.ToString("dd.MMMM.yyyy dddd");
        }
    }
}
Kodları incelediğinizde göreceğiniz gibi format parametresi için kisa değerini varsayılan değer olarak atıyorum. Böylece VerTarihBugun() metodu hem daha önce kullandığım hemde yeni kullanacağım çağrı şekillerini destekler hale geldi. Artık aşağıdaki iki şekildede metodu çağırabilirim.
?
1
2
@Html.VerTarihBugun()
@Html.VerTarihBugun("Uzun")
Bu her iki çağrıda metot tarafından kabul edilecek ve ilgili bilgi geri döndürülecektir. Format seçimi için kullandığımız metin kriteri aslında çok güvenli değil. Örneğin uzunun U harfi büyük ve kısa kriteri kisa olarak yazılıyor. Yanılıpta kisa yerine kısa yazılabilir, belki bu metot için böyle bir yanlış çok önemli değil ama farklı metotlarda üstelik program akışına karar verilen bir noktada böyle bir yanlışlık hiç istenmeyen sonuçlara sebep olabilir. Bu nedenle hem alışkanlık kazanmak hem de işi doğru yapmak adına daha iyi bir kodlama yapmayı deneyelim. Ayrıca bu metodu kullanacak başka bir programcı kısa ve uzunu nereden bilecek? İşte tüm bunları düşürken imdadımıza enum sabitleri yetişiyor. Yazı yeterince uzadığı için enum konusuna girmiyorum. Siz isterseniz başka kaynaklardan gerekli bilgiyi edinebilirsiniz. Gelelim bizim metodumuzda enum bize nasıl yardımcı olacak. Öncelikle enum ile güzelleşen kodlarımıza bir bakalım.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public enum TarihFormat { Kisa, Uzun };
public static class HtmlHelpers
{
    public static string VerTarihBugun(this HtmlHelper helper, TarihFormat format = TarihFormat.Kisa)
    {
        if (format == TarihFormat.Kisa)
        {
            return DateTime.Now.ToString("dd.MM.yyyy");
        }
        else
        {
            return DateTime.Now.ToString("dd.MMMM.yyyy dddd");
        }
    }
}
Burada öncelikle TarihFormat isimli bir enum tanımlıyoruz. Ardından format parametremizin türünü TarihFornat yaparak, bu metodu kullanacak kişiyi TarihFormat seçeneklerinden birini seçmesi için yönlendiriyoruz. Aynı zamanda format parametremize varsayılan olarak kısa formatı atıyoruz. Şimdi artık herşey çok daha net ;)
?
1
2
@Html.VerTarihBugun()
@Html.VerTarihBugun(TarihFormat.Uzun)
Gördüğünüz gibi metotlarımız artık çok daha anlaşılır bir şekilde kullanıma açıldı. Böylece bu metodu kullanacak programcı için parametre seçimi çok daha kolay bir hale geldi.

Kaynak: http://www.zafercelenk.net/post/2013/03/26/AspNet-MVC-Html-Helpers.aspx

Yorumlar

Popüler Yayınlar