Asp.Net Core MVC FluentValidation

Bu gönderide bir .net core örnek projesi yapacağız ve bu projede validation işlemlerini kolaylaştıran FluentValidation kütüphanesini kullanacağız.

Intro

Mvc projelerinde validation işlemleri DataAnnotation attributeleri ile sağlanıyor bu yöntem ile modelin okunurluğu düşük oluyor. aşağıdaki gibi bir model hem biraz karışık hem de komplike durumlar için yetersiz kalıyor. Örneğin Name alanı dolu ise username zorunlu olsun gibi bir zorunluluğu yapamayız. Ayrıca ilgili modelimizin tek bir görevi olmalı (ViewModel, entity vs.) validasyon işlemlerini farklı bir obje yapmalı.

DataAnnotations

Projenin oluşturulması ve Paketlerin yüklenmesi

Visual Studio 2022 ve .net 5.0 seçeneğiyle projeyi oluşturuyoruz. (fluentvalidation .net 6.0 tamamen desteklemiyor 27 kasım 2021 itibariyle)

Nuget üzerinden aşağıdaki paketi kuralım

Models klasörü içine bir student objesi oluşturalım

Validators adında bir klasör açıp içine StudentValidator adında bir class oluşturalım.

Oluşturduğumuz validatoru startupda kaydedelim.

Validatoru kaydetmenin birden çok yolu var services.AddTransient<IValidator<Student, StudentValidator>(); gibi bir yöntemde izlenebilir ama bizim tercihimiz daha hızlı ve daha temiz olduğu için assembly şeklinde oldu. böylece bütün abstractvalidator nesnesini miras alan validatorler otomatik kayıt olacak.

Oluşturduğumuz validator şimdilik basit olacak, daha sonra daha komplike durumlar için düzelteceğiz.
Şimdi StudentController açıp bir Create actionu ve view’ı oluşturalım.

StudentController.cs

Student/Create.cshtml

Çalıştırıp baktığımızda validaton elementleri içine otomatik eklediğini göreceğiz.

Kaydet tıklayıp breakpointle baktığımızda ModelState.IsValid false dönecektir.

Temel düzeyde validasyon işlemlerini yaptık şimdi işleri biraz daha komplike edelim. validatoru aşağıdaki gibi değiştirelim.

StudentValidator.cs

Bu durumda hem mesaj içeriklerini değiştirmiş olduk hem de sadece Türk Öğrenciler için T.C girilmesini zorunlu hale getirdik.

Create.cshtml

Client Validation

Bu doğrulamaların hepsini server kaynaklı yaptık, daha büyük bir modelde her seferinde servera gidip cevap almak biraz maliyetli olabilir bunun önüne geçmek için jqueryvalidate ve jquery.validate.unobtrusive kütüphanelerini kullanacağız. Layout.cshtml’e aşağıdaki iki scripti ekleyelim.

Şimdi formu kaydettiğimiz zaman servera gitmeyecek fakat jquery validation sadece temel işlemleri sağlıyor notempty, length vs. gibi doğrulamalarda servera gitmeden uyarıyı veriyor, ama when() kullandığımız komplike durum için servera gitmesi gerekli.

Sonuç

FluentValidation kütüphanesi ile validation işlemlerimizi çok daha kolay ve hızlı yapabiliriz. Validation kurallarını bir sürü yöntemle çeşitlendirebilirsiniz. Bu kütüphaneyi sadece mvc değil apilerinizde de kullanabilirsiniz.

Başka bir yazıda görüşmek üzere 🙂

You may also like...

Leave a Reply

Your email address will not be published.

English