Asp.NET MVC – Include Edilmeyen Property’nin HTML Taglarına Bind Edilememesi
Merhaba,
Makalemiz içerik olarak oldukça dar bir kapsamda karşılaştığımız bir probleme odaklı anlatım ve çözüm içereceğinden dolayı anlaşıldığı üzere durumu izah eden doğru bir başlık seçmekte zorlandım doğrusu. Asıl anlatmak istediğim, Asp.NET MVC mimarisinde property’nize html elemanlarını bind edemiyorsanız, bu durumun olası sebeplerinden birisi olan Metadata class’ıyla ilgili içeriği bu makalede bulabileceksiniz.
Şimdi konuyu biraz geçmişten ele alalım.
Hatırlarsanız eğer yıllar önce MVC Validation başlıklı makalemi yazmıştım. İlgili makale içerisinde, MVC yapılanmalarında kullandığımız modellere validasyon tanımlayabilmek için MetadataType attribute’unu kullanıyor ve bu niteliğe verdiğimiz sınıfta modelimizin validasyonlarını barındırıyorduk.
İşte bu validasyon yapılandırma çalışmaları sırasında gözümüzden kaçan bazı ufak noktalar nice hatalara ve zorluklara sebep doğurmaktadır.
Şimdi sizlere bir örnek olay üzerinden Model içerisinde bulunan bir propertynin neden html taglarına bind edilmediğini izahate çalışacağım.
[Bind(Include = "Id, Adi, Soyadi, Memleketi")]
[MetadataType(typeof(MetadataPersonel))]
public class Personel
{
public int Id { get; set; }
public string Adi { get; set; }
public string Soyadi { get; set; }
public string Memleketi { get; set; }
public string Meslegi { get; set; }
}
Yukarıda “Personel” isminde bir model oluşturmuş oldum. Dikkat ederseniz modelimiz “Bind” attribute’u ile işaretlenerek ‘Id’, ‘Adi’, ‘Soyadi’ ve ‘Memleketi’ propertyleri include edilerek validasyon işlemine tabi tutulacakları bildirilmiş. Ama dikkat ! ‘Meslegi’ propertysi bind edilmemektedir. Birazdan bu fark üzerine ‘Meslegi’ propertysinde html taglarına bind sıkıntısı yaşayacağız.
“MetadataPersonel” isimli Metadata class’ımızın içeriğine de göz atmamız gerekirse eğer;
public class MetadataPersonel
{
public int Id { get; set; }
[Required(ErrorMessage = "Lütfen adınızı boş geçmeyiniz.")]
public string Adi { get; set; }
[Required(ErrorMessage = "Lütfen soyadınızı boş geçmeyiniz.")]
public string Soyadi { get; set; }
[Required(ErrorMessage = "Lütfen memleketinizi boş geçmeyiniz.")]
public string Memleketi { get; set; }
}
görüldüğü üzere bind edilen tüm propertylerimize örnek validasyonlar gerçekleştirilmiş ama velakin ‘Meslegi’ propertysi buraya da eklenmemiştir.
Şimdi sıra bir Post sürecinde bu modelin süreçteki davranışlarını izlemeye geldi.
@model WebApplication14.Models.Personel
@using (Html.BeginForm("OrnekPost", "Home", FormMethod.Post))
{
@Html.TextBoxFor(t => t.Adi)
<br />
@Html.TextBoxFor(t => t.Soyadi)
<br />
@Html.TextBoxFor(t => t.Memleketi)
<br />
@Html.TextBoxFor(t => t.Meslegi)
<br />
<input type="submit" value="Post" />
}
Dikkat ederseniz eğer modelimizin tüm propertyleri bir TextBox’a bind edilmiş. Bakalım butona tıklandığında nasıl bir Model post edilmektedir.

Görüldüğü üzere ‘Meslegi’ propertysi TextBox’a bind edilmemiş. O yüzden ilgili TextBox’a yazılan değer property tarafından taşınamamaktadır.
Eee! Peki bunun sebebi nedir? sorusuna yanıtımızı aslında makalemizin gidişatında vermiş bulunmaktayız. İlgili propertynin bind edilmemiş olması bu duruma sebebiyet vermektedir.
Yapmamız gereken, kullanmasakta ilgili propertyi bind etmeli ve Meta data classına eklememiz gerekmektedir.
[Bind(Include = "Id, Adi, Soyadi, Memleketi, Meslegi")]
[MetadataType(typeof(MetadataPersonel))]
public class Personel
{
public int Id { get; set; }
public string Adi { get; set; }
public string Soyadi { get; set; }
public string Memleketi { get; set; }
public string Meslegi { get; set; }
}
Aslında yapmış olduğumuz bu bind sorunun çözümü için yeterlidir. Lakin ileriye dönük bir yatırım olması, bir daha uğraşmamanız için Meta data class’ına da propertyi eklemenizi tavsiye ederim.
public class MetadataPersonel
{
public int Id { get; set; }
[Required(ErrorMessage = "Lütfen adınızı boş geçmeyiniz.")]
public string Adi { get; set; }
[Required(ErrorMessage = "Lütfen soyadınızı boş geçmeyiniz.")]
public string Soyadi { get; set; }
[Required(ErrorMessage = "Lütfen memleketinizi boş geçmeyiniz.")]
public string Memleketi { get; set; }
public string Meslegi { get; set; }
}
Bu işlemden sonra post işlemine göz atarsak eğer;

Evet… Görüldüğü üzere göz ardı ettiğimiz bir işlem neticesinde bizleri yorabilecek bir sorunla karşılaşmaktayız. Haliyle şu çözümü keşfedene kadar akla karayı seçebilirsiniz 🙂
O yüzden daima bu konuda temkinli olmakta fayda var 😉
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Merhaba,
Burada 2 class kullanıyoruz.
“Personel” class ı üzerinde Required uyguladıyamıyormuyuz sadece.
İkici bir class a ihtiyaç duymamızın nedeni nedir.
Merhaba,
Metadata sınıfı üzerinden Validasyon kontrollerini uygulamak herhangi bir karışıklığı engellemektedir. Bunun duşundan direkt olarak Personel sınıfı üzerinden validasyon uygulaması oluyor mu? bilmiyorum. Deneyiniz… Neticesini bana da bildiriniz.
Sevgiler.