Makale Özeti

Bu yazımızda ASP.NET Dynamic Web Site projelerinin yapısını incelerken InLine Editin desteğinin aktif hale getirilmesi ile ilgili detayları inceliyoruz.

Makale

Bir önceki yazımda yeni bir Dynamic Data Web Site'ın nasıl oluşturulabileceğine göz atmıştık. Aynı proje üzerinden devam ederek Dynamic Data Web Site'larda otomatik olarak karşımıza çıkan sayfaların yapılarını, nerelerden geldiklerini ve yönlendirme sistemlerini inceleyeceğiz.

Tamamen boş, yeni bir Dynamic Data Web Site yarattığınızda aslında Visual Studio sizin için birçok gerekli dosyayı projenize otomatik olarak ekliyor. Tüm bu otomatik eklenen dosyalar proje içerisinde DynamicData adında bir klasörün altında saklı.

DynamicData klasöründeki SAKLI GÜÇ
DynamicData klasöründeki SAKLI GÜÇ

Dynamic Data klasöründeki farklı yapıların amaçlarını hızlıca açıklayalım. Content klasörü altındaki içerik genelde diğer UserControl ve sayfalarda kullanılan içeriği taşır. Bu klasörde resimler veya harici UserControll'ler bulunabilir. Varsayılan ayarlarla gelen iki UserControl'den biri olan FilterUserControl bizim örneğimizde Kategorilerin filtreleme amaçlı olarak kullanıldığı yerlerde nasıl gözükeceğini ve çalışacağını belirler. FilterUserControl.ascx'in içindeki kod baktığımızda aşağıdaki manzara ile karşılaşıyoruz.

<%@ Control Language="VB" CodeFile="FilterUserControl.ascx.vb" Inherits="FilterUserControl" %>

 

<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="true" EnableViewState="true" CssClass="droplist">

    <asp:ListItem Text="All" Value="" />

</asp:DropDownList>

Bu kodda gördüğünüz DropDownList'i farklı bir kontrol ile değiştirirseniz doğrudan tüm proje içerisinde Filtreleme işlemlerinde bu kontrol kullanılacaktır. Sanırım yavaş yavaş Dynamic Data Web Site yapısının avantajlarını da hissetmeye başladık. Tabi bu gibi özelleştirme konularının detaylarına ileride daha derinlemesine gireceğiz.

DynamicData klasörümüzün içeriğine geri dönmek gerekirse sırada FieldTemplates klasörü vardı. Hatırlarsanız bir önceki makalemizde veritabanındaki tabloların Field'lerinin veri tipine göre farklı kontrollerin sahneye geldiğini görmüştük. Yerine göre MultiLine bir Textbox veya Chechbox gelebiliyordu. İşte FieldTemplates klasörü altında farklı veri tiplerine için sahneye gelecek olan UserControl'ler bulunuyor. Örneğin Boolean.ascx'i açarak karşımıza bir Checkbox gelecektir.

<%@ Control Language="VB" CodeFile="Boolean.ascx.vb" Inherits="BooleanField" %>

 

<asp:CheckBox runat="server" ID="CheckBox1" Enabled="false" />

Yine bu dosya içerisinde yapılan herhangi bir değişiklik tüm projede Boolean Field'lerin gösteriminde etkili olacaktır.

Son olarak bizi yakından ilgilendiren klasörlerden biri de PageTemplates klasörü. Bu klasör içerisinde veri kaynağımızdaki tüm tablolarla dinamik olarak çalışabilecek şekilde hazırlanmış ve CRUD işlemlerini yapmayı hedefleyen farklı ASPX sayfaları bulunuyor. Bu sayfalar bizim örneğimizde de hem Kategoriler hem de Ürünler tablosunu düzenlerken kullanılıyordu.

Dynamic Data Web Site'ın URL yapısı.
Dynamic Data Web Site'ın URL yapısı.

Yukarıdaki ekran görüntüsünde de görebileceğiniz gibi Kategorilers adındaki LINQ serisini düzenlerken düzenlediğimiz tablonun / nesnelerin adı URL içerisinde belirdikten sonra doğrudan List.aspx adında bir dosya çağrılıyor. Bu dosya hali hazırda PageTemplates içerisinde bulunan dosyanın ta kendisi. Bunun gibi Edit düğmesine tıkladığımızda da Edit.aspx ve tüm diğerleri de uygun işlemlerde tablo isminin ardından geliyorlar. Tabi ki URLRewriting'den bahsediyoruz ama konumuz o olmadığı için detaylara girmeyeceğim.

PageTemplates içerisinde herhangi bir dosyanın görselliğini veya yapısını değiştirdiğiniz anda projenizdeki tüm tablolarla ilgili işlemlerde gözükür hale gelecektir. Unutmayın tüm tablolar için bu dosyalar kullanılıyor. Peki bu durumu nasıl değiştirebiliriz?

Farklı tablolara farklı sayfalar?

Aslında tüm bu yönlendirme işlemlerinin yapıldığı yer projenin Global.asax dosyası. Global.asax içerisinde kodlar tabloların ne şekilde hangi dosyalarla işlem yapacağına karar veriyor.

[VB]

    routes.Add(New DynamicDataRoute("{table}/{action}.aspx") With { _

        .Constraints = New RouteValueDictionary(New With {.Action = "List|Details|Edit|Insert"}), _

        .Model = model})

[C#]

        routes.Add(new DynamicDataRoute("{table}/{action}.aspx") {

            Constraints = new RouteValueDictionary(new { action = "List|Details|Edit|Insert" }),

            Model = model

        });

Yukarıdaki gördüğünüz kod Global.asax içerisinde hazır olarak bulunuyor ve List, Details, Edit, Insert işlemlerinin hepsini tablo adı / aksiyon adı .aspx şeklinde yönlendiriyor. Aslında Dynamic Web Site yapısına gelen bir diğer özellik de tüm bu CRUD işlemlerinin tek bir sayfada yapılacak şekilde düzenlenmesi. Yani verileri ekleme, çıkarma ve düzenleme işlemlerinin hepsini tek bir sayfada halledebilecek şekilde hazırlanmış bir şablon da DynamicData klasöründeki PageTemplates içerisinde duruyor : ListDetails.aspx.

Bu dosya içerisindeki bir GridView Inline Editin sağlarken DetailsView'de detayların gösterilmesi ve yeni kayıt eklenmesini sağlıyor. Peki yönlendirmeyi nasıl değiştirebiliriz? Bu işlemin kodu de Global.asax içerisinde pasif bir şekilde duruyor. Tek yapmanız gereken yukarıdaki kodu pasif hale alıp aşağıdaki aktif hale getirmek.

[VB]

        routes.Add(New DynamicDataRoute("{table}/ListDetails.aspx") With { _

            .Action = PageAction.List, _

            .ViewName = "ListDetails", _

            .Model = model})

 

        routes.Add(New DynamicDataRoute("{table}/ListDetails.aspx") With { _

            .Action = PageAction.Details, _

            .ViewName = "ListDetails", _

            .Model = mod

[C#]

        routes.Add(new DynamicDataRoute("{table}/ListDetails.aspx")

        {

            Action = PageAction.List,

            ViewName = "ListDetails",

            Model = model

        });

 

        routes.Add(new DynamicDataRoute("{table}/ListDetails.aspx")

        {

            Action = PageAction.Details,

            ViewName = "ListDetails",

            Model = model

        });

Kodlarda da yer aldığı üzere toplam iki yönlendirme yapıyoruz. Birincisi "List" işleminin tablo adı / ListDetails.aspx sayfasında yapılacağı ile ilgili diğer ise Details görünümünün de aynı şekilde yapılacağı ile ilgili. Edit ve Insert işlemlerini yönlendirmemize gerek yok çünkü zaten onlar artık ListDetails içerisinde hallediliyor olacak.

ListDetails ile herşey aynı sayfada halloluyor.
ListDetails ile herşey aynı sayfada halloluyor.

Yukarıdaki ekran görüntüsünde ListDetails.aspx'i görüyorsunuz. GridView artık kendi içerisinde InlineEdit destekliyor ve bizim kategori kolonu da gördüğünüz gibi Edit modunda bir DropDownList olarak beliriyor.

Peki bizim esas konumuz neydi? Biz farklı bir tabloyu farklı bir dosya ile göstermek istiyorduk. Gelin örneğimizdeki Urunler tablosunun ListDetails ile gösterilmesini ayarlarken geri kalanların normal bir şekilde ayrı ayrı dosyalarla düzenlenmesini sağlayalım.

[VB]

        routes.Add(New DynamicDataRoute("Urunlers/ListDetails.aspx") With { _

            .Action = PageAction.List, _

            .ViewName = "ListDetails", _

            .Table = "Urunlers", _

            .Model = model})

 

        routes.Add(New DynamicDataRoute("Urunlers/ListDetails.aspx") With { _

            .Action = PageAction.Details, _

            .ViewName = "ListDetails", _

            .Table = "Urunlers", _

            .Model = model})

 

        routes.Add(New DynamicDataRoute("{table}/{action}.aspx") With { _

            .Constraints = New RouteValueDictionary(New With {.Action = "List|Details|Edit|Insert"}), _

            .Model = model})

[C#]

        routes.Add(new DynamicDataRoute("Urunlers/ListDetails.aspx")

        {

            Action = PageAction.List,

            ViewName = "ListDetails",

            Table = "Urunlers",

            Model = model

        });

 

        routes.Add(new DynamicDataRoute("Urunlers/ListDetails.aspx")

        {

            Action = PageAction.Details,

            ViewName = "ListDetails",

            Table = "Urunlers",

            Model = model

        });

 

        routes.Add(new DynamicDataRoute("{table}/{action}.aspx")

        {

            Constraints = new RouteValueDictionary(new { action = "List|Details|Edit|Insert" }),

            Model = model

        });

Yukarıdaki kodlar Urunlers tablosunun ListDetails.aspx ile gösterilmesini ve geri kalan tüm tabloların standart bir şekilde tablo adı / aksiyon adı.aspx ile düzenlenmesini sağlayacaktır. Burada önemli olan noktalardan biri kodumuzun içerisindeki istisnai durumların yani bizim örneğimizde Urunlers tablosunun durumunun kod sırasında daha önde tanımlanmış olmasının şart olması. Aksi halde sistem istediğimiz gibi çalışmayacaktır.

Bu yazıda Dynamic Web Site yapısının nasıl çalıştığını ve proje yapısını incelemekle beraber web sitelerini özelleştirme dünyasına da ufak bir giriş yaptık. Sonraki yazılarımda derin detaylara yolculuğumuz devam edecek.

Hepinize kolay gelsin.