
March 31, 2010 09:59 by
OMR
Merhabalar, daha önce ASP.NET Dynamic Data(yazının devamında DD kısaltmasını kullanacağım) hakkında bazı bilgileri yayınlamıştım. Yeni bir makale konusunda düşünürken makale konusu olarak gerçek bir DD projesinde kullanıcı tarafından gelebilecek isteklerin hızlı bir şekilde nasıl karşılanabilineceğinden bahsetmenin uygun olduğuna karar verdim.
Yazılımcı gözüyle değerlendirmek gerekirse kullanıcı gereksinimleri konusunda gözden kaçan bir çok gereksinimi görülmeyebilir. Örneğin bir tablo içindeki kayıtların listelenmesi yazılımcı için gayet yeterlidir ancak kullanıcı gözüyle bakıldığında her şeyin listelenmesi çoğu zaman gereksiz olacaktır. Bu kapsamda kullanıcı isteklerine karşılık sorun çözümüyle alakalı makalele dizisinin ilkini yazmaya başlıyorum. Daha önceki makalelerde bahsettiğim isimlendirme, biçimlendirme vb. gibi temel işlemlere bu makalede değinmeyeceğim.
Kullanıcı tarafında tablo üzerindeki her alanın(column) görüntülenmesi istenmeyebilir. Bazı durumlarda ise tüm kayıtların listelenmesi kullanım kolaylığı açısından sıkıntılı olabilir.
Scaffolding tekniğiyle istenilen alanların tüm şablonlarda görüntülenmesini engelleyebiliyoruz. Özellikle listeleme sayfalarında tüm alanların sayfada görünür halde olması yatay olarak uzayan bir sayfaya neden olur ancak bu alanları klasik scaffolding tekniği ile gizlersek diğer şablonlardanda kayboluverir. İşte burada asıl sorun ortaya çıkıyor: Gizlenen alanların kullanıcı tarafından düzenlenmesi gerekiyorsa yada detaylı görüntüleme şablonunda tüm alanların görüntülenmesi gerekiyorsa ne yapacağız?
| |
Aletleri geliştirmek DD için her zaman kazanımdır. Bu senaryoda scaffolding tekniğini sayfa şablonlarına göre nasıl özelleştirebileceğimizi öğreneceğiz. |
Kullanabileceğimiz veri bileşenleri(GridView, FormView, DetailsView vb.) veri listeleme sırasında listeleme işlemi için IAutoFieldGenerator arayüzünü uygulayan bir sınıf ile veri alanları üzerindeki kararını verir. Varsayılan alan oluşturucularda verideki tüm alanlar DD bildirimleri uygunlandıktan sonra(scaffolding gibi kısıtlamalar vb.) listelenir. Yapılması gereken şey ise veri listeleme işini gerçekleştirme görevini yazacağımız bir sınıfın üstlenmesidir.
IAutoFieldGenerator arayüzünü uygulayan sınıfımız:
namespace Eposta.Core.CustomFieldGenerator
{
using System.Collections.Generic;
using System.Web.UI;
using System.Web.DynamicData;
/// <summary>
/// Bu sınıf veri listelemesini işlemlerini
/// özelleştirmek amacıyla yazılmıştır.
/// </summary>
public class CustomColumnGenerator : IAutoFieldGenerator
{
/// <summary>
/// Veri listelemesi için incelenecek
/// tablo değişkenini tutar
/// </summary>
protected MetaTable mTable = null;
#region IAutoFieldGenerator Members
/// <summary>
/// Listeleme işlemini gerçekleştirecek method
/// </summary>
/// <param name="control"></param>
/// <returns></returns>
public System.Collections.ICollection GenerateFields(Control control)
{
// Uygun kolonların biriktirildiği koleksiyon
List<DynamicField> dynFieldList = new List<DynamicField>();
// MetaTable atanmışsa
if (mTable != null)
{
// Her bir MetaColumn için
foreach (MetaColumn mColumn in this.mTable.Columns)
{
// Scaffolding ataması yapılmışsa koleksiyona eklenmesi
// uygun değildir. Eğer bu kontrol yapılmazsa ilgili
// alan görüntülenecektir. Çünkü tüm sorumluluğu almış
// bulunuyoruz
if (
!mColumn.Scaffold
)
continue;
DynamicField dynField = new DynamicField();
dynField.DataField = mColumn.Name;
dynFieldList.Add(dynField);
}
}
return dynFieldList;
}
#endregion
}
}
Scaffolding tekniğini denetleyerek görüntüleme işlemini üstlenen sınıfımız artık hazır. Şimdi sıra şablonlara göre bu denetleme işlemine geldi. Varsayılan şablonlar için bir enum tanımlayıp GenerateFields methodunda şablona görede bir denetleme yapmamız gerecektir.
namespace Eposta.Core.Enums
{
public enum PageTemplateType
{
Details,
Edit,
Insert,
List,
ListDetails
}
}
Özelleştirme işlemlerinin uygulanabilmesi için özel bir öznitelik geliştirip bildirimlerin bu öznitelik üzerinden gerçekleştirmesi gerekiyor bunun için aşağıdaki sınıfı kullanabiliriz.
More...
18c0104c-bc29-4803-a6a1-af52791dc3b5|6|2.7