eray aydoğdu

jQuery and ASP.NET MVC fanatic.

MVC 3 Custom Helper Yaratmak

HTML helper lar viewlerimizi karışık programatik kodlardan kurtarark temiz ve sade bir görünüm kazanmasını sağlar. System.Web.Mvc.HtmlHelper class’ında birçok HTML helper bulunmakta ancak biz kolayca kendi helper ımızı yaratacağız. MVC 1 kullanırken extension methodlar kullanarak kendi helper’larımızı oluşturabiliyorduk. Ancak şimdi Razor view engine ‘nin yeni özelliği olan @helper keyword ‘ünü kullanarak bu işlemi ne kadar kolay yapacağımızı göreceğiz.

Extension Method helpers

Asp.Net MVC ‘nin önceki sürümlerinde HtmlHelper class ına extension methodlar yazmamıza izin veriyordu. MVC 3 te de bunu yapabiliyoruz. Helper lar sadece string döndüren birer methodlardır, bu yüzden çok basitler. MVC Music Store örneğinden yola çıkalım. Uzunluğunu verdiğimiz string değeri kesen bir truncate helperı yapalım.

Extension method un static class olması gerekiyor ve genellikle proje yapısından farklı bir klasöre ayırmakta fayda var.

Kod standart extension method mantığında. İlk parametre olan this keyword u bunun bir HtmlHelper uzatması olduğunu belirtiyor. Diğerleri basit string döndürmek için. Method bir string ve uzunluk alıyor. Eğer string uzunluktan fazla ise uzunluğu kırpıp string i geri döndürüyor.

using System.Web.Mvc;
namespace MvcMusicStore.Helpers
{
public static class HtmlHelpers
{
public static string Truncate(this HtmlHelper helper, string input, int length)
{
if (input.Length <= length)
{
return input;
}
else
{
return input.Substring(0, length) + "...";
}
}
}
}

Not: Uzatmasını yaptığımız HtmlHelper System.Web.WebPages ta değil System.Web.Mvc de tanımlandığından emin olalım. Bu ifade önemli.

Yeni yarattığımız helper namespace'sini ister web.config dosyasında tanımlayarak tüm viewlerde kullanabilirsiniz, isterseniz de razor view engine in özelliği olan @using keyword ü ile sadece o sayfada tanımlayabilirsiniz.

Şimdi yazdıklarımızı deneleyim default olarak gelen index sayfasında deneyeceğiz.

@{
ViewBag.Title = "Home Page";
}
@using RazorHelpers.Helpers
<h2>@Html.Truncate(ViewBag.Message as string, 8)</h2>

Dikkat edilecek bir noktada burada ViewBag.Message ı string olarak cast etmeliyiz. Aksi takdirde sayfa render  olurken compiler hatası alabiliriz.

Alternatif olarak istersek web.config dosyasındaki pages>namespace lere eklersek @using keyword ü ile tanımlamadan kullanabiliriz.

Inline Razor Helper

Razor da inline helper yapmak için sadece @helper bloğu açmak yeterli.

@{
ViewBag.Title = "Home Page";
}
@helper TruncateString(string input, int length)
{
if (input.Length <= length) {
@input
} else {
@input.Substring(0, length)<text>...</text>
}
}
<h2>@Truncate(ViewBag.Message, 8)</h2>

Kod çok basit ancak bir kaç farklılık var,

  • Razor syntax ına göre method adıyla dönüş tipi bitişik yazılıyor.
  • this HtmlHelper gibi işlere girmemize gerek yok çünkü bir extension method değil.
  • Input u string e çevirmek zorunda değiliz Razor engine bunu ayırt edebiliyor.
  • Extension method olmadığı için diren @Truncate() olarak kullanabiliyoruz, @Html.Truncate() yazmamıza gerek yok.

İhtiyaçlarınıza göre helper lar yazarak, geliştirerek kendine ait güçlü kolay ve kullanışlı bir helper kütüphanesi oluşturabilirsiniz.