Model üzerinde Validation ayarlarını yapabiliriz, model tarafında kontrol edilen validationlar Server isteğinden sonra dönüş sağlamaktadır. Client-Side validation için eklememiz gereken jquery kütüphaneleri ve Kendi Validation kontrollerimizi tanımlamayı bu yazıda göreceğiz.
Bir önceki derste Validation kullanımı ile ilgili Controller üzerinde bazı kontroller yaparak validationları tetiklemiştik.
Ancak modeli birden fazla formda kullanma durumunda , her Action Controllerde tekrar tekrar kontrol kodları yazmak durumunda kalacağız. Bunun önünce geçebilmek için Model üzerinde gerekli Validation kontrollerini yazabiliriz. (System.ComponentModel.DataAnnotations;
)
Öncelikle Register.cs Modelimizde yapmış olduğumuz düzenlemelere bir göz atalım.
using BlogProject.Entity.Infrastructure;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text;
namespace BlogProject.Entity
{
public class Register
{
public int ID { get; set; }
[Required(ErrorMessage = "Kullanıcı adı boş bırakılamaz.")] // Zorunlu olarak işaretler , string değerler var sayılan olarak zorunlu değildir.
//ErrorMessage girmezsek varsayılan mesaj metni gösterilecektir. (startup.cs içerisinde mvc alanına yapılan tanımlama)
[StringLength(maximumLength: 12, MinimumLength = 4, ErrorMessage = "Kullanıcı adınız 4-12 karakter arasında olmalıdır.")]//StringLengt ile karakter sayı kontrolü yapabiliyoruz.
[RegularExpression(@"^(?!.*\.\.)(?!.*\.$)[^\W][\w.]{4,12}$", ErrorMessage = "Kullanıcı adınız hatalıdır.")]
[Display(Name = "Kullanıcı Adı")] // Başlık olarak Görünmesini istediğimiz text metin.
public string UserName { get; set; }
[Required(ErrorMessage = "Eposta adresinizi girmelisiniz")]
[Display(Name = "Eposta adresiniz")]
[RegularExpression(@"^([0-9a-zA-Z]([-\.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$", ErrorMessage = "Eposta adresiniz hatalıdır")] // Email kontrolü sağlar, domain için 2 karakter zorunluluğu vardır.
public string Email { get; set; }
[Required(ErrorMessage = "Parola girmediniz")]
[Display(Name = "Şifre")]
[RegularExpression(@"^.*(?=.{8,})(?=.*[\d])(?=.*[\W]).*$", ErrorMessage = "Şifreniz en az 8 karakter, en az 1 özel karakter ve en az 1 rakam barındırmalıdır.")]
public string PassWord { get; set; }
//[Required(ErrorMessage ="Şifreyi tekrar giriniz")]
[Display(Name = "Şifre tekrar")]
[Compare("PassWord", ErrorMessage = "Şifreler uyuşmuyor")]// Karşılaştırma sağlar.
[NotMapped] // NotMapped Alanı veritabanına kaydedilmemesi için işaretler
public string RePassword { get; set; }
[UIHint("Date")]
public DateTime? BirtDate { get; set; }
//[MustBeTrue]
[Range(typeof(bool), "true", "true", ErrorMessage = "Kullanım koşullarını onaylamalısınız")]
public bool TermsAccepted { get; set; }
}
}
[Required] : Zorunlu alan şartı oluşturur. [Required(ErrorMessage="Hata mesajı")] şeklinde kullanılır.
[StringLength(maximumLength: 12, MinimumLength = 4, ErrorMessage = "Kullanıcı adınız 4-12 karakter arasında olmalıdır.")] : StringLengt ile karakter maksimum , minimum karakter kontrolü yapabiliyoruz.
[RegularExpression(@"^(?!.*\.\.)(?!.*\.$)[^\W][\w.]{4,12}$", ErrorMessage = "Kullanıcı adınız hatalıdır.")] : Expression kodları sayesinde istediğimiz formatta veri girişi kontrolü yapabiliriz. Eposta, telefon no, TC kimlik no , Telefon vs.
[Display(Name = "Kullanıcı Adı")] : Başlık olarak Görünmesini istediğimiz text metin.
[NotMapped] : NotMapped Alanı veritabanına kaydedilmemesi için işaretler
[UIHint("Date")] Tarih formatında veri bekler.
Hazır kontroller dışında kendimiz de kontroller oluşturabiliriz.
Infrastructure klasorune / MustBeTrueAttribute.cs isimli class'ı oluşturuyoruz. adının sonuda Attribute olmalı.
Daha sonra bu classa Attribute , IModelValidator ü referans olarak veriyoruz.
public class MustBeTrueAttribute : Attribute, IModelValidator
IModelValidator üzerinde çıkan balonda Interface i aktif edip kod bloklarını oluşturuyoruz.
public IEnumerable<ModelValidationResult> Validate(ModelValidationContext context)
{
}
MustBeAttribute.cs (True mi kontrol et) içeriği
if bloğu içerisinde oluşturduğumuz şartlara göre geri dönüş sağlatıyoruz.
(Bu kısımla ilgili Client-Side hata mesajlarını almada sorun yaşadım. Şu an Server üzerinde işlem yaptıktan sonra hata mesajını döndürüyor.)
using Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BlogProject.Entity.Infrastructure
{
public class MustBeTrueAttribute : Attribute, IModelValidator
{
public bool IsRequerid => true;
public string ErrorMessage { get; set; } = "Lütfen kullanım koşullarını onaylayınız";
public IEnumerable<ModelValidationResult> Validate(ModelValidationContext context)
{
var value = context.Model as bool?;
if (!value.HasValue || value.Value==false)
{
return new List<ModelValidationResult> {
new ModelValidationResult("",ErrorMessage)
};
}
else
{
return Enumerable.Empty<ModelValidationResult>();
}
}
}
}
MustBeTrue bool olarak tanımlandığı için , Register.cs Modelinde bool değer dönüşü bekleyen alanlarda kullanılabilir.
Örneğin Kullanım koşullarının kabul edilip edilmediğini MustBeTrue fonksiyonu ile kontrol edebiliriz.
[MustBeTrue]
//[MustBeTrue(ErrorMessage="Yeni hata mesajı yazabiliriz.")]
public bool TermsAccepted { get; set; }
[MustBeTrue] de yazmış olduğumuz hata mesajını değiştirmek için [MustBeTrue(ErrorMessage="Yeni Hata mesajımız")] diyebiliriz.
Bu şekilde kendi fonksiyonlarımızı yazarak Birden fazla yerde kullanılabilecek Validation kontrolleri oluşturabiliriz.
Bir sonraki derste görüşmek üzere Allah'a emanet olun.