Dynamic Data Web Site'larda MetaData ile sütun özelliklerini ayarlamak.

0 dakikada yazıldı

10133 defa okundu

Düzenle

.NET 3.5 SP1 ile beraber gelen Dynamic Data Web Site yapısı ile
beraber doğrudan sadece veri üzerinde çalışan web uygulamaları yazmanın
gerçekten kolaylaştığını itiraf edebiliriz. Fakat her yeni araç gibi
Dynamic Data ile beraber de istediklerimizi yapabilmek için kendine özgü
özelleştirme kurallarını bilmemiz gerek. Bu yazıda elimizde hazır bir
Dynamic Data Web Site olacak ve bu web sitesinde gösterilen
veritabanındaki bazı tablolardaki bazı sütunların gösterim esnasındaki
özelleştirmelerine değineceğiz. Cevaplayacağımız sorulardan bazıları
şunlar olacak;

Yazımızda kullanacağımız örnek siteyi yaratmak için
buradaki
yazıyı inceleyebilirsiniz.

MetaData üzerinden ayarlamalar...

Dynamic Data yapısına baktığımızda olabildiğince her şeyin otomatik
ilerlediğini görüyoruz. Örneğin bir tablonun içerisindeki tüm sütunlar
otomatik olarak söz konusu tablo ile beraber tüm sayfalarda
düzenlenebilir şekilde gözükmeye başlıyor. Sütunlarla ilgili tek tek
ayar yapmanın tek yolu söz konusu sütunlara ek MetaData bilgileri
vermek. Peki bizim sütunlarımızı kodumuzla kim tanımlıyor?

Biz projemizde LINQ2SQL kullanarak ilerlediğimiz için veritabanındaki
her bir nesneyi tanımlayan objeler LINQ'e ait DBML'in arkasında
tanımlanmış durumda. Bir DBML dosyasının arkasına baktığınızda
designer.vb veya designer.cs uzantılı dosyalar görebilirsiniz.
Bu dosyalar içerisinde veritabanındaki tüm nesnelerin birer kopyası .NET
nesneleri olarak yaratılmıştır.

[VB]

<Table(Name:="dbo.Urunler")>  _

Partial Public Class Urunler

    Implements
System.ComponentModel.INotifyPropertyChanging,
System.ComponentModel.INotifyPropertyChanged

[C#]

[Table(Name="dbo.Urunler")]

public partial class Urunler : INotifyPropertyChanging, INotifyPropertyChanged

{

Yukarıda gördüğünüz şekilde başlayan Urunler adındaki Class DBML
dosyasının arkasında duruyor ve bizim her bir ürünümüzü tanımlıyor.
Maalesef bu designer dosyalarında değişiklik yapamıyoruz. Aslında
değişiklik yapabilirsiniz fakat DBML dosyasında Visual Studio
arayüzündeki tasarım araçları ile yaptığınız her işlem bu dosyaların
sistem tarafından tekrar yaratılmasına neden olacağı için kullanıcı
tarafından yapılan tüm kod değişiklikleri kaybolacaktır. Peki bu durumu
nasıl çözeceğiz? Dikkat ettiyseniz tüm bu sınıflar Partial olarak
tanımlanmıştır yani bir başka bir dosyada tekrar Partial birer sınıf
yaratarak işlemlerimize devam edebiliriz. Bu durumda buyurun yeni bir
VB/CS dosyası oluşturalım ve Partial olarak aynı sınıftan bir adet
daha yaratalım.

[VB]

<ComponentModel.DataAnnotations.MetadataType(GetType(UrunlerMeta))> _

Partial Public Class Urunler

 

End Class

[C#]

[System.ComponentModel.DataAnnotations.MetadataType(typeof(UrunlerMeta))]

public partial class Urunler

{

 

}

Yukarıdaki koda baktığınızda özellikle en üstteki MedadataType
işaretleri dikkatinizi çekecektir. Aslında bu da bir MetaData fakat
maalesef bu şekilde Partial sınıflara doğrudan MetaData
veremiyoruz. O nedenle başka bir sınıf yaratarak MetaData'ları orada
tutacağız ve o sınıftan MedaData'ları bu tarafa aktaracağız. Kodumuz
içerisinde UrunlerMeta olarak geçen obje aslında başka bir sınıfın
adı.

[VB]

Public Class UrunlerMeta

 

    Private _Fiyati As Object

    <ComponentModel.DataAnnotations.Range(10, 20,
errormessage:="Hata!")> _

    Public Property Fiyati() As Object

        Get

            Return _Fiyati

        End Get

        Set(ByVal value As Object)

            _Fiyati = value

        End Set

    End Property

 

End Class

[C#]

public class UrunlerMeta

{

    [System.ComponentModel.DataAnnotations.Range(10, 20, ErrorMessage = "Hata!")]

    public object Fiyati { get; set;
}

}

UrunlerMeta sınıfı içerisinde sadece Fiyati adında bir
Property var. Aslında ana Urunler sınıfındaki tüm Property'leri
burada da tanımlayarak kullanabilirdik fakat şimdilik bize Fiyati
Property'si yeterli. ComponentModel.DataAnnotations altından
Range sınıfını kullanarak Fiyati değerinin 10 ile 20 arasında
olmak zorunda olduğunu ve bu durumun sağlanmaması halinde de hata olarak
"Hata!" yazısının gösterilmesi gerektiğini belirtiyoruz. Gelin bu
kodun bir de web sitesindeki yansımasına göz atalım.

Range sınıfı ile yaptığımız ayarlamalar arayüzde kendini gösteriyor.
Range sınıfı ile yaptığımız ayarlamalar arayüzde kendini gösteriyor.

Başka neler yapabiliriz?

MetaData'lar üzerinden başka neler yapılabileceği ile ilgili çok sayıda
farklı senaryo mevcut fakat en basit örnekleri inceleyebilmek için
kabaca ComponentModel.DataAnnotations sınıfına göz atmak yeterli
olacaktır. Örneğin aşağıdaki gibi bir kod istediğiniz bir kolonun web
sitesinde gösterilmemesini sağlayabilir.

[VB]

<ComponentModel.DataAnnotations.ScaffoldColumn(False)> _

[C#]

[System.ComponentModel.DataAnnotations.ScaffoldColumn(false)]

Peki ya diğer seçenekler? Gelin hızlı bir tur atalım.

DisplayColumn

Bu özellik toplam en fazla üç parametre alabilir. Amacı tablolar arası
ilişkilendirmelerde kullanıcının gördüğü metinleri değiştirmektir.
Örneğin bizim projemizde ürünlere bağlı olan kategorilerin adları
otomatik olarak her üründe gösteriliyor. Sistem aslında arka planda
Kategoriler tablosunda ID(PK) kolonundan sonra karşılaştığı ilk
String kolonu alarak göstermeye göre ayarlı. Oysa bazı durumlar FK'in
bağlı olduğu tablodan alınması gereken ve gösterilecek olan metin çok
daha ileride farklı bir sütunda olabilir. İşte DisplayColumn bunu
ayarlıyor ve bir FK durumunda ana tablodan hangi sütunun bu üründe
gösterilmesi gerektiğine karar veriyor. Bunun haricinde aldığı iki diğer
parametrenin ilki hangi kolon üzerinden Sorting yapılabileceği ve
üçüncü parametre ise Sorting işleminin ilk açılışında hangi yönde
yapılacağı verisini taşıyor.

RegularExpression

Kendisine ilk parametre olarak verilen RegEx desenini hedef kolona test
eden ve uyuşmaması durumunda da ikinci parametre olarak verilen hata
mesajının gösterilmesini sağlayan bir Validation sisteminin
entegrasyonuna yönelik olarak kullanılabilir.

Required

Sadece tek bir parametresi vardır; eşleştirildiği sütun için veri
girilmez ise gösterilmesi gereken hata mesajını String olarak alır.

ScaffoldTable

Tablo sınıflarına doğrudan verilebilen bu MetaData ile bir tablonun web
sitesi görselliğinde gösterilip gösterilmeyeceğini belirler.

StringLength

Bir sütuna girilebilecek maksimum metin uzunluğu ilk parametresi olarak
alır. İkinci parametresinde ise söz konusu uzunluk aşıldığında
gösterilecek olan hata mesajını saklar.

Sonuç

Yazı boyunda Annotation'lar içerisinde atladığım bazı seçenekler oldu.
Bu seçenekleri ileriki yazılarda daha detaylı olarak incelememiz
gerektiği için şimdilik yüzeysel olarak geçmek istemedim.

Hepinize kolay gelsin.