İster Asp.NET ister PHP gibi farklı alanlarda web projeleri üzerinde çalışın.Ama bu farklı platformların en önemli ortak noktalarından birisi de, SEO(Arama Motoru Optimizasyonu)’ dur.Bu yazımızda MVC’de SEO temelleri olan Meta Tag yazımını göreceğiz.
Eğer şuanda bu yazıyı okuyorsanız, “bu herif yazacak bişey bulamadı, yazmış olmak için yazıyor” diye düşünüyor olabilirsiniz.Evet ben olsam böyle düşünürdüm :). Ancak konumuz bir MVC projesinde veritabanındaki Meta taglarını Html’de <meta..> tagları arasında göstermekten ibaret değil.Aslında önceki bir yazımda(biraz konudan bahsettikten sonra o yazının linkinide vereceğim) anlatmış olduğum bir mevzuya tekrardan değineceğim.Demek ki, bana göre MVC’de dikkat edilmesi gereken bir nokta var.Bende bunu ısrarla sizlere sunuyorum.Sanırım bir kaç farklı durumla da aynı konu üzerinde karşılaşacağız 🙂
Her neyse..
Şimdi bu durum neymiş ondan bahsedeyim.Eğer beni takip ediyorsanız önceki yazılarımdan bu durumu belki anımsarsınız 😉
Projemizde bulunan her sayfa için bir Meta Tag gösterilmesini istiyorum.Şimdi en zahmetli iş ne olacaktır.Her defasında Controller’ımız da tetiklenmiş Action metodumuza gidip, veritabanındaki ilgili tablodan Meta bilgilerini çekip, View katmanında bunları Meta etiketleri arasına yazdırmak olacaktır.
Tabi her Action metodumuz da teker teker meta etiketlerini çekeceğimize bu işlemi yapacak bir Attribute yazacağız.Bu Attribute sayesinde bir Session oluşturulacaktır ve Meta bilgileri bir kere çekildikten sonra her kullanıcı için gözükecektir.
Yani bir kere sistem adına bir Session değeri üretilecek ve bu Session içinde Meta bilgileri tutulacaktır.Bu Session’dan da sitemize giren her kullanıcının talebi için, View katmanında meta etiketleri gösterilecektir.
Herkes için ortak bir işlem olacağından dolayı, StringDictionary sınıfından üretilen bir nesne sayesinde bu Session nesnesi tek seferde herkes için üretilecektir.
MVC’de LanguageSessionControl Attribute’u Yazmak başlıklı yazımı incelerseniz eğer, bu konuyla yapısı paralel boyuttadır.(Yukarıda bahsettiğim yazım bu)
İşte benim üzerine durduğum nokta da budur.Sitemizde ki tüm kullanıcılar için oluşturulabilen ortak bir değer ve bu yapıyı bir Attribute tarzında kullanabilmemiz.Ne kadar güzel öyle değil mi? 🙂
Evet artık pratik bilgi ışığında hareket edelim.Şimdi bu anlattıklarımızı programatik olarak özetleyelim.Tabi öncelikle, veritabanımızda “MetaTable” adında bir veritabanı ve içinde Meta bilgilerimizin tutacak olan tablo ve kolonlar mevcuttur.(Tablo adı MetaEtiketleri-Kolonlar description ve keywords)
Şimdi Attribute’umuzu yazalım.Ben Attribute’un adına “MetaEtiketleriAttribute” ismini veriyorum.
public class MetaEtiketleriAttribute : ActionFilterAttribute
{
public static StringDictionary MetaSession = new StringDictionary();
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
VeriTabaniDataContext Veri = new VeriTabaniDataContext();
if (MetaSession.Count == 0)
{
MetaEtiketleri Meta = Veri.MetaEtiketleris.SingleOrDefault();
MetaSession.Add("keywords", Meta.keywords);
MetaSession.Add("description", Meta.description);
}
base.OnActionExecuting(filterContext);
}
}
Yukarıda ki kod yapısını incelerseniz eğer, static yapıda olan, StringDictionary tipinden bir MetaSession isminde nesne oluşturmuş olduk.İşte bu nesne sayesinde herkes için tek ve ortak bir Session değeri oluşturmuş oluyoruz.
OnActionExecuting metodu ise, bildiğimiz gibi, bu Attribute’un tanımlandığı Action metoduna çalışma talebi geldiği anda, bu metod çalışmaktadır.Daha sonra Action metodu çalışmaktadır.
Gördüğünüz gibi, Meta taglarımız veritabanında çekilim StringDictionary nesnemize eklenmektedir.Yani her kullanıcı için bir kere bu nesneye çekilmektedir.
Bu Attribute’umuz sitemizin Meta Taglarını çekip, Html kısımda gerekli etiketlerinde yayınlamamıza yarıyor.MVC mimarisinin işleyiş prensibi, önce Controller çalışır daha sonra View katmanı.Eee haliyle önce çalışacak olan Controller’da biz bu Attribute’u çalıştıralım.Yani hangi Controller’da Meta etiketlerini çağırmak istiyorsak, bu yazdığımız Attribute ile o Controller’ı işaretlemeliyiz.
Mesela ben “Home(Controller)” ismindeki Controller sınıfımızı bu Attribute ile işaretliyorum.
[MetaEtiketleri]
public class HomeController : Controller
{
public ActionResult Index()
{
ViewData["Message"] = "Welcome to ASP.NET MVC!";
return View();
}
public ActionResult About()
{
return View();
}
}
Gördüğünüz gibi “MetaEtiketleriAttribute” adındaki Attribute’umuzla “Home(Controller)” ismindeki Controller sınıfını işaretledik.Bundan sonra bir kullanıcı Index ya da About ismindeki Action metodları tetiklerse, Attribute’umuz çalışacaktır.Sonra Action metod çalışacaktır.
Artık sayfalarımız da, StringDictionary tipinden oluşturulan Session nesnemizde tutulan Meta değerlerini, gerekli etiketlerinin arasına yazabiliriz.View katmanında “Home” klasörü içerisindeki “Index” isimli sayfaya aşağıdaki gibi düzenleme yapıyorum.
<meta name="description" content='<%: MetaEtiketleriAttribute.MetaSession["description"] %>'>
<meta name="keywords" content='<%: MetaEtiketleriAttribute.MetaSession["keywords"] %>'>
“MetaEtiketleriAttribute” isimli sınıfımızda zaten bir satır meta değeri çekip, StringDictionary tipinden olan MetaSession nesnemize atamıştık.Haliyle MetaSession nesnemizden Indexer yardımıyla anahtar sözcüklerini yazarak değerlerine ulaşabiliyoruz.
Şimdi veritabanımız da “MetaEtiketleri” tablosuna, bir satır veri girelim.
Eğer sayfamızı çalıştırırsak, kaynak kodlarında aşağıdaki gibi sonuç göreceğiz.
Evet artık yazımızın sonuna gelmiş bulunmaktayız.Ancak son noktayı koymadan önce bu makale de üzerinde durduğum noktayı son kez özetlemek istiyorum.MVC projelerinde bir işlemi her kullanıcı için ve her Action metod da sürekli yaptırmak yerine, tek sefer de, her kullanıcı için ortak değerler oluşturmayı görmüş olduk.Meta Tag konusu üzerinde bu nazik konuyu pekiştirmiş olduk.
Faydalanmanız dileğiyle…
İyi çalışmalar..