<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Systemdoktoru.com &#187; Gelişmiş Scaffolding</title>
	<atom:link href="http://www.systemdoktoru.com/etiket/gelismis-scaffolding/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.systemdoktoru.com</link>
	<description>Windows Linux işletim sistemlerinin bilgi deposu</description>
	<lastBuildDate>Fri, 30 Apr 2010 19:02:04 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>ASP.NET Dynamic Data &#8211; Gelişmiş Scaffolding</title>
		<link>http://www.systemdoktoru.com/2010/04/asp-net-dynamic-data-gelismis-scaffolding/</link>
		<comments>http://www.systemdoktoru.com/2010/04/asp-net-dynamic-data-gelismis-scaffolding/#comments</comments>
		<pubDate>Fri, 30 Apr 2010 10:43:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[ASP.NET Dynamic Data]]></category>
		<category><![CDATA[Gelişmiş Scaffolding]]></category>

		<guid isPermaLink="false">http://www.systemdoktoru.com/?p=31</guid>
		<description><![CDATA[Merhabalar, daha &#246;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&#252;ş&#252;n&#252;rken makale konusu olarak ger&#231;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&#246;z&#252;yle değerlendirmek gerekirse kullanıcı gereksinimleri konusunda g&#246;zden ka&#231;an bir &#231;ok gereksinimi g&#246;r&#252;lmeyebilir.&#160; &#214;rneğin bir [...]]]></description>
			<content:encoded><![CDATA[<p>Merhabalar, daha &ouml;nce ASP.NET Dynamic Data(yazının devamında <strong><span class="style1"><em><span class="style2">DD</span></em></span></strong> kısaltmasını kullanacağım) hakkında bazı bilgileri yayınlamıştım. Yeni bir makale konusunda d&uuml;ş&uuml;n&uuml;rken makale konusu olarak ger&ccedil;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.<br /> Yazılımcı g&ouml;z&uuml;yle değerlendirmek gerekirse kullanıcı gereksinimleri konusunda g&ouml;zden ka&ccedil;an bir &ccedil;ok gereksinimi g&ouml;r&uuml;lmeyebilir.&nbsp; &Ouml;rneğin bir tablo i&ccedil;indeki kayıtların listelenmesi yazılımcı i&ccedil;in gayet yeterlidir ancak kullanıcı g&ouml;z&uuml;yle bakıldığında her şeyin listelenmesi &ccedil;oğu zaman gereksiz olacaktır. Bu kapsamda kullanıcı isteklerine karşılık sorun &ccedil;&ouml;z&uuml;m&uuml;yle alakalı <strong><em>makalele dizisi</em></strong>nin ilkini yazmaya başlıyorum. Daha &ouml;nceki makalelerde bahsettiğim isimlendirme, bi&ccedil;imlendirme vb. gibi temel işlemlere bu makalede değinmeyeceğim.</p>
<p>Kullanıcı tarafında tablo &uuml;zerindeki her alanın(<em>column</em>) g&ouml;r&uuml;nt&uuml;lenmesi istenmeyebilir. Bazı durumlarda ise t&uuml;m kayıtların listelenmesi kullanım kolaylığı a&ccedil;ısından sıkıntılı olabilir.</p>
<p>Scaffolding tekniğiyle istenilen alanların t&uuml;m şablonlarda g&ouml;r&uuml;nt&uuml;lenmesini engelleyebiliyoruz. &Ouml;zellikle listeleme sayfalarında t&uuml;m alanların sayfada g&ouml;r&uuml;n&uuml;r halde olması yatay olarak uzayan bir sayfaya neden olur ancak bu alanları klasik scaffolding tekniği ile gizlersek diğer şablonlardanda kayboluverir.&nbsp; İşte burada asıl sorun ortaya &ccedil;ıkıyor: Gizlenen alanların kullanıcı tarafından d&uuml;zenlenmesi gerekiyorsa yada detaylı g&ouml;r&uuml;nt&uuml;leme şablonunda t&uuml;m alanların g&ouml;r&uuml;nt&uuml;lenmesi gerekiyorsa ne yapacağız?</p>
<p><span id="ctl00_ctl00_ContentPlaceHolder1_ContentPlaceHolder1_lblDetail"> </p>
<table border="0" cellspacing="1" cellpadding="1">
<tbody>
<tr>
<td>&nbsp;</td>
<td>Aletleri geliştirmek DD i&ccedil;in her zaman kazanımdır. Bu senaryoda scaffolding tekniğini sayfa şablonlarına g&ouml;re nasıl &ouml;zelleştirebileceğimizi &ouml;ğreneceğiz.</td>
</tr>
</tbody>
</table>
<p></span></p>
<p>Kullanabileceğimiz veri bileşenleri(<em>GridView, FormView, DetailsView vb.</em>) veri listeleme sırasında listeleme işlemi i&ccedil;in <strong>IAutoFieldGenerator</strong> aray&uuml;z&uuml;n&uuml; uygulayan bir sınıf ile veri alanları &uuml;zerindeki kararını verir. Varsayılan alan oluşturucularda verideki t&uuml;m alanlar DD bildirimleri uygunlandıktan sonra(<em>scaffolding gibi kısıtlamalar vb.</em>) listelenir. Yapılması gereken şey ise veri listeleme işini ger&ccedil;ekleştirme g&ouml;revini yazacağımız bir sınıfın &uuml;stlenmesidir.</p>
<p><strong>IAutoFieldGenerator aray&uuml;z&uuml;n&uuml; uygulayan sınıfımız:</strong></p>
<div class="codeBlock">
<pre style="background-color: white;"><span style="color: #0000ff;">namespace</span><span style="color: #000000;"> Eposta.Core.CustomFieldGenerator{    </span><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Collections.Generic;    </span><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Web.UI;    </span><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Web.DynamicData;     </span><span style="color: #808080;">

    ///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">    </span><span style="color: #808080;">///</span><span style="color: #008000;"> Bu sınıf veri listelemesini işlemlerini    </span><span style="color: #808080;">///</span><span style="color: #008000;"> &ouml;zelleştirmek amacıyla yazılmıştır.     </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #000000;">    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> CustomColumnGenerator : IAutoFieldGenerator    {        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> Veri listelemesi i&ccedil;in incelenecek        </span><span style="color: #808080;">///</span><span style="color: #008000;"> tablo değişkenini tutar        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #000000;">        </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> MetaTable mTable = </span><span style="color: #0000ff;">null</span><span style="color: #000000;">;        </span><span style="color: #0000ff;">#region</span><span style="color: #000000;"> IAutoFieldGenerator Members        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> Listeleme işlemini ger&ccedil;ekleştirecek method        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;param name="control"&gt;&lt;/param&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;returns&gt;&lt;/returns&gt;</span><span style="color: #000000;">        </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> System.Collections.ICollection GenerateFields(Control control)        {            </span><span style="color: #008000;">// Uygun kolonların biriktirildiği koleksiyon</span><span style="color: #000000;">            List&lt;DynamicField&gt; dynFieldList = </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> List&lt;DynamicField&gt;();            </span><span style="color: #008000;">// MetaTable atanmışsa</span><span style="color: #000000;">            </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (mTable != </span><span style="color: #0000ff;">null</span><span style="color: #000000;">)            {                </span><span style="color: #008000;">// Her bir MetaColumn i&ccedil;in</span><span style="color: #000000;">                </span><span style="color: #0000ff;">foreach</span><span style="color: #000000;"> (MetaColumn mColumn </span><span style="color: #0000ff;">in</span><span style="color: #000000;"> </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.mTable.Columns)                {                    </span><span style="color: #008000;">// Scaffolding ataması yapılmışsa koleksiyona eklenmesi                    // uygun değildir. Eğer bu kontrol yapılmazsa ilgili                    // alan g&ouml;r&uuml;nt&uuml;lenecektir. &Ccedil;&uuml;nk&uuml; t&uuml;m sorumluluğu almış                    // bulunuyoruz</span><span style="color: #000000;">                    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (                            !mColumn.Scaffold                        )                        </span><span style="color: #0000ff;">continue</span><span style="color: #000000;">;                     DynamicField dynField = </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> DynamicField();                    dynField.DataField = mColumn.Name;                    dynFieldList.Add(dynField);                }            }            </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> dynFieldList;        }        </span><span style="color: #0000ff;">#endregion</span><span style="color: #000000;">    }}

</span></pre>
</div>
<p><span class="style4"><em>Scaffolding</em></span> tekniğini denetleyerek g&ouml;r&uuml;nt&uuml;leme işlemini &uuml;stlenen sınıfımız artık hazır. Şimdi sıra şablonlara g&ouml;re bu denetleme işlemine geldi. Varsayılan şablonlar i&ccedil;in bir enum tanımlayıp GenerateFields methodunda şablona g&ouml;rede bir denetleme yapmamız gerecektir.</p>
<div class="codeBlock">
<pre style="background-color: white;"><span style="color: #0000ff;">namespace</span><span style="color: #000000;"> Eposta.Core.Enums{    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">enum</span><span style="color: #000000;"> PageTemplateType    {        Details,        Edit,        Insert,        List,        ListDetails    }}

</span></pre>
</div>
<p>&Ouml;zelleştirme işlemlerinin uygulanabilmesi i&ccedil;in &ouml;zel bir &ouml;znitelik geliştirip bildirimlerin bu &ouml;znitelik &uuml;zerinden ger&ccedil;ekleştirmesi gerekiyor bunun i&ccedil;in aşağıdaki sınıfı kullanabiliriz.</p>
<p>[more]</p>
<div class="codeBlock">
<pre style="background-color: white;"><span style="color: #0000ff;">using</span><span style="color: #000000;"> System;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> Eposta.Core.Enums;

</span><span style="color: #0000ff;">namespace</span><span style="color: #000000;"> Eposta.Core.CustomAttributes{    [AttributeUsage(AttributeTargets.Property)]    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> CustomHiddenColumnAttribute : Attribute    {        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> İlgili alanın gizlenmesi gereken sayfa şablonları belirleniyor        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #000000;">        </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> PageTemplateType[] PageTemplateTypes { </span><span style="color: #0000ff;">get</span><span style="color: #000000;">; </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> </span><span style="color: #0000ff;">set</span><span style="color: #000000;">; }        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> Parametresiz bir constructor yazılması mecburi ancak        </span><span style="color: #808080;">///</span><span style="color: #008000;"> kullanılmaması i&ccedil;in hata fırlatılması daha uygun        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #000000;">        </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> CustomHiddenColumnAttribute()        {            </span><span style="color: #0000ff;">throw</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> InvalidOperationException();        }        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> Sayfa şablonlarının atama işleminin kolaylaştırılması        </span><span style="color: #808080;">///</span><span style="color: #008000;"> nedeniyle params y&ouml;ntemi kullanılmıştır. &Ouml;znitelik         </span><span style="color: #808080;">///</span><span style="color: #008000;"> tanımlamasında AllowMultiple=true atamasıda yapılabilir        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;param name="PageTemplateParams"&gt;&lt;/param&gt;</span><span style="color: #000000;">        </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> CustomHiddenColumnAttribute(</span><span style="color: #0000ff;">params</span><span style="color: #000000;"> PageTemplateType[] PageTemplateParams)        {            </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.PageTemplateTypes = PageTemplateParams;        }    }}

</span></pre>
</div>
<p>Bu &ouml;zniteliğin &ouml;rnek tanımlaması aşağıdaki gibidir. Daha &ouml;ncede belirttiğim gibi &ouml;znitelik yazmayı &ccedil;ok <span class="style4">severim</span> <img src='http://www.systemdoktoru.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Bundan b&ouml;yle sadece aşağıdaki kodu kullarak t&uuml;m kodu yazmadan işimizi halledebiliriz.</p>
<div class="codeBlock">
<pre style="background-color: white;"><span style="color: #000000;"><strong>[CustomHiddenColumn(        PageTemplateType.List, PageTemplateType.ListDetails)]</strong></span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">string</span><span style="color: #000000;"> <strong>SmtpHost</strong> { </span><span style="color: #0000ff;">get</span><span style="color: #000000;">; </span><span style="color: #0000ff;">set</span><span style="color: #000000;">; }

</span></pre>
</div>
<p>Madem bu kadar kod yazdık birde MetaColumn nesneleri i&ccedil;in genişletilmiş bir method yazarak kolonda ve şablona g&ouml;re gizlilik bildirimi yapılmışmı diye kontrol edelimki her seferinde bir yığın kod yazmaktan kurtulalım.</p>
<div class="codeBlock">
<pre style="background-color: white;"><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Linq;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> Eposta.Core.CustomAttributes.UIHint;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> Eposta.Core.CustomAttributes;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> Eposta.Core.Enums;</span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;"></span><span style="color: #808080;">///</span><span style="color: #008000;"> &Ouml;mer Faruk ZORLU</span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #0000ff;">namespace</span><span style="color: #000000;"> Eposta.Core.Extentions{    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> MetaColumnExtentions    {        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> Sayfa şablonuna g&ouml;re alanın gizlilik durumunu d&ouml;nderir        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;param name="mColumn"&gt;&lt;/param&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;param name="pTemplateType"&gt;&lt;/param&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;returns&gt;&lt;/returns&gt;</span><span style="color: #000000;">        </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">bool</span><span style="color: #000000;"> IsHidden(</span><span style="color: #0000ff;">this</span><span style="color: #000000;"> System.Web.DynamicData.MetaColumn mColumn, PageTemplateType pTemplateType)        {            </span><span style="color: #008000;">// Kolon &uuml;zerinde atanmış ustomHiddenColumn &ouml;zniteliği alınıyor            // Eğer &ccedil;oklu tanımlama(AllowMultiple) ya izin verilmişse bir            // d&ouml;ng&uuml; i&ccedil;erisinde kontrol edilmesi gerekir</span><span style="color: #000000;">            CustomHiddenColumnAttribute chCAttr =                mColumn.Attributes.OfType&lt;CustomHiddenColumnAttribute&gt;().FirstOrDefault(); &nbsp;             </span><span style="color: #008000;">//  Herhangi bir &ouml;znitelik ataması yoksa gizli değildir</span><span style="color: #000000;">            </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (chCAttr == </span><span style="color: #0000ff;">null</span><span style="color: #000000;">)                </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #0000ff;">false</span><span style="color: #000000;">;             </span><span style="color: #008000;">// İlgili alan i&ccedil;in yapılan gizlilik bildirimleri parametrede            // g&ouml;nderilmiş sayfa şablonunu i&ccedil;eriyorsa gizlidir</span><span style="color: #000000;">            </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> chCAttr.PageTemplateTypes.Contains(pTemplateType);;        }    }}

</span></pre>
</div>
<p>Artık daha &ouml;nce yazdığımız alan oluşturucu sınıf &uuml;zerinde &ouml;zel gizleme yapımızı denetleyen kodlar yazabiliriz. Yukarıda yazdığımız sınıfa yeni eklenen kodlar kalın olarak yazılmıştır.</p>
<p>&nbsp;</p>
<div class="codeBlock">
<pre style="background-color: white;"><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Collections.Generic;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Web.DynamicData;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Web.UI;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> Eposta.Core.Extentions;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> Eposta.Core.Enums; </span><span style="color: #0000ff;">namespace</span><span style="color: #000000;"> Eposta.Core.CustomFieldGenerator{    </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">    </span><span style="color: #808080;">///</span><span style="color: #008000;"> Bu sınıf veri listelemesini işlemlerini    </span><span style="color: #808080;">///</span><span style="color: #008000;"> &ouml;zelleştirmek amacıyla yazılmıştır.     </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #000000;">    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> CustomFieldGenerator : IAutoFieldGenerator    {        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> Veri listelemesi i&ccedil;in incelenecek        </span><span style="color: #808080;">///</span><span style="color: #008000;"> tablo değişkenini tutar        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #000000;">        </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> MetaTable mTable = </span><span style="color: #0000ff;">null</span><span style="color: #000000;">;

        </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> PageTemplateType pTemplateType;         </span><span style="color: #0000ff;">#region</span><span style="color: #000000;"> ctor         </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> CustomFieldGenerator(MetaTable _mTable, PageTemplateType _pTemplateType)        {            </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.mTable = _mTable;            </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.pTemplateType = _pTemplateType;        }         </span><span style="color: #0000ff;">#endregion</span><span style="color: #000000;">         </span><span style="color: #0000ff;">#region</span><span style="color: #000000;"> IAutoFieldGenerator Members        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> Listeleme işlemini ger&ccedil;ekleştirecek method        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;param name="control"&gt;&lt;/param&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;returns&gt;&lt;/returns&gt;</span><span style="color: #000000;">        </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> System.Collections.ICollection GenerateFields(Control control)        {            </span><span style="color: #008000;">// Uygun kolonların biriktirildiği koleksiyon</span><span style="color: #000000;">            List&lt;DynamicField&gt; dynFieldList = </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> List&lt;DynamicField&gt;();            </span><span style="color: #008000;">// MetaTable atanmışsa</span><span style="color: #000000;">            </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (mTable != </span><span style="color: #0000ff;">null</span><span style="color: #000000;">)            {                </span><span style="color: #008000;">// Her bir MetaColumn i&ccedil;in</span><span style="color: #000000;">                </span><span style="color: #0000ff;">foreach</span><span style="color: #000000;"> (MetaColumn mColumn </span><span style="color: #0000ff;">in</span><span style="color: #000000;"> </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.mTable.Columns)                {                    </span><span style="color: #008000;">// Scaffolding ataması yapılmışsa koleksiyona eklenmesi                    // uygun değildir. Eğer bu kontrol yapılmazsa ilgili                    // alan g&ouml;r&uuml;nt&uuml;lenecektir. &Ccedil;&uuml;nk&uuml; t&uuml;m sorumluluğu almış                    // bulunuyoruz</span><span style="color: #000000;">                    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (                            !mColumn.Scaffold                        )                        </span><span style="color: #0000ff;">continue</span><span style="color: #000000;">;                     </span><span style="color: #008000;">// List ve ListDetails şablonları i&ccedil;in IsHidden                    // genişletilmiş methodu ve IsLongString methodunu                    // kontrol ediyoruz ancak Details şablonu i&ccedil;in                    // IsLongString methodunu kontrol edip gizlersek                    // uzun metin alanlar g&ouml;r&uuml;nt&uuml;lenmeyecek yani ufak bir                    // bug oluşacaktır.</span><span style="color: #000000;">                    </span><span style="color: #0000ff;">switch</span><span style="color: #000000;"> (</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.pTemplateType)                    {                        </span><span style="color: #0000ff;">case</span><span style="color: #000000;"> PageTemplateType.Details:                            </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (mColumn.IsHidden(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.pTemplateType))                                </span><span style="color: #0000ff;">continue</span><span style="color: #000000;">; </span><span style="color: #008000;">// foreach</span><span style="color: #000000;">                            </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;                        </span><span style="color: #0000ff;">case</span><span style="color: #000000;"> PageTemplateType.List:                            </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (mColumn.IsHidden(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.pTemplateType) ||                                    mColumn.IsLongString)                                </span><span style="color: #0000ff;">continue</span><span style="color: #000000;">; </span><span style="color: #008000;">// foreach</span><span style="color: #000000;">                            </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;                        </span><span style="color: #0000ff;">case</span><span style="color: #000000;"> PageTemplateType.ListDetails:                            </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (mColumn.IsHidden(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.pTemplateType) ||                                    mColumn.IsLongString)                                </span><span style="color: #0000ff;">continue</span><span style="color: #000000;">; </span><span style="color: #008000;">// foreach</span><span style="color: #000000;">                            </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;                        </span><span style="color: #0000ff;">default</span><span style="color: #000000;">:                            </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;                    }                     </span><span style="color: #008000;">// Varsayılan şablonların haricinde uzun metinlerin                    // g&ouml;r&uuml;nt&uuml;lenmesini engellemek amacıyla bu kontrol                    // yapılıyor</span><span style="color: #000000;">                    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (mColumn.IsLongString)                        </span><span style="color: #0000ff;">continue</span><span style="color: #000000;">;                     DynamicField dynField = </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> DynamicField();                    dynField.DataField = mColumn.Name;                     dynFieldList.Add(dynField);                }            }            </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> dynFieldList;        }        </span><span style="color: #0000ff;">#endregion</span><span style="color: #000000;">    }}</span></pre>
</div>
<p>Son adımında ise ilgili veri kontrol&uuml;ne veri listeleme işlemini bizim &uuml;stleneceğimizi bildirmek gerekiyor. GridView nesnesi i&ccedil;in <strong>ColumnGenerator</strong> DetailsView i&ccedil;inse <strong>RowGenerator</strong> parametresi kullanılıyor. Son haliyle <strong>List</strong>.aspx.cs ve <strong>Details</strong>.aspx.cs şablon kodları aşağıdaki gibi tanımlanmalıdır.</p>
<p>&nbsp;</p>
<p><strong>List.aspx.cs kodları:</strong></p>
<div class="codeBlock">
<pre style="background-color: white;"><span style="color: #0000ff;">using</span><span style="color: #000000;"> System;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Web.DynamicData;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> Eposta.Core.CustomFieldGenerator;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> Eposta.Core.Extentions; </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">partial</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> List : System.Web.UI.Page{    </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> MetaTable table;    </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> Page_Init(</span><span style="color: #0000ff;">object</span><span style="color: #000000;"> sender, EventArgs e)    {        DynamicDataManager1.RegisterControl(GridView1, </span><span style="color: #0000ff;">true</span><span style="color: #000000;"> </span><span style="color: #008000;">/*setSelectionFromUrl*/</span><span style="color: #000000;">);        table = GridDataSource.GetTable();        GridView1.<strong>ColumnsGenerator </strong>= </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> <strong>CustomFieldGenerator</strong>(table,<strong> Eposta.Core.Enums.PageTemplateType.List</strong>);    }    </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> Page_Load(</span><span style="color: #0000ff;">object</span><span style="color: #000000;"> sender, EventArgs e)    {        Title = table.DisplayName;        InsertHyperLink.NavigateUrl = table.GetActionPath(PageAction.Insert);         </span><span style="color: #008000;">// Disable various options if the table is readonly</span><span style="color: #000000;">        </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (table.IsReadOnly)        {            GridView1.Columns[</span><span style="color: #800080;">0</span><span style="color: #000000;">].Visible = </span><span style="color: #0000ff;">false</span><span style="color: #000000;">;            InsertHyperLink.Visible = </span><span style="color: #0000ff;">false</span><span style="color: #000000;">;        }    }    </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> OnFilterSelectedIndexChanged(</span><span style="color: #0000ff;">object</span><span style="color: #000000;"> sender, EventArgs e)    {        GridView1.PageIndex = </span><span style="color: #800080;">0</span><span style="color: #000000;">;    }}</span></pre>
</div>
<p><strong><br /> Details.aspx.cs kodları:</strong></p>
<div class="codeBlock">
<pre style="background-color: white;"><span style="color: #0000ff;">using</span><span style="color: #000000;"> System;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Linq;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Web.DynamicData;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Web.UI.WebControls;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> Eposta.Core.CustomFieldGenerator;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> Eposta.Core.CustomAttributes; </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">partial</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Details : System.Web.UI.Page {    </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> MetaTable table;    </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> Page_Init(</span><span style="color: #0000ff;">object</span><span style="color: #000000;"> sender, EventArgs e) {        DynamicDataManager1.RegisterControl(DetailsView1);    }    </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> Page_Load(</span><span style="color: #0000ff;">object</span><span style="color: #000000;"> sender, EventArgs e) {        table = DetailsDataSource.GetTable();        DetailsView1.<strong>RowsGenerator </strong>= </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> <strong>CustomFieldGenerator</strong>(table, <strong>Eposta.Core.Enums.PageTemplateType.Details</strong>);

        Title = table.DisplayName;

        ListHyperLink.NavigateUrl = table.ListActionPath;    }    </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> DetailsView1_ItemDeleted(</span><span style="color: #0000ff;">object</span><span style="color: #000000;"> sender, DetailsViewDeletedEventArgs e) {        </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (e.Exception == </span><span style="color: #0000ff;">null</span><span style="color: #000000;"> || e.ExceptionHandled) {            Response.Redirect(table.ListActionPath);        }    }}

</span></pre>
</div>
<p>&Ccedil;&ouml;z&uuml;m itibari ile Grup tablosunda yapılan tanımlalarla listeleme sayfa şablonlarında bazı alanların gizlenmesini g&uuml;ncelleme ve detaylı g&ouml;r&uuml;nt&uuml;leme sayfa şablonlarında ise kullanıcının verileri g&ouml;r&uuml;nt&uuml;lemesine ve d&uuml;zenlemesine imkan tanımış olduk. Ekran g&ouml;r&uuml;nt&uuml;leri aşağıdaki gibidir.</p>
<p><strong>G&uuml;ncelleme ekranı:</strong></p>
<p><img src="http://www.yazgelistir.com/Makaleler/Resimler/1000002433_1.jpg" alt="" width="374" height="264" /></p>
<p> <strong>Listeleme ekranı:</strong></p>
<p><img src="http://www.yazgelistir.com/Makaleler/Resimler/1000002433_2.jpg" alt="" width="493" height="271" /></p>
<p> Bir yazının daha sonuna geldik. Kullanıcı gereksinimleriyle alakalı makaleler devam edecektir. Bir sonraki makalede g&ouml;r&uuml;şmek &uuml;zere. Yaşasın <span class="style6"><strong>dinamizm</strong></span>!</p>
<p><strong>Ömer Faruk ZORLU<br /> </strong></p>
<p></span></td>
</tr>
]]></content:encoded>
			<wfw:commentRss>http://www.systemdoktoru.com/2010/04/asp-net-dynamic-data-gelismis-scaffolding/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP.NET Dynamic Data &#8211; Gelişmiş Scaffolding</title>
		<link>http://www.systemdoktoru.com/2010/04/asp-net-dynamic-data-gelismis-scaffolding-2/</link>
		<comments>http://www.systemdoktoru.com/2010/04/asp-net-dynamic-data-gelismis-scaffolding-2/#comments</comments>
		<pubDate>Fri, 30 Apr 2010 16:26:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Dynamic Data]]></category>
		<category><![CDATA[Gelişmiş Scaffolding]]></category>

		<guid isPermaLink="false">http://www.systemdoktoru.com/?p=12</guid>
		<description><![CDATA[ 
 
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 [...]]]></description>
			<content:encoded><![CDATA[<p> </p>
<td colspan="3"> </td>
<p><span id="lblMakale">Merhabalar, daha önce ASP.NET Dynamic Data(yazının devamında <strong><span class="style1"><em><span class="style2">DD</span></em></span></strong> 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.<br />
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ı <strong><em>makalele dizisi</em></strong>nin ilkini yazmaya başlıyorum. Daha önceki makalelerde bahsettiğim isimlendirme, biçimlendirme vb. gibi temel işlemlere bu makalede değinmeyeceğim.</p>
<p>Kullanıcı tarafında tablo üzerindeki her alanın(<em>column</em>) 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.</p>
<p>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?</p>
<div><span id="ctl00_ctl00_ContentPlaceHolder1_ContentPlaceHolder1_lblDetail"></span></div>
<p><span id="ctl00_ctl00_ContentPlaceHolder1_ContentPlaceHolder1_lblDetail"> </span></span></p>
<table border="0" cellspacing="1" cellpadding="1">
<tbody>
<tr>
<td> </td>
<td>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.</td>
</tr>
</tbody>
</table>
<p><span id="lblMakale"><span id="ctl00_ctl00_ContentPlaceHolder1_ContentPlaceHolder1_lblDetail"> </p>
<p></span>Kullanabileceğimiz veri bileşenleri(<em>GridView, FormView, DetailsView vb.</em>) veri listeleme sırasında listeleme işlemi için <strong>IAutoFieldGenerator</strong> 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(<em>scaffolding gibi kısıtlamalar vb.</em>) listelenir. Yapılması gereken şey ise veri listeleme işini gerçekleştirme görevini yazacağımız bir sınıfın üstlenmesidir.</p>
<p><strong>IAutoFieldGenerator arayüzünü uygulayan sınıfımız:</strong></p>
<div class="codeBlock">
<pre style="background-color: white;"><span style="color: #0000ff;">namespace</span><span style="color: #000000;"> Eposta.Core.CustomFieldGenerator{    </span><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Collections.Generic;    </span><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Web.UI;    </span><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Web.DynamicData;     </span><span style="color: #808080;">

    ///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">    </span><span style="color: #808080;">///</span><span style="color: #008000;"> Bu sınıf veri listelemesini işlemlerini    </span><span style="color: #808080;">///</span><span style="color: #008000;"> özelleştirmek amacıyla yazılmıştır.     </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #000000;">    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> CustomColumnGenerator : IAutoFieldGenerator    {        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> Veri listelemesi için incelenecek        </span><span style="color: #808080;">///</span><span style="color: #008000;"> tablo değişkenini tutar        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #000000;">        </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> MetaTable mTable = </span><span style="color: #0000ff;">null</span><span style="color: #000000;">;        </span><span style="color: #0000ff;">#region</span><span style="color: #000000;"> IAutoFieldGenerator Members        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> Listeleme işlemini gerçekleştirecek method        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;param name="control"&gt;&lt;/param&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;returns&gt;&lt;/returns&gt;</span><span style="color: #000000;">        </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> System.Collections.ICollection GenerateFields(Control control)        {            </span><span style="color: #008000;">// Uygun kolonların biriktirildiği koleksiyon</span><span style="color: #000000;">            List&lt;DynamicField&gt; dynFieldList = </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> List&lt;DynamicField&gt;();            </span><span style="color: #008000;">// MetaTable atanmışsa</span><span style="color: #000000;">            </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (mTable != </span><span style="color: #0000ff;">null</span><span style="color: #000000;">)            {                </span><span style="color: #008000;">// Her bir MetaColumn için</span><span style="color: #000000;">                </span><span style="color: #0000ff;">foreach</span><span style="color: #000000;"> (MetaColumn mColumn </span><span style="color: #0000ff;">in</span><span style="color: #000000;"> </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.mTable.Columns)                {                    </span><span style="color: #008000;">// 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</span><span style="color: #000000;">                    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (                            !mColumn.Scaffold                        )                        </span><span style="color: #0000ff;">continue</span><span style="color: #000000;">;                     DynamicField dynField = </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> DynamicField();                    dynField.DataField = mColumn.Name;                    dynFieldList.Add(dynField);                }            }            </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> dynFieldList;        }        </span><span style="color: #0000ff;">#endregion</span><span style="color: #000000;">    }}

</span></pre>
</div>
<p><span class="style4"><em>Scaffolding</em></span> 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.</p>
<div class="codeBlock">
<pre style="background-color: white;"><span style="color: #0000ff;">namespace</span><span style="color: #000000;"> Eposta.Core.Enums{    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">enum</span><span style="color: #000000;"> PageTemplateType    {        Details,        Edit,        Insert,        List,        ListDetails    }}

</span></pre>
</div>
<p>Ö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.</p>
<p>[more]</p>
<div class="codeBlock">
<pre style="background-color: white;"><span style="color: #0000ff;">using</span><span style="color: #000000;"> System;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> Eposta.Core.Enums;

</span><span style="color: #0000ff;">namespace</span><span style="color: #000000;"> Eposta.Core.CustomAttributes{    [AttributeUsage(AttributeTargets.Property)]    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> CustomHiddenColumnAttribute : Attribute    {        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> İlgili alanın gizlenmesi gereken sayfa şablonları belirleniyor        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #000000;">        </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> PageTemplateType[] PageTemplateTypes { </span><span style="color: #0000ff;">get</span><span style="color: #000000;">; </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> </span><span style="color: #0000ff;">set</span><span style="color: #000000;">; }        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> Parametresiz bir constructor yazılması mecburi ancak        </span><span style="color: #808080;">///</span><span style="color: #008000;"> kullanılmaması için hata fırlatılması daha uygun        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #000000;">        </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> CustomHiddenColumnAttribute()        {            </span><span style="color: #0000ff;">throw</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> InvalidOperationException();        }        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> Sayfa şablonlarının atama işleminin kolaylaştırılması        </span><span style="color: #808080;">///</span><span style="color: #008000;"> nedeniyle params yöntemi kullanılmıştır. Öznitelik         </span><span style="color: #808080;">///</span><span style="color: #008000;"> tanımlamasında AllowMultiple=true atamasıda yapılabilir        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;param name="PageTemplateParams"&gt;&lt;/param&gt;</span><span style="color: #000000;">        </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> CustomHiddenColumnAttribute(</span><span style="color: #0000ff;">params</span><span style="color: #000000;"> PageTemplateType[] PageTemplateParams)        {            </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.PageTemplateTypes = PageTemplateParams;        }    }}

</span></pre>
</div>
<p>Bu özniteliğin örnek tanımlaması aşağıdaki gibidir. Daha öncede belirttiğim gibi öznitelik yazmayı çok <span class="style4">severim</span> <img src='http://www.systemdoktoru.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Bundan böyle sadece aşağıdaki kodu kullarak tüm kodu yazmadan işimizi halledebiliriz.</p>
<div class="codeBlock">
<pre style="background-color: white;"><span style="color: #000000;"><strong>[CustomHiddenColumn(        PageTemplateType.List, PageTemplateType.ListDetails)]</strong></span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">string</span><span style="color: #000000;"> <strong>SmtpHost</strong> { </span><span style="color: #0000ff;">get</span><span style="color: #000000;">; </span><span style="color: #0000ff;">set</span><span style="color: #000000;">; }

</span></pre>
</div>
<p>Madem bu kadar kod yazdık birde MetaColumn nesneleri için genişletilmiş bir method yazarak kolonda ve şablona göre gizlilik bildirimi yapılmışmı diye kontrol edelimki her seferinde bir yığın kod yazmaktan kurtulalım.</p>
<div class="codeBlock">
<pre style="background-color: white;"><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Linq;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> Eposta.Core.CustomAttributes.UIHint;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> Eposta.Core.CustomAttributes;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> Eposta.Core.Enums;</span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;"> </span><span style="color: #808080;">///</span><span style="color: #008000;"> Ömer Faruk ZORLU</span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #0000ff;">namespace</span><span style="color: #000000;"> Eposta.Core.Extentions{    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> MetaColumnExtentions    {        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> Sayfa şablonuna göre alanın gizlilik durumunu dönderir        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;param name="mColumn"&gt;&lt;/param&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;param name="pTemplateType"&gt;&lt;/param&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;returns&gt;&lt;/returns&gt;</span><span style="color: #000000;">        </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">bool</span><span style="color: #000000;"> IsHidden(</span><span style="color: #0000ff;">this</span><span style="color: #000000;"> System.Web.DynamicData.MetaColumn mColumn, PageTemplateType pTemplateType)        {            </span><span style="color: #008000;">// Kolon üzerinde atanmış ustomHiddenColumn özniteliği alınıyor            // Eğer çoklu tanımlama(AllowMultiple) ya izin verilmişse bir            // döngü içerisinde kontrol edilmesi gerekir</span><span style="color: #000000;">            CustomHiddenColumnAttribute chCAttr =                mColumn.Attributes.OfType&lt;CustomHiddenColumnAttribute&gt;().FirstOrDefault();               </span><span style="color: #008000;">//  Herhangi bir öznitelik ataması yoksa gizli değildir</span><span style="color: #000000;">            </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (chCAttr == </span><span style="color: #0000ff;">null</span><span style="color: #000000;">)                </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #0000ff;">false</span><span style="color: #000000;">;             </span><span style="color: #008000;">// İlgili alan için yapılan gizlilik bildirimleri parametrede            // gönderilmiş sayfa şablonunu içeriyorsa gizlidir</span><span style="color: #000000;">            </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> chCAttr.PageTemplateTypes.Contains(pTemplateType);;        }    }}

</span></pre>
</div>
<p>Artık daha önce yazdığımız alan oluşturucu sınıf üzerinde özel gizleme yapımızı denetleyen kodlar yazabiliriz. Yukarıda yazdığımız sınıfa yeni eklenen kodlar kalın olarak yazılmıştır.</p>
<div class="codeBlock">
<pre style="background-color: white;"><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Collections.Generic;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Web.DynamicData;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Web.UI;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> Eposta.Core.Extentions;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> Eposta.Core.Enums; </span><span style="color: #0000ff;">namespace</span><span style="color: #000000;"> Eposta.Core.CustomFieldGenerator{    </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">    </span><span style="color: #808080;">///</span><span style="color: #008000;"> Bu sınıf veri listelemesini işlemlerini    </span><span style="color: #808080;">///</span><span style="color: #008000;"> özelleştirmek amacıyla yazılmıştır.     </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #000000;">    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> CustomFieldGenerator : IAutoFieldGenerator    {        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> Veri listelemesi için incelenecek        </span><span style="color: #808080;">///</span><span style="color: #008000;"> tablo değişkenini tutar        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #000000;">        </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> MetaTable mTable = </span><span style="color: #0000ff;">null</span><span style="color: #000000;">;

        </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> PageTemplateType pTemplateType;         </span><span style="color: #0000ff;">#region</span><span style="color: #000000;"> ctor         </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> CustomFieldGenerator(MetaTable _mTable, PageTemplateType _pTemplateType)        {            </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.mTable = _mTable;            </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.pTemplateType = _pTemplateType;        }         </span><span style="color: #0000ff;">#endregion</span><span style="color: #000000;">         </span><span style="color: #0000ff;">#region</span><span style="color: #000000;"> IAutoFieldGenerator Members        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;summary&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> Listeleme işlemini gerçekleştirecek method        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;/summary&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;param name="control"&gt;&lt;/param&gt;</span><span style="color: #008000;">        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&lt;returns&gt;&lt;/returns&gt;</span><span style="color: #000000;">        </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> System.Collections.ICollection GenerateFields(Control control)        {            </span><span style="color: #008000;">// Uygun kolonların biriktirildiği koleksiyon</span><span style="color: #000000;">            List&lt;DynamicField&gt; dynFieldList = </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> List&lt;DynamicField&gt;();            </span><span style="color: #008000;">// MetaTable atanmışsa</span><span style="color: #000000;">            </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (mTable != </span><span style="color: #0000ff;">null</span><span style="color: #000000;">)            {                </span><span style="color: #008000;">// Her bir MetaColumn için</span><span style="color: #000000;">                </span><span style="color: #0000ff;">foreach</span><span style="color: #000000;"> (MetaColumn mColumn </span><span style="color: #0000ff;">in</span><span style="color: #000000;"> </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.mTable.Columns)                {                    </span><span style="color: #008000;">// 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</span><span style="color: #000000;">                    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (                            !mColumn.Scaffold                        )                        </span><span style="color: #0000ff;">continue</span><span style="color: #000000;">;                     </span><span style="color: #008000;">// List ve ListDetails şablonları için IsHidden                    // genişletilmiş methodu ve IsLongString methodunu                    // kontrol ediyoruz ancak Details şablonu için                    // IsLongString methodunu kontrol edip gizlersek                    // uzun metin alanlar görüntülenmeyecek yani ufak bir                    // bug oluşacaktır.</span><span style="color: #000000;">                    </span><span style="color: #0000ff;">switch</span><span style="color: #000000;"> (</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.pTemplateType)                    {                        </span><span style="color: #0000ff;">case</span><span style="color: #000000;"> PageTemplateType.Details:                            </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (mColumn.IsHidden(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.pTemplateType))                                </span><span style="color: #0000ff;">continue</span><span style="color: #000000;">; </span><span style="color: #008000;">// foreach</span><span style="color: #000000;">                            </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;                        </span><span style="color: #0000ff;">case</span><span style="color: #000000;"> PageTemplateType.List:                            </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (mColumn.IsHidden(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.pTemplateType) ||                                    mColumn.IsLongString)                                </span><span style="color: #0000ff;">continue</span><span style="color: #000000;">; </span><span style="color: #008000;">// foreach</span><span style="color: #000000;">                            </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;                        </span><span style="color: #0000ff;">case</span><span style="color: #000000;"> PageTemplateType.ListDetails:                            </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (mColumn.IsHidden(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.pTemplateType) ||                                    mColumn.IsLongString)                                </span><span style="color: #0000ff;">continue</span><span style="color: #000000;">; </span><span style="color: #008000;">// foreach</span><span style="color: #000000;">                            </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;                        </span><span style="color: #0000ff;">default</span><span style="color: #000000;">:                            </span><span style="color: #0000ff;">break</span><span style="color: #000000;">;                    }                     </span><span style="color: #008000;">// Varsayılan şablonların haricinde uzun metinlerin                    // görüntülenmesini engellemek amacıyla bu kontrol                    // yapılıyor</span><span style="color: #000000;">                    </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (mColumn.IsLongString)                        </span><span style="color: #0000ff;">continue</span><span style="color: #000000;">;                     DynamicField dynField = </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> DynamicField();                    dynField.DataField = mColumn.Name;                     dynFieldList.Add(dynField);                }            }            </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> dynFieldList;        }        </span><span style="color: #0000ff;">#endregion</span><span style="color: #000000;">    }}</span></pre>
</div>
<p>Son adımında ise ilgili veri kontrolüne veri listeleme işlemini bizim üstleneceğimizi bildirmek gerekiyor. GridView nesnesi için <strong>ColumnGenerator</strong> DetailsView içinse <strong>RowGenerator</strong> parametresi kullanılıyor. Son haliyle <strong>List</strong>.aspx.cs ve <strong>Details</strong>.aspx.cs şablon kodları aşağıdaki gibi tanımlanmalıdır.</p>
<p><strong>List.aspx.cs kodları:</strong></p>
<div class="codeBlock">
<pre style="background-color: white;"><span style="color: #0000ff;">using</span><span style="color: #000000;"> System;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Web.DynamicData;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> Eposta.Core.CustomFieldGenerator;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> Eposta.Core.Extentions; </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">partial</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> List : System.Web.UI.Page{    </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> MetaTable table;    </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> Page_Init(</span><span style="color: #0000ff;">object</span><span style="color: #000000;"> sender, EventArgs e)    {        DynamicDataManager1.RegisterControl(GridView1, </span><span style="color: #0000ff;">true</span><span style="color: #000000;"> </span><span style="color: #008000;">/*setSelectionFromUrl*/</span><span style="color: #000000;">);        table = GridDataSource.GetTable();        GridView1.<strong>ColumnsGenerator </strong>= </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> <strong>CustomFieldGenerator</strong>(table,<strong> Eposta.Core.Enums.PageTemplateType.List</strong>);    }    </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> Page_Load(</span><span style="color: #0000ff;">object</span><span style="color: #000000;"> sender, EventArgs e)    {        Title = table.DisplayName;        InsertHyperLink.NavigateUrl = table.GetActionPath(PageAction.Insert);         </span><span style="color: #008000;">// Disable various options if the table is readonly</span><span style="color: #000000;">        </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (table.IsReadOnly)        {            GridView1.Columns[</span><span style="color: #800080;">0</span><span style="color: #000000;">].Visible = </span><span style="color: #0000ff;">false</span><span style="color: #000000;">;            InsertHyperLink.Visible = </span><span style="color: #0000ff;">false</span><span style="color: #000000;">;        }    }    </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> OnFilterSelectedIndexChanged(</span><span style="color: #0000ff;">object</span><span style="color: #000000;"> sender, EventArgs e)    {        GridView1.PageIndex = </span><span style="color: #800080;">0</span><span style="color: #000000;">;    }}</span></pre>
</div>
<p><strong><br />
Details.aspx.cs kodları:</strong></p>
<div class="codeBlock">
<pre style="background-color: white;"><span style="color: #0000ff;">using</span><span style="color: #000000;"> System;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Linq;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Web.DynamicData;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Web.UI.WebControls;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> Eposta.Core.CustomFieldGenerator;</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> Eposta.Core.CustomAttributes; </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">partial</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Details : System.Web.UI.Page {    </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> MetaTable table;    </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> Page_Init(</span><span style="color: #0000ff;">object</span><span style="color: #000000;"> sender, EventArgs e) {        DynamicDataManager1.RegisterControl(DetailsView1);    }    </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> Page_Load(</span><span style="color: #0000ff;">object</span><span style="color: #000000;"> sender, EventArgs e) {        table = DetailsDataSource.GetTable();        DetailsView1.<strong>RowsGenerator </strong>= </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> <strong>CustomFieldGenerator</strong>(table, <strong>Eposta.Core.Enums.PageTemplateType.Details</strong>);

        Title = table.DisplayName;

        ListHyperLink.NavigateUrl = table.ListActionPath;    }    </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> DetailsView1_ItemDeleted(</span><span style="color: #0000ff;">object</span><span style="color: #000000;"> sender, DetailsViewDeletedEventArgs e) {        </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (e.Exception == </span><span style="color: #0000ff;">null</span><span style="color: #000000;"> || e.ExceptionHandled) {            Response.Redirect(table.ListActionPath);        }    }}

</span></pre>
</div>
<p>Çözüm itibari ile Grup tablosunda yapılan tanımlalarla listeleme sayfa şablonlarında bazı alanların gizlenmesini güncelleme ve detaylı görüntüleme sayfa şablonlarında ise kullanıcının verileri görüntülemesine ve düzenlemesine imkan tanımış olduk. Ekran görüntüleri aşağıdaki gibidir.</p>
<p><strong>Güncelleme ekranı:</strong></p>
<p><img src="http://www.yazgelistir.com/Makaleler/Resimler/1000002433_1.jpg" alt="" width="374" height="264" /></p>
<p><strong>Listeleme ekranı:</strong></p>
<p><img src="http://www.yazgelistir.com/Makaleler/Resimler/1000002433_2.jpg" alt="" width="493" height="271" /></p>
<p>Bir yazının daha sonuna geldik. Kullanıcı gereksinimleriyle alakalı makaleler devam edecektir. Bir sonraki makalede görüşmek üzere. Yaşasın <span class="style6"><strong>dinamizm</strong></span>!</p>
<p><strong>Ömer Faruk ZORLU<br />
</strong></p>
<td align="center"> </td>
<p></span></p>
<table id="Table21" border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="menuLeftCaption" colspan="3"> </td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.systemdoktoru.com/2010/04/asp-net-dynamic-data-gelismis-scaffolding-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

