kralhakan2009 1
kralhakan2009
Vahsi Uzman 1
Vahsi Uzman
farkmt2official 1
farkmt2official
Bvural41 1
Bvural41
noisiv 1
noisiv
Manwe Work 1
Manwe Work
Hikaye Ekle

ASP.NET Core Model Validation – Required ve StringLength Örnekleri

  • Konuyu başlatan Konuyu başlatan Silverhand
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 1
  • Görüntüleme Görüntüleme 9

Ayyıldız2 | 2008 TR Yapısı • 1-99 Orta Emek Destan • Oto Avsız • 10 Temmuz 21:00 HEMEN TIKLA!

ASP.NET Core Model Validation – Required ve StringLength Örnekleri​


turkmmo-aspnetcore.png


Validation konusu web geliştirmede en kritik konulardan biri. Kullanıcıdan gelen veriye asla güvenmeyin, bu altın kural. Ben junior developer'ken bir projede validation koymayı ihmal etmiştim ve birisi isim alanına 50.000 karakterlik bir metin yapıştırmıştı. Veritabanı hata verdi, uygulama çöktü, müşteri aradı. O günden sonra validation konusunda paranoyak seviyesinde titiz davranıyorum. ASP.NET Core'un Data Annotations sistemi bu konuda hayatınızı gerçekten kolaylaştırıyor. Hem attribute-based hem de Fluent API tarzı validation yapabilirsiniz ama ben genelde Data Annotations ile başlıyorum, çoğu senaryo için yeterli oluyor.

Data Annotations Nedir ve Nasıl Çalışır​


Data Annotations, model property'lerinizin üzerine attribute olarak eklediğiniz validation kurallarıdır. System.ComponentModel.DataAnnotations namespace'i altında gelirler. Framework, model binding sırasında bu attribute'ları kontrol eder ve kurallara uymayan veriler için ModelState'e hata ekler. Bu sayede controller'da ModelState.IsValid kontrolü yaparak geçersiz verilerle işlem yapmayı engellersiniz.

Required attribute'u bir property'nin boş bırakılamayacağını belirtir. StringLength ise minimum ve maksimum karakter uzunluğunu sınırlar. Bu ikisi en sık kullanılan validation attribute'larıdır ve hemen hemen her formda bunlara ihtiyacınız olacak. Ama sadece bunlarla sınırlı değilsiniz tabii. Range, RegularExpression, EmailAddress, Compare gibi onlarca built-in attribute var. Ben bu derste Required ve StringLength'e odaklanacağım çünkü bunlar temel taşları oluşturuyor.

Bir şeyi daha belirtmem lazım. Data Annotations hem server-side hem client-side validation için kullanılıyor. Yani siz bir kere attribute'u koyduğunuzda hem sunucu tarafında hem de tarayıcıda validation çalışıyor. Client-side validation için jquery.validate ve jquery.validate.unobtrusive kütüphanelerinin sayfanıza dahil olması gerekiyor. Bu kütüphaneler olmadan client-side validation çalışmaz ve kullanıcı formu gönderdikten sonra hataları görür. Kullanıcı deneyimi açısından client-side validation şart.

Model Sınıfı ile Validation Kuralları​


C#:
using System.ComponentModel.DataAnnotations;

public class KayitFormuModel
{
    [Required(ErrorMessage = "Ad alanı zorunludur.")]
    [StringLength(50, MinimumLength = 2, ErrorMessage = "Ad 2-50 karakter arasında olmalıdır.")]
    [Display(Name = "Adınız")]
    public string Ad { get; set; }

    [Required(ErrorMessage = "Soyad alanı zorunludur.")]
    [StringLength(50, MinimumLength = 2, ErrorMessage = "Soyad 2-50 karakter arasında olmalıdır.")]
    [Display(Name = "Soyadınız")]
    public string Soyad { get; set; }

    [Required(ErrorMessage = "Email adresi zorunludur.")]
    [EmailAddress(ErrorMessage = "Geçerli bir email adresi giriniz.")]
    [StringLength(100, ErrorMessage = "Email adresi en fazla 100 karakter olabilir.")]
    [Display(Name = "Email Adresi")]
    public string Email { get; set; }

    [Required(ErrorMessage = "Şifre zorunludur.")]
    [StringLength(100, MinimumLength = 8, ErrorMessage = "Şifre en az 8 karakter olmalıdır.")]
    [DataType(DataType.Password)]
    [Display(Name = "Şifre")]
    public string Sifre { get; set; }

    [Required(ErrorMessage = "Şifre tekrarı zorunludur.")]
    [Compare("Sifre", ErrorMessage = "Şifreler eşleşmiyor.")]
    [DataType(DataType.Password)]
    [Display(Name = "Şifre Tekrar")]
    public string SifreTekrar { get; set; }

    [StringLength(500, ErrorMessage = "Adres en fazla 500 karakter olabilir.")]
    [Display(Name = "Adres")]
    public string Adres { get; set; }

    [Required(ErrorMessage = "Telefon numarası zorunludur.")]
    [RegularExpression(@"^05\d{9}$", ErrorMessage = "Geçerli bir telefon numarası giriniz (05XXXXXXXXX).")]
    [Display(Name = "Telefon")]
    public string Telefon { get; set; }
}

Bu model sınıfında birçok validation kuralı bir arada kullanılıyor. Dikkat ederseniz her attribute'a özel ErrorMessage tanımladım. Bunu yapmazsanız framework İngilizce default mesajlar gösterir ki Türkçe bir uygulamada bu hiç hoş olmaz. Display attribute'u da label'larda gösterilecek metni belirliyor. Bence bu detaylar küçük gibi görünse de profesyonel bir uygulama için çok önemli.

Controller Tarafı​


C#:
public class KayitController : Controller
{
    [HttpGet]
    public IActionResult Index()
    {
        return View(new KayitFormuModel());
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public IActionResult Index(KayitFormuModel model)
    {
        if (!ModelState.IsValid)
        {
            // Hatalı model geri döndür, kullanıcı hataları görsün
            return View(model);
        }

        // Validation geçti, işlemlere devam et
        // Veritabanına kaydet, email doğrulama gönder vs.
        TempData["Mesaj"] = "Kayıt başarılı! Email adresinizi doğrulayın.";
        return RedirectToAction("Basarili");
    }
}

Controller'da yapmanız gereken tek şey ModelState.IsValid kontrolü. Framework tüm validation kurallarını otomatik kontrol ediyor ve sonucu ModelState'e yazıyor. Eğer geçersiz veri varsa modeli tekrar view'a gönderiyoruz ki kullanıcı hataları görebilsin ve düzeltebilsin. Burada önemli bir nokta var, modeli geri gönderdiğinizde kullanıcının daha önce girdiği veriler korunuyor. Yani kullanıcı tüm formu tekrar doldurmak zorunda kalmıyor. Bu UX açısından çok önemli.

View Tarafı​


HTML:
@model KayitFormuModel

<form asp-action="Index" method="post">
    <div asp-validation-summary="ModelOnly" class="text-danger mb-3"></div>

    <div class="mb-3">
        <label asp-for="Ad" class="form-label"></label>
        <input asp-for="Ad" class="form-control" />
        <span asp-validation-for="Ad" class="text-danger"></span>
    </div>

    <div class="mb-3">
        <label asp-for="Soyad" class="form-label"></label>
        <input asp-for="Soyad" class="form-control" />
        <span asp-validation-for="Soyad" class="text-danger"></span>
    </div>

    <div class="mb-3">
        <label asp-for="Email" class="form-label"></label>
        <input asp-for="Email" class="form-control" />
        <span asp-validation-for="Email" class="text-danger"></span>
    </div>

    <div class="mb-3">
        <label asp-for="Sifre" class="form-label"></label>
        <input asp-for="Sifre" class="form-control" />
        <span asp-validation-for="Sifre" class="text-danger"></span>
    </div>

    <div class="mb-3">
        <label asp-for="SifreTekrar" class="form-label"></label>
        <input asp-for="SifreTekrar" class="form-control" />
        <span asp-validation-for="SifreTekrar" class="text-danger"></span>
    </div>

    <div class="mb-3">
        <label asp-for="Telefon" class="form-label"></label>
        <input asp-for="Telefon" class="form-control" />
        <span asp-validation-for="Telefon" class="text-danger"></span>
    </div>

    <div class="mb-3">
        <label asp-for="Adres" class="form-label"></label>
        <textarea asp-for="Adres" class="form-control" rows="3"></textarea>
        <span asp-validation-for="Adres" class="text-danger"></span>
    </div>

    <button type="submit" class="btn btn-success">Kayıt Ol</button>
</form>

@section Scripts {
    <partial name="_ValidationScriptsPartial" />
}

View'da asp-validation-summary="ModelOnly" kullanarak sadece model seviyesindeki hataları üstte gösteriyoruz. Her alan için asp-validation-for ile alan bazlı hataları gösteriyoruz. En altta _ValidationScriptsPartial partial view'ını eklemeyi unutmayın, bu client-side validation için gerekli JavaScript dosyalarını yüklüyor.

Sık Yapılan Hatalar ve İpuçları​


Çoğu kişinin yaptığı birinci hata, string property'lerde Required kullanmamak. C#'ta string nullable bir tip olduğu için Required koymadığınızda boş string geçerli kabul ediliyor. Bazı durumlarda bu sorun yaratır. İkinci yaygın hata, StringLength'te sadece MaximumLength vermek. MinimumLength de belirleyin, tek karakterlik isimler kabul etmek mantıklı değil.

Benim tavsiyem, validation mesajlarını her zaman Türkçe ve kullanıcı dostu yazın. "The field Ad is required" gibi mesajlar kullanıcıyı sinir eder. Bir de ErrorMessage'larda alan adını tekrar yazmak yerine {0} placeholder'ını kullanabilirsiniz, Display attribute'undaki değeri otomatik alır. Son olarak, complex validation senaryolarında IValidatableObject interface'ini implement etmeyi düşünün. Mesela "başlangıç tarihi bitiş tarihinden önce olmalı" gibi cross-property validation'lar için bu yol idealdir.
 
Emeğiniz ve katkınız için teşekkür ederiz!
Konunuz gerekli incelemelerden geçerek onaylandı. Topluluğumuza katkılarınızın devamını bekliyoruz.
İyi forumlar! 🎉
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst