ASP.NET MVC Kullanıcı Kontrollerinde ViewData‘yı Anlamak

ASP.NET MVC ile çalışırken, geliştiriciler sıklıkla verilere görünümleri ve kullanıcı kontrollerine etkili bir şekilde geçmeleri gereken durumlarla karşılaşırlar. Kullanıcı kontrolünde ViewData koleksiyonu aracılığıyla verilere erişmeye çalışırken ortaya çıkan yaygın bir soru vardır. Bu blog yazısında, belirli özelliklerin neden ViewData içinde görünmediği ve bunu nasıl uygun şekilde çözebileceğimizi inceleyeceğiz.

Problem: Kullanıcı Kontrollerinde ViewData‘ya Erişim

Bir kullanıcı kontrolü oluşturduğunuzu ve bir modelden bir mesajı ViewData koleksiyonu kullanarak render etmeye çalıştığınızı hayal edin. Kontrolörünüzde şu şekilde yazabilirsiniz:

return View("Message", new { DisplayMessage = "Bu bir test" });

Sonra, bu verilere kullanıcı kontrolünüzde şu şekilde erişmeye çalışıyorsunuz:

<%= ViewData["DisplayMessage"] %>

Ancak, beklenen mesaj yerine null değeri alıyorsunuz. Bu durum sinir bozucu olabilir ve birçok geliştiricinin aklında şu soru belirmesine neden olabilir: Neden DisplayMessage özelliği ViewData koleksiyonuna eklenmiyor?

ViewData Davranışını Anlamak

ViewData koleksiyonu anahtar-değer çiftlerini tutmak için tasarlanmıştır. Tipik bir senaryoda, bir görünümü bir anonim nesne ile geçirirken, bu nesnenin özellikleri otomatik olarak ViewData sözlüğünü doldurmaz. Bu davranış tasarım gereğidir; yani görünüm, doğrudan modelin özelliklerine erişebilir, ancak bu özelliklerin ViewData‘yı doldurması kesinlikle olmayacaktır, güçlü tip olmadan.

Neden Böyle Oluyor?

  1. Anonim Türler: Anonim bir nesne kullandığınızda (örneğimizdeki gibi), bu nesnenin özellikleri ViewData koleksiyonunda saklanmaz.
  2. Güçlü Tip Gerekir: Özelliklere erişimi daha basit hale getirmek için, güçlü bir tip modeli -bir sınıf gibi- oluşturmak faydalıdır.

Çözüm: Kullanıcı Kontrolünüzü Güçlü Tip Yapalım

Kullanıcı kontrolünüzde verileri etkili bir şekilde geçirmek ve almak için, güçlü tipli bir sınıf kullanabiliriz. Örneğin, bir MessageData sınıfı oluşturabilirsiniz:

public class MessageData
{
    public string DisplayMessage { get; set; }
}

Ardından, kullanıcı kontrolünüzü güçlü tip olarak aşağıdaki şekilde değiştirebilirsiniz:

public class MessageControl : ViewUserControl<MessageData>

Şimdi, bunu kontrolörünüzden şu şekilde çağırabilirsiniz:

return View("Message", new MessageData() { DisplayMessage = "Bu bir test" });

Ve bu özelliğe kullanıcı kontrolü içerisinde şu şekilde erişebilirsiniz:

<%= ViewData.Model.DisplayMessage %>

Alternatif Yöntem

Eğer güçlü tipli bir sınıf oluşturmak istemiyorsanız ve ViewData kullanmaya devam etmeyi tercih ediyorsanız, değeri ViewData.Eval yöntemini kullanarak erişebilirsiniz:

ViewData.Eval("DisplayMessage")

Bu yöntem, ViewData içinde özelliği arar ve var ise değeri döndürür.

Sonuç

Sonuç olarak, anonim olarak geçirilen nesnelerin özelliklerinin otomatik olarak ViewData‘da dahil edilmesini beklemek anlaşılabilir olsa da, bu ASP.NET MVC’nin modeller ile görünümler arasında verileri nasıl yönettiği nedeniyle gerçekleşmez. Kullanıcı kontrolünüzü güçlü tip yaparak veya ViewData.Eval kullanarak, arzu edilen verilere başarıyla erişebilirsiniz.

Bu nüansları anlamak, ASP.NET MVC ile olan kodlama deneyiminizi daha verimli ve keyifli hale getirecektir. İyi kodlamalar!