MVC Model Validation Kullanımı

6 Nisan 2014
Posted by Çağatay Yıldız
14638 Views
MVC

Bu yazımızda MVC de oluşturduğumuz modellere validation entegre edeceğiz. Bildiğimiz üzere validation kullanımının çeşitli platformlarda bir çok kullanım çeşidi mevcut(jquery validation , html5, asp.net validation vb.) Bu yazımızda MVC de oluşturduğumuz modellere validation ekleyip bu durumu controller da yakalayacağız. Aynı zamanda modellere eklediğimiz kimi attiribute lerle(datetime, EMail) modelimizin html ekranında formatını belirleyeceğiz. Öncelikle models klasörüme etkinlikmodel adında bir class ekliyorum.
Class ımda kullanacağım sınıflar için using kısmına aşağıda bulunan satırı ekliyorum.

using System.ComponentModel.DataAnnotations;

Oluşturduğum model ise şu şekilde

 public class EtkinlikModel
    {
        [Required(ErrorMessage="Lütfen bir ad giriniz")]
        public string Ad { get; set; }

        [DataType(DataType.Date)]
        public DateTime BaslangicTarih { get; set; }

        [DataType(DataType.Time)]
        public string BaslangicSaat { get; set; }

        [Required(ErrorMessage="Lütfen bir kişi sayısı giriniz")]
        [Range(2,6,ErrorMessage="En az 2 en çok 6 karakter giriniz")]
        public int KatilacakKisi { get; set; }

        [Required(ErrorMessage = "Email boş bırakılamaz")]
        [RegularExpression(@"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}" +
                            @"\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\" +
                            @".)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$",
                            ErrorMessage = "Email adresi geçersiz")]
        public string Email { get; set; }
    }

Oluşturduğum modeldeki yapıları inceleyelim. Ad isimli properties boş geçilmemesi için Diğer properties lere olduğu gibi Required attribute ekledim ve hata mesajını yazdırdım. Eğer ad boş geçilirse error mesaj yazılacak. BaslangicTarih ise ekranda datetime formatında görülecek, saat ise time formatında html imde gözükecek. Katılacak kişi sayısına ise boş geçilmenin yanın en az 2 en çok 6 karakter girmesini Range attribute ile sağladım. Son olarak ise EMail de belli bir format belirledim. Home controller ekleyip default olarak gelen index action a view ekliyorum. Gelelim .cshtml kısmına.

    <div>
        @using (Html.BeginForm())
        {
            @Html.ValidationSummary()
            <p>Ad: @Html.TextBoxFor(a => a.Ad)</p>
            <p>Başlangıç tarih: @Html.EditorFor(a => a.BaslangicTarih)</p>
            <p>Başlangıç saat: @Html.EditorFor(a => a.BaslangicSaat)</p>
            <p>Kişi sayısı: @Html.TextBoxFor(a => a.KatilacakKisi)</p>
            <p>EMail: @Html.TextBoxFor(a => a.Email)</p>
            <input type="submit" value="Etkinlik Ekle" />
        }
    </div>

View kısmında öncelikle ValidationSummary metodu boş geçilmesi veya belirlediğimi kurallara uyulmaması durumunda hata mesajlarını yazdıracak. Baslangicsaat ve baslangic tarih in Editor olarak tanımlanması sayfamda ona uygun bir standart çıkmasını istediğimiz için(Modelde belirlediğimiz format). Ayrıca type submit olan html elementimiz sayfanın post edilmesini sağlayacak. Burada cs.html in tepesine modeli tanımlamayı unutmayalım

@model MVCValidation.Models.EtkinlikModel

Controller kısmına bakacak olursak iki adet action a sahibim bunlardan biri view ayağa kaldıran diğer ise post edildiğinde modeli içerisine alan action

        public ActionResult Index()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Index(EtkinlikModel model)
        {
            if (ModelState.IsValid)
            {
                //doğrulama olduğu zaman yapılacak işlemler,yönlendirilecek sayfa vb.
                return View();
            }
             //doğrulama yapılmadığı takdirde ekrana aynı view getirilecek
              return View();
        }

Bu kısımda ModelState.IsValid gerekli doğrulamalardan geçtiği takdirde(boş geçilemez, doğru format vb.) true olacak ve içerisinde yazacağımız işlemleri yapacak. Doğrulama olmadığı takdirde aynı sayfa ekrana tekrar yazdırılacak. İşlem burada sona eriyor. Böylelikle modele entegre bir validation oluşturmuş oluyorum.