MVC Validation
Web projelerimizde bazı durumlar için Client tabanlı önlemler almak isteyebiliriz.Günlük hayatta kullandığımız internet teknolojisinde, bireysel bilgiler üzerinden işlemlerimizi gerçekleştiriyoruz.Bazen e-posta adresimizi, bazen vatandaşlık numaramızı vb.. internetteki işlemin talebi sonucunda kullanıma tabii tutuyoruz.Bu gibi önem teşkil eden bilgilerin doğruluk derecelerini onaylamadan işlem yapan bir Web projesi sağlıklı sonuçlar üretmemektedir.Biz bu gibi durumlarda Client tabanlı olarak Asp.NET Validation kontrollerine baş vururduk.Ancak şimdi MVC’de Model katmanında Validation işlemleri nasıl yapıldığını inceleyeceğiz.
Asp.NET MVC’de, klasik Asp.NET Web Forms’lardaki Validation kontrollerini istesek kullanabiliriz.Ancak MVC’de sayfamızın html kod kısmında html kontrolleriyle çalışabildiğimizden dolayı, Controller katmanında oluşturacağımız işlemler sonucunda Validation yapısını kullanacağız.
Şimdi, herhangi bir isimde Asp.NET MVC projesi oluşturup mevzuya girelim.
Öncelikle, “DenemeDatabase” adında bir veritabanımız olduğunu varsayalım ve bu veritabanında “Kategoriler” adındaki bir tabloda aşağıdaki gibi kolonlar olduğunu düşünelim..
| Kategoriler |
| ID |
| KategoriAdi |
| KategoriAciklamasi |
| KategoriElemanlari |
Bu tablonun Model katmanında bir modelini oluşturalım.”Kategori.cs” isimli sayfada oluşturuyorum.
---Kategori.cs---
public class Kategori
{
public int ID { get; set; }
public string KategoriAdi { get; set; }
public string KategoriAciklamasi { get; set; }
public string KategoriElemanlari { get; set; }
}
Şimdi ise, Controller katmanımızda “Kategori(Controller)” adında bir sınıf oluşturalım.Bu sınıfımızı oluştururken, Create,Delete,Details ve Update metodlarını oluşturtalım.
---KategoriController.cs---
public class KategoriController : Controller
{
public ActionResult Index()
{
return View();
}
public ActionResult Details(int id)
{
return View();
}
public ActionResult Create()
{
Kategori YeniKategori = new Kategori();
return View(YeniKategori);
}
[HttpPost]
public ActionResult Create(FormCollection collection)
{
try
{
return RedirectToAction("Index");
}
catch
{
return View();
}
}
public ActionResult Edit(int id)
{
return View();
}
[HttpPost]
public ActionResult Edit(int id, FormCollection collection)
{
try
{
return RedirectToAction("Index");
}
catch
{
return View();
}
}
public ActionResult Delete(int id)
{
return View();
}
[HttpPost]
public ActionResult Delete(int id, FormCollection collection)
{
try
{
return RedirectToAction("Index");
}
catch
{
return View();
}
}
}
“Kategori(Controller)” adındaki Controller sınıfımızın sadece, “Create” adındaki metodunun View katmanında dosyasını oluşturalım.”Create” metoduna sağ tıklayarak “Add View” diyelim.Burada dikkat etmemiz gereken nokta, “View content” menüsünden “Create” seçeneğini seçmemiz gerekiyor.
View katmanında, “Kategori” ismindeki klasörün altında oluşan “Create.aspx” isimli sayfanın kaynak kodları aşağıdaki gibidir.
---Create.aspx---
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MvcApplication9.Models.Kategori>" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
Create
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>Create</h2>
<% using (Html.BeginForm()) {%>
<%: Html.ValidationSummary(true) %>
<fieldset>
<legend>Fields</legend>
<div class="editor-label">
<%: Html.LabelFor(model => model.ID) %>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.ID) %>
<%: Html.ValidationMessageFor(model => model.ID) %>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.KategoriAdi) %>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.KategoriAdi) %>
<%: Html.ValidationMessageFor(model => model.KategoriAdi) %>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.KategoriAciklamasi) %>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.KategoriAciklamasi) %>
<%: Html.ValidationMessageFor(model => model.KategoriAciklamasi) %>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.KategoriElemanlari) %>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.KategoriElemanlari) %>
<%: Html.ValidationMessageFor(model => model.KategoriElemanlari) %>
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
<% } %>
<div>
<%: Html.ActionLink("Back to List", "Index") %>
</div>
</asp:Content>
Eğer, projemizi çalıştırıp “Kategori(Controller)” isimli Controller’ımızdaki “Create” isimli ActionResult tipinden olan metodumuzu çağırırsak karşımıza aşağıdaki gibi ekran gelecektir.

Yukarıdaki ekran görüntüsüne dikkat edersek eğer,
Kırmızı olarak işaretlenmiş, “A” harfi ile sembolize ettiğim alan Create.aspx sayfasının html kodlarında “ <%: Html.LabelFor(model => model.ID) %>” alanında yazdırılmaktadır.Model katmanımızdaki, “Kategori” isimli sınıfımızda bulunan “ID” isimli propertynin direkt olarak property name ini yazmıştır.Validation ile buraya istediğimiz ismi vereceğiz.
Yeşil olarak işaretlenmiş, “B” harfi ile sembolize ettiğim alan Create .aspx sayfasının html kodlarında ” <%: Html.TextBoxFor(model => model.ID) %>” alanında yazdırılmaktadır.Mesela yeni bir kategori ekleme işlemi yapacağımız için, “ID” değerini biz manuel olarak değilde, primary key olarak otomatik attırmamız daha mantıklı gelmektedir.O halde, buradaki TextBox nesnesinin sadece okunabilir özellikte olması gerekmektedir.Bunuda Validation ile sağlayacağız.
Sarı olarak İşaretlenmiş, “C” harfi ile sembolize ettiğim alan Craete.aspx sayfasının html kodlarında “<%: Html.TextBoxFor(model => model.KategoriAdi) %>” alanında yazdırılmaktadır.Burada da, istediğimiz gibi boş kontrolü veya herhangi bir değerle karşılaştırma kontrolü yapabiliriz.Aynı şekilde bunuda Validation kontrolleri ile sağlayacağız.
Artık mevzuya girme zamanı geldi.Create.aspx sayfasında değiştirilebilir olarak ayarladığımız ve Create işlemi sonucunda post edilebilecek olan alanlar, “ID”,”KategoriAdi”,”KategoriAciklamasi” ve “KategoriElemanları” olduğundan dolayı, Model katmanında bulunan “Kategori” sınıfı üzerinde bir attribute tanımlayarak bu alanları bind edeceğim.
System.Web.Mvc namespacei içinde bulunan, attribute aşağıdaki gibi “Kategori” sınıfına eklenecektir.
[Bind(Include="ID,KategoriAdi,KategoriAciklamasi,KategoriElemanlari")]
public class Kategori
{
public int ID { get; set; }
public string KategoriAdi { get; set; }
public string KategoriAciklamasi { get; set; }
public string KategoriElemanlari { get; set; }
}
Eğer, burada herhangi bir property ismini yazmazsak, o property Validation işlemine tabii tutulmayacaktır.
Şimdi haliyle, Validation kurallarının koyulacağı sınıfı bu “Kategori” sınıfına belirtmemiz gerekiyor.Bunun için bir tane daha attribute eklenecektir.
System.ComponentModel.DataAnnotations namespacei içinde bulunan, attribute aşağıdaki gibi “Kategori” sınıfına eklecektir.
[Bind(Include="ID,KategoriAdi,KategoriAciklamasi,KategoriElemanlari")]
[MetadataType(typeof(Validation_Kontrol))]
public class Kategori
{
public int ID { get; set; }
public string KategoriAdi { get; set; }
public string KategoriAciklamasi { get; set; }
public string KategoriElemanlari { get; set; }
}
Gördüğünüz gibi, “[MetadataType(typeof(Validation_Kontrol))]” adındaki attribute ile “Kategori” sınıfında yapılacak Validation komutlarını “Validation_Kontrol” isimli sınıfta oluşturabileceğiz.
Ben projeye, “Class” adında bir klasör ekledim ve içine “Validation_Kontrol” isminde bir sınıf ekledim.Artık Validation komutlarımı bu sınıf içinde oluşturabilirim.
Şimdi, mantıksal akış şemasını sizlere açıklamak istiyorum.”Kategori(Controller)” ismindeki Controller sınıfında bulunan “Create” isimli metodumuz çalıştırıldığı zaman, bir “Kategori” tipinden nesne üretilecektir.Bu nesne üretilirken, “[MetadataType(typeof(Validation_Kontrol))]” attribute u, çalışacaktır ve “Validation_Kontrol” adındaki sınıfa gidecektir.
“Validation_Kontrol” sınıfına geldikten sonra, Bind edilen propertyler ile ilgili özellikler verilmiş mi, verilmemiş mi onları kontrol etmektedir.
Şimdi “Validation_Kontrol” isimli sınıfımızın kodlarını yazalım.
class Validation_Kontrol
{
[DisplayName("Kategori ID")]
//Bu attribute artık property ismini değil, "Kategori ID" ismini gösterecektir.
[Required(ErrorMessage="Lütfen boş geçmeyiniz."]
//Bu attribute sayesinde bu property boş geçilemez.Eğer boş olarak Post işlemi yapılırsa, "Lütfen boş geçmeyiniz." diye uyarı verecektir.
public int ID { get; set; }
[DisplayName("Kategori Adı")]
[Required(ErrorMessage="Lütfen kategori adı giriniz")]
[StringLength(100,ErrorMessage="Kategori adı 100 karakterden fazla olamaz.")]
//Bu attribute sayesinde, bu propertye maximum 100 karakter girilebileceğini gösteriyoruz.Eğer 100 karakteri geçerse, "Kategori adı 100 karakterden fazla olamaz" diye uyarı verecektir.
public string KategoriAdi { get; set; }
[DisplayName("Kategori Açıklaması")]
[StringLength(250,ErrorMessage="Kategori açıklaması 250 karakterden fazla olamaz.")]
public string KategoriAciklamasi { get; set; }
[DisplayName("Kategori Eleman Sayısı")]
public string KategoriElemanlari { get; set; }
}
Yukarıda gördüğünüz gibi, “Validation_Kontrol” isimli sınıfımızda Validation kontrollerini yapmış bulunmaktayız.Şimdi projemizi çalıştırıp, Create Action’ını talep edersek eğer, aşağıda gördüğünüz gibi, property isimleri yerine “DisplayName” attribute undaki isimler gelmiştir.

Ancak, yukarıda yaptığımız kontrollerin aksine TextBox nesnelerini doldurursak ve boş bırakırsak, Create butonuyla Post işlemi yaptıktan sonra, anında Client tabanlı bir güvenlikten ziyade, Post işlemimizi kabul edecektir.
Bunun sebebi, “Kategori(Controller)” ismindeki Controller sınıfımızda kontrol yapmadık.Kalıbımız belli ama kontrolümüz yok 🙂
Öncelikle, “Kategori(Controller)” sınıfımıza gelip, “Create” metodunun 2. overloadına(Post işlemi sonrasında çalışacak olanına) aşağıdaki gibi bir kontrol sağlıyoruz.
[HttpPost]
public ActionResult Create(Kategori GelenKategori)
{
try
{
if (!ModelState.IsValid)
{
return View(GelenKategori);
}
return RedirectToAction("Index");
}
catch
{
return View();
}
}
Burada ModelState.IsValid ile, Model katmanında “Kategori” sınıfımızda aldığımız Validation önlemlerini kontrol etmekte ve geriye bool tipinden değer dönmektedir.Eğer, Validation işlemlerinde geçerli durum söz konusuysa, bize true dönecektir.Yani bu durumda bütün şartlarımız doğru olacağından dolayı, Post işlemi gerçekleşmelidir.Ha yok eğer, Validation işlemlerin geçersiz durum varsa False dönecektir ve Post işlemi olmayacaktır.Bu durumda, önceden Create overloadında oluşturulan Kategori nesnesi, buradaki GelenKategori parametresinde tutulacağından dolayı, geri View katmanına gönderilecektir.
Eğer projemizi çalıştırıp, Post işlemini denersek, Validation işlemlerinin çalıştığını göreceğiz.

Yukarıdaki görüntüde, kırmızı yazılarla gelen uyarı yazılarımız ise, Create.aspx sayfasının kaynak kodundaki “<%: Html.ValidationMessageFor(model => model.ID) %>” alanından gelmektedir.
Bu yazımızda da, MVC’de Validation işlemlerine giriş yapmış olduk.Umarım detaylı bir biçimde konuyu ele almışızdır.
Bir sonraki yazımda görüşmek üzere..
İyi çalışmalar..

2 Cevaplar
[…] eğer yıllar önce MVC Validation başlıklı makalemi yazmıştım. İlgili makale içerisinde, MVC yapılanmalarında […]
[…] eğer yıllar önce MVC Validation başlıklı makalemi yazmıştım. İlgili makale içerisinde, MVC yapılanmalarında […]