MVC Data Annotations, MVC’de en çok kullanılan kavramlardan biride hiç şüphesiz Attribute’ler olmaktadır bu makalemizde Data Annotations namespace’i altında yer alan Attribute’leri göreceğiz
MVC Data Annotations Nedir? Nasıl Kullanılır?
DataAnnotations Attribute’lerini kullanmak için alttaki namespace’leri ekleyin.
1 2 | using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; |
MVC Data Annotations Türleri
Attribute | Açıklama |
---|---|
Key | Alanın birincil anahtar olduğu belirtilir ve veritabanı oluşturulurken otomatik artan sayı olarak ayarlanır. |
Required | Alanın zorunlu olduğu belirtilir |
Column | Alanın veritabanındaki alanı ile ilgili ayarları belirtilir örnek veritabanında oluşacak olan alanadı(Name), tür adı(TypeName) veya Order(Sira – Çoklu Key kullanımında kullanılır) |
DataType | Alanın veritürü belirtili örnek DataType’lar şu şekildedir. Date,Time,Currency,EmailAdress,Password v.b |
HiddenInput | Alanın sayfada gösterilmemesini sağlar ama veri server’a gönderilir sadece kullanıcıdan gizlenir. |
ReadOnly | Alanın sadece okunabilir özelliğine sahip olması için kullanılır. |
DisplayFormat | Sayfaya bastırılacak fotmat bilgisi belirlenir genellikle Tarih, Saat, Sayı formatlama gibi durumlarda kullanılır. |
Table | Veritabanında oluşacak tablonun adı(Name) veya Şema(Schema)’sı belirtilir. |
StringLength | Girilecek karakter sayısını sınırlamada kullanılır. |
RegularExpression | Regex neredeyse tüm programlama dillerinde kullanılan bir doğrulama desenidir. |
Range | Sayısal değerler için aralık belirtmede kullanılır. |
Remote | Kaydın varolup olmadığını kontrol etme örnek sayfa yenilemeden girilen kullanıcı adının var olup olmadığını kontrol etme. |
Compare | Karşılaştırma yapmak için kullanılır örnek girilen ili şifrenin aynı olup olmamasını karşılaştırma. |
ScaffoldColumn | Düzenlenmesini istemediğimiz model özelliği için kullanılır. Böylece bu alan EditorForModel kullandığımızda gizlenecektir. Örneğin, modelin id sini kendimiz belirlemiyoruz. Bu özelliği veritabanına bırakıyoruz. Dolayısıyla bu alan için ScaffoldColumn niteliği kullanabiliriz. |
Sırasıyla üstteki tabloda yer alan attribute’lerimizi açıklamaya çalışalım
Key
1 2 | [Key] public string Id { get; set; } |
Üstteki kodda Id alanının primary key(birincil anahtar) özelliğine sahip olduğunu belirtiyoruz böylece oluşturulacak veri tabanında bu alan otomatik olarka birincil anahtar olacak ve otomatik artan sayı olarak ayarlanacaktır.
Sırasıyla üstteki tabloda yer alan attribute’lerimizi açıklamaya çalışalım
Required
1 2 | [Required(ErrorMessage = "{0} alanı gereklidir.")] public string Kategori { get; set; } |
Üstteki şekilde bir tanımlama sonucunda Kategori alanının boş geçilemeyeceğini belirtiyoruz ve boş geçildiği taktirde Kategori alanı gereklidir şeklinde bir uyarı çıkacaktır. alttaki gibi
Eğer ErrorMessage tanımlamasakdık otomatik olarak şöyle bir cümle tanımlanmış ve gösterilmiş olacaktı “The Ad field is required.” null veya boş değer girilmeye çalışıldığında bu hata ile karşılaşmanız olasıdır.
ReadOnly
Bu niteliği kullandığımız özellik değiştirelemez, sadece görüntülenir. Kullanımı;
1 2 | [ReadOnly(true)] public decimal Ucret { get; set; } |
DisplayFormat
Model özelliğini formatlı göstermek için kullanabiliriz. Örneğin;
1 2 | [DisplayFormat(ApplyFormatInEditMode=true, DataFormatString="{0:c}")] public decimal Ucret { get; set; } |
Şeklinde bir kullanımda, bu alanın çıktısı şöyle olacaktır:
12.50 TL
ApplyFormatInEditMode
özelliği varsayılan olarak false dur. Eğer bu formatlı görüntünün input içerisinde de görünmesini istiyorsak true yaparız.
Şimdi ise DogumTarihini dd/MM/yyyy formatında yazdıralım eğer format belirtmezsek dd/MM/yyyy hh:mm:nn formatında uzunca gereksiz rakamlar çıkacaktır.
1 2 | [DisplayFormat(DataFormatString="{0:d}", NullDisplayText = "Dogum Tarihi Girilmemiş")] public DateTime DogumTarihi { get; set; } |
Tarih için üstteki formatı kullanırsanız çıktı şu şekilde olacaktır.
02-08-2014
NullDisplayText
özelliğini kullanarak NULL
dönen sonuçlar yerine bir not gösterilmesini sağlayabilirsiniz.
StringLength
Bu nitelik ile girilecek değerin karakter uzunluğunu belirleriz. Bu tanımlama ile aynı zamanda Code First geliştirmede veritabanın oluşturulacak alan içinde, bu string uzunluğu tanımlanacaktır.
1 2 3 4 | [Required(ErrorMessage = "{0} alanı gereklidir.")] [StringLength(50, ErrorMessage = "En fazla {1} karakter uzunluğunda olmalıdır.")] public string Ad { get; set; } |
şeklinde bir tanımlama yaptığımızda, 50 karakterden fazla bir girdi yazarsak alacağımız mesaj;
gibi olacaktır. Ayrıca veritabanı tablosundaki ad alanının görüntüsüde aşağıdaki gibidir.
MinimumLength özelliğide isteğe bağlıdır. Bu özellik StringLength nitaliğine bağlı bir özelliktir. Kullanımıda aşağıdaki gibidir.
1 2 3 4 | [Required(ErrorMessage = "{0} alanı gereklidir.")] [StringLength(50, ErrorMessage = "En fazla {1} karakter uzunluğunda olmalıdır.",MinimumLength=3)] public string Ad { get; set; } |
RegularExpression
Regex tüm dillerde olan bir string doğrulama desenidir. MVC de de regex için bir nitelik (attribute) vardır. Regex girilen string değerin, bizim belirlediğimiz bir kurala göre olup olmadıgını belirlemek amaçlı kullanılır.
Aslında bir mail adresinin gerçek olup olmadığı o adrese mail atıp cevap gelene kadar beklemeden anlaşılmaz. Ama en azından belli bir e-posta deseni vardır. @ sembolune kadar olan kısım kullanıcı kimligi, bu sembolden sonra, mail sirketinin kimliği, daha sonra bir nokta ve bir uzantı.
E-posta adresinin regex deseni [A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,4} şeklindedir. Bunu sınıfımızın özelliği için nitelik olarak belirlemek için;
1 2 | [RegularExpression(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,4}")] public string Eposta { get; set; } |
şeklinde kullanırız. Böylece MVC kullanıcı girdisinin bu desene uyup uymadıgını kontrol eder. Ve önceki örneklerimizde olduğu gibi bir hata mesajı verir. Tabi aslında Email için direk yazılmış nitalik var. Bunlara de deyineceğiz.
Remote
Bu nitelik sayısal değerler için aralık belirlemek için kullanılır. Örneğin bir yaş aralığı için; Bu nitelik, sunucu taraflı bir çağrı ile istemci taraflı bir doğrulama yapmak amacıyla kullanılır. Yani; örneğin, KullaniciAdi var mı yok mu diye, kontrol etmek için veritabanına gitmek gerekli. Bunu yaparken ise istemci taraflı bir doğrulama yapmak için bu niteliği kullanabiliriz. Örneğin kategori ismi için, aynı kategoriyi tekrar girilmesini istemiyorsak, kategori sınıfımızdaki Ad alanını Remote ekliyoruz;
1 2 3 4 5 | [Remote("KategoriVarmi","Kategori","Admin", ErrorMessage = "Bu {0} zaten kayıtlı. Lütfen başka bir kategori giriniz.")] [Required(ErrorMessage = "{0} alanı gereklidir.")] [StringLength(50, ErrorMessage = "En fazla {1} karakter uzunluğunda olmalıdır.")] [Display(Name = "Kategori")] public string Ad { get; set; } |
Daha sonra KategoriController sınıfına aşağıdaki metodu ekliyoruz.
1 2 3 4 5 | public JsonResult KategoriVarmi(string kategoriAd) { var result = kategoriServis.KategoriVarmi(kategoriAd); return Json(result, JsonRequestBehavior.AllowGet); } |
Kategori eğer sistemde varsa, sayfa yenilemesi olmadan bu karşılaştırma yapılarak, hata mesajı verecektir. Hata mesajı aşağıdaki gibidir.
Range
Range attribute’ünü özellikle yaş gibi bu durumlarda kullanabilirsiniz mesela projenizde kayıt işleminde yaş aralığı 18-65 arasındaki kişileri kabul ediyorsanız aşağıdaki gibi bir rande kullanımı tam ihtiyacınızı karşılayacaktır.
1 | [Range(18, 65, ErrorMessage = "Yaş 18'den küçük 65'ten büyük olamaz.")] |
Eğer iki tarih aralığında bir tarih girilmesini istersek o zaman aşağıdaki gibi bir yazım ile ihtiyacımızı karşılayabiliriz.
1 | [Range(typeof(DateTime), '01/01/2000', '01/01/2010')] |
Üstteki kodda yapılmak istenen çok basit DateTime türünde 01/01/2000 ile 01/01/2010 tarihleri arasındaki bir tarih girdirilmesini sağlayabiliriz kolaylıkla.
Compare
Bu nitelik ile örneğin kullanıcı şifresini tekrar girmesini istedigimizde bu iki şifre karşılaştırılır. Örnek kullanımı;
1 2 3 4 | public string Sifre { get; set; } [Compare("Sifre")] public string SifreTekrar { get; set; } |
şeklinde bir tanımlama yaparsak, iki textbox içine girilen değerler otomatik olarak karşılaştırılır.
ScaffoldColumn
Düzenlenmesini istemediğimiz model özelliği için kullanılır. Böylece bu alan EditorForModel kullandığımızda gizlenecektir. Örneğin, modelin id sini kendimiz belirlemiyoruz. Bu özelliği veritabanına bırakıyoruz. Dolayısıyla bu alan için ScaffoldColumn
niteliği kullanabiliriz. Örnek kullanımı;
1 2 | [ScaffoldColumn(false)] public int Id { get; set; } |
📝 MVC Data Annotations Özeti
MVC’de kullanılabilecek tüm Data Annotations’lara bu makalede yer vermeye ve anlaşılması açısında örnek kodlar ile ayrıca görseller ile desteklemeye çalıştım. Umarım faydası olur ve ihtiyaç karşılar.
📚 MVC Data Annotations Benzer Makaleler
- ASP.NET MVC ile cshtml Dosyasında Helper Oluşturma ve Kullanma
- ASP.NET MVC ActionResult Türleri Ve Açıklamaları
- ASP.NET MVC İle Kendi Doğrulama Attribute’lerimizi Hazırlama
- ASP.NET MVC ViewStart Nedir ve Kullanımı
📚 MVC Data Annotations Kaynakları
✍ Lütfen olumlu-olumsuz tüm görüşlerinizi bana yorum yada mail yolu ile iletmeyi ihmal etmeyin.
🔗 Sosyal medya kanallarından makaleyi paylaşarak destek olursanız çok sevinirim.
👋 Bir sonraki makalede görüşmek dileğiyle.
sağol
sağolasın çok işime yaradı
Teşekkürler hocam örneklerle beraber çok açıklayıcı olmuş.
Rica ederim, yorumunuz içinde ben teşekkür ederim