<?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; Dynamic Data Web Site ile</title>
	<atom:link href="http://www.systemdoktoru.com/etiket/dynamic-data-web-site-ile/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 Web Site ile File Upload İşlemleri</title>
		<link>http://www.systemdoktoru.com/2010/04/asp-net-dynamic-data-web-site-ile-file-upload-islemleri-2/</link>
		<comments>http://www.systemdoktoru.com/2010/04/asp-net-dynamic-data-web-site-ile-file-upload-islemleri-2/#comments</comments>
		<pubDate>Fri, 30 Apr 2010 10:26:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Dynamic Data Web Site ile]]></category>
		<category><![CDATA[File Upload İşlemleri]]></category>

		<guid isPermaLink="false">http://www.systemdoktoru.com/?p=13</guid>
		<description><![CDATA[ 
 

MetaData üzerinden öznitelik ataması yapılarak doğrulama, biçimleme ve özel alan şanlonlarını(FieldTemplates) nasıl kullanacağımızdan bahsetmiştik.
Bu makale özel özniteliklerin ve alan şablonlarının geliştirilmesi konusunu içerecektir. Bu nedenle FileUpload kontrolünün kullanımı ve alan şablonlarının çalışma mantığıyla özel özniteliklerin kullanımı hakkında bilgi sahibi olacağız.
Önceki makalemde bahsettiğim gibi ASP.NET Dynamic Data Web Site ile FileUpload işlemlerini klasik yöntemlerle kullanamıyoruz.





ASP.NET Dynamic [...]]]></description>
			<content:encoded><![CDATA[<p> </p>
<td colspan="3"> </td>
<p><span id="lblMakale"><br />
<!-- .style2 {color: #006600} -->MetaData üzerinden öznitelik ataması yapılarak doğrulama, biçimleme ve özel alan şanlonlarını(FieldTemplates) nasıl kullanacağımızdan bahsetmiştik.</p>
<p>Bu makale özel özniteliklerin ve alan şablonlarının geliştirilmesi konusunu içerecektir. Bu nedenle FileUpload kontrolünün kullanımı ve alan şablonlarının çalışma mantığıyla özel özniteliklerin kullanımı hakkında bilgi sahibi olacağız.</p>
<p>Önceki makalemde bahsettiğim gibi ASP.NET Dynamic Data Web Site ile FileUpload işlemlerini klasik yöntemlerle kullanamıyoruz.</p>
<p></span></p>
<table style="width: 409px; height: 83px;" border="0" cellspacing="1" cellpadding="1">
<tbody>
<tr>
<td><img src="http://www.yazgelistir.com/Makaleler/Resimler/1000002422_postit_733719.jpg" alt="" /></td>
<td>ASP.NET Dynamic Data Web Sitesinde Ajax Toolkit ile birlikte kullanıyorsanız ve FileUpload bileşeniniz <strong>UpdatePanel </strong>içerisinde yer alıyorsa <strong>ScriptManager </strong>nesnesinin <strong>EnablePartialRendering </strong>özelliğini <strong><span style="color: #ff0000;">false</span></strong><span style="color: #ff0000;"> </span>olarak atamanız gerekiyor.</td>
</tr>
</tbody>
</table>
<p><span id="lblMakale">Kodlamaya başlamadan önce yapılması gereken işlemleri özetlemenin faydalı olduğunu düşünüyorum. Kodlama detayları ilgili sınıfların içinde yer almaktadır.</p>
<ol>
<li>Zorunlu olmasa da dosyanın sunucuya yükleme işleminin gerçekleştirileceği yardımcı bir sınıf.</li>
<li>Her bir dosya yükleme alanı için dosya türü, boyutu vb. bildirimleri yapmak için öznitelik tabanlı bir sınıf</li>
<li>Dosya yükleme alanlarının ekleme ve güncelleme ekranı için FileUpload kontrolü listeleme ve detay sayfaları için ise dosya türüne göre yüklenen dosyaya uygun simge, önizleme vb. için alan şablonlarının(FieldTemplate) gerekli hazırlanması.</li>
<li>İşlevin kazandırılacağı alanlara gerekli öznitelik tanımlamasının yapılması</li>
</ol>
<p>Temel düzeyde dosya yükleme işlemini gerçekleştirmek üzere aşağıdaki sınıfı kullanacağız<br />
<strong><br />
FileUploadUtil.cs </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;
</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.IO;
</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.Extentions;
</span><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.Text.RegularExpressions;

</span><span style="color: #0000ff;">namespace</span><span style="color: #000000;"> Eposta.Core.Utils
{
    </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: #000000;">    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> FileUploadUtil
    {
        </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> </span><span style="color: #0000ff;">string</span><span style="color: #000000;"> _fileName;

        </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;"> Dosyanın yükleneceği fiziksel konum
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> Örnek kullanım: HttpContext.Current.Server.MapPath("~/Uploads/")
        </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;">string</span><span style="color: #000000;"> UploadDictionaryPath { </span><span style="color: #0000ff;">get</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;"> Yükleme işlemi başarısız olmuşsa bu değer
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> üzerinden hata mesajı okunabilir
        </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;">string</span><span style="color: #000000;"> ErrorMessage { </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;"> Değer atama işleminin ardından güvenlik, tekillik gibi
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> nedenler gereği isim değiştirilmelidir.
        </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;">string</span><span style="color: #000000;"> FileName
        {
            </span><span style="color: #0000ff;">get</span><span style="color: #000000;"> { </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> _fileName; }
            </span><span style="color: #0000ff;">set</span><span style="color: #000000;">
            {
                </span><span style="color: #0000ff;">string</span><span style="color: #000000;"> strExtention = Path.GetExtension(value);

                </span><span style="color: #008000;">// ToSEFString methodu gönderilen string değeri arama
                // motoru dostu karakterler ile değiştirir
                //
                // RandomHelper sınıfı doğru rasgele karakterler ve
                // sayılar üretmek için kullanılıyor
                // Bağlantı: </span><span style="color: #008000; text-decoration: underline;">http://tinyurl.com/y8of6sn</span><span style="color: #008000;">
</span><span style="color: #000000;">                _fileName = Path.GetFileNameWithoutExtension(value).ToSEFString()
                + RandomHelper.RandomString(</span><span style="color: #800080;">10</span><span style="color: #000000;">, </span><span style="color: #0000ff;">true</span><span style="color: #000000;">)
                + strExtention;
            }
        }

        </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;"> ctor
        </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;"> FileUploadUtil()
        {
            _fileName = </span><span style="color: #0000ff;">string</span><span style="color: #000000;">.Empty;
        }

        </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;"> Dosya yükleme işleminin tetiklenmesi için bu method çağırılmalıdır.
        </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="postedFile"&gt;</span><span style="color: #008000;">
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> Bu değişken klasik html input alanları tarafından post edilen
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> verilerinde methodu kullanabilmeleri için bu tipte tanımlanmıştır.
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> FileUpload kontrolü kullanılacaksa PostedFile özelliği gönderilebilir.
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&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="fuAttribute"&gt;</span><span style="color: #008000;">
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> Dosya yükleme işleminin gerçekleşmesi ile ilgili bilgiler içeren sınıftır
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> Attribute sınıfından türetilmiştir. MetaColumn ile kullanılacaksa ilgili
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> alan üzerinde tanımlı özniteliğin gönderilmesi yeterlidir.
        </span><span style="color: #808080;">///</span><span style="color: #008000;"> </span><span style="color: #808080;">&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;">bool</span><span style="color: #000000;"> UploadFile(HttpPostedFile postedFile, FileUploadAttribute fuAttribute)
        {
            </span><span style="color: #0000ff;">#region</span><span style="color: #000000;"> Checks
            </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (postedFile.ContentLength &lt;= </span><span style="color: #800080;">0</span><span style="color: #000000;">)
            {
                </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.ErrorMessage = </span><span style="color: #800000;">"Veri akışı bulunamadı"</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;">// Maksimum dosya boyutu öznitelikte atanan değere göre kontrol ediliyor.
</span><span style="color: #000000;">            </span><span style="color: #0000ff;">long</span><span style="color: #000000;"> FileSize = postedFile.ContentLength;
            </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (FileSize &gt; (fuAttribute.MaximumFileSize * </span><span style="color: #800080;">1024000</span><span style="color: #000000;">))
            {
                </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.ErrorMessage = </span><span style="color: #0000ff;">string</span><span style="color: #000000;">.Format(</span><span style="color: #800000;">"Maksimum dosya boyutu izin verilenden fazla olamaz. İzin verilen maksimum dosya boyutu: {0}"</span><span style="color: #000000;">, fuAttribute.MaximumFileSize);
                </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;">// Dosya uzantısı öznitelikte atanan değere göre kontrol ediliyor.
            // İçerik türüne(MIME) görede kontrol edilebilir.
</span><span style="color: #000000;">            </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (!Regex.IsMatch(Path.GetExtension(_fileName), fuAttribute.AllowedFileFormats, RegexOptions.IgnoreCase))
            {
                </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.ErrorMessage = </span><span style="color: #0000ff;">string</span><span style="color: #000000;">.Format(</span><span style="color: #800000;">"Dosya türüne izin verilmiyor. İzin verilen dosya formatları: {0}"</span><span style="color: #000000;">, fuAttribute.AllowedFileFormats);
                </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: #0000ff;">#endregion</span><span style="color: #000000;">

            </span><span style="color: #008000;">// Klasör yoksa oluştur.
</span><span style="color: #000000;">            DirectoryInfo DInfo = </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> DirectoryInfo(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.UploadDictionaryPath);
            </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (!DInfo.Exists)
                DInfo.Create();

            </span><span style="color: #0000ff;">#region</span><span style="color: #000000;"> WriteStreamToFile
            </span><span style="color: #008000;">// Dosyayı kaydet
</span><span style="color: #000000;">            </span><span style="color: #0000ff;">string</span><span style="color: #000000;"> strFullFileName = </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.UploadDictionaryPath + </span><span style="color: #0000ff;">this</span><span style="color: #000000;">._fileName;
            postedFile.SaveAs(strFullFileName);
            </span><span style="color: #0000ff;">#endregion</span><span style="color: #000000;">

            </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #0000ff;">true</span><span style="color: #000000;">;
        }
    }
}</span></pre>
</div>
<p>Yukarıdaki sınıf içinde kullanılan FileUploadAttribute sınıfını dosya yükleme işleminin gerçekleşmesini istediğimiz kolon için gerekli bildirimlerin yapılması için kullanacağız . Bu sınıfın kodlaması aşağıdaki gibidir.</p>
<div class="codeBlock">using System;</div>
<p>namespace Eposta.Core.CustomAttributes<br />
{<br />
    /// &lt;summary&gt;<br />
    /// Ömer Faruk ZORLU<br />
    /// &lt;/summary&gt;<br />
    [AttributeUsage(AttributeTargets.All, AllowMultiple = true)]<br />
    public class FileUploadAttribute : Attribute<br />
    {<br />
        /// &lt;summary&gt;<br />
        /// <span class="style2">Yüklenecek dosyanın maksimum boyutunun megabyte karşılığıdır.</span><br />
        /// &lt;/summary&gt;<br />
        public short MaximumFileSize { get; set; }</p>
<p>        /// &lt;summary&gt;<br />
        /// <span class="style2">Bu özellik adının kontrol edilmesi için kullanılır.</span><br />
        /// <span class="style2">Kontrol işlemi RegularExpressions(Regex) sınıfı ile</span><br />
        /// <span class="style2">gerçekleştirilir.</span><br />
        ///<br />
        /// <span class="style2">Örnek Kullanım: &#8220;jpg|gif|png|JPG|GIF|PNG&#8221;</span><br />
        /// &lt;/summary&gt;<br />
        public string AllowedFileFormats { get; set; }</p>
<p>        /// &lt;summary&gt;<br />
        /// <span class="style2">Yükleme işleminin gerçekleştirileceği klasörün fiziksel </span><br />
        /// <span class="style2">yolunu saklar.</span><br />
        ///<br />
        /// <span class="style2">Örnek Kullanım: HttpContext.Current.Server.MapPath(&#8220;~/Uploads/&#8221;)</span><br />
        /// &lt;/summary&gt;<br />
        public string UploadDictionaryPath { get; set; }<br />
    }<br />
}</p>
<p>Buraya kadarki kodlamalarla iş katmanı için yükleme işini üstlenecek sınıfların kodlamasını tamamlamış olduk. Sırada bu katmanı istediğimiz kolon üzerinde kullanabilmek için gerekli alan şablonunu tasarlama işi var.  Daha önceki makalelerde belirttiğim gibi güncelleme, ekleme ve listeleme, detay sayfa şablonları için iki adet alan şablonu hazırlanmalıdır. Ekleme ve günnceleme için gerekli alan şablonunun kodları aşağıdaki gibidir.</p>
<p><strong>MyFileUpload_Edit.ascx</strong></p>
<div class="codeBlock">
<pre style="background-color: white;"><span style="color: #000000;">&lt;%@ Control Language=</span><span style="color: #800000;">"C#"</span><span style="color: #000000;"> CodeFile=</span><span style="color: #800000;">"MyUpload_Edit.ascx.cs"</span><span style="color: #000000;"> Inherits=</span><span style="color: #800000;">"MyUpload_Edit"</span><span style="color: #000000;"> %&gt;
&lt;asp:Label ID=</span><span style="color: #800000;">"Label1"</span><span style="color: #000000;"> runat=</span><span style="color: #800000;">"server"</span><span style="color: #000000;"> Text=</span><span style="color: #800000;">'&lt;%# FieldValueEditString %&gt;'</span><span style="color: #000000;">&gt;&lt;/asp:Label&gt;&lt;br /&gt;
&lt;asp:FileUpload ID=</span><span style="color: #800000;">"FileUpload1"</span><span style="color: #000000;"> runat=</span><span style="color: #800000;">"server"</span><span style="color: #000000;"> /&gt;
&lt;asp:CustomValidator ID=</span><span style="color: #800000;">"CustomValidator1"</span><span style="color: #000000;"> runat=</span><span style="color: #800000;">"server"</span><span style="color: #000000;">
    ErrorMessage=</span><span style="color: #800000;">"CustomValidator"</span><span style="color: #000000;">&gt;&lt;/asp:CustomValidator&gt;</span></pre>
</div>
<p><strong>MyFileUpload_Edit.ascx.cs</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.Collections.Specialized;
</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.Linq;
</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.Utils;

</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;"> MyUpload_Edit : System.Web.DynamicData.FieldTemplateUserControl
{
    </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)
    {

    }

    </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> </span><span style="color: #0000ff;">override</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> OnDataBinding(EventArgs e)
    {
        </span><span style="color: #0000ff;">base</span><span style="color: #000000;">.OnDataBinding(e);
    }

    </span><span style="color: #0000ff;">protected</span><span style="color: #000000;"> </span><span style="color: #0000ff;">override</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> ExtractValues(IOrderedDictionary dictionary)
    {
        </span><span style="color: #008000;">// DataControl nesnesi olarak Label1 atandığı için
        // dosya yüklemenmesede varsayılan olarak zaten kayıtlı olan
        // veri dönüş değerinde kullanılmak üzere atanıyor
</span><span style="color: #000000;">        dictionary[Column.Name] = ConvertEditedValue(Label1.Text);

        </span><span style="color: #008000;">// Bu kolon üzerinde atanması zorunlu olan FileUploadAttribute
        // özniteliği alınıyor.
</span><span style="color: #000000;">        var fuAttribute = </span><span style="color: #0000ff;">base</span><span style="color: #000000;">.Column.Attributes.OfType&lt;FileUploadAttribute&gt;().FirstOrDefault();
        </span><span style="color: #008000;">// FileUploadAttribute ataması yoksa dön
</span><span style="color: #000000;">        </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (fuAttribute == </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: #008000;">// Dosya seçilmişse
</span><span style="color: #000000;">        </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (FileUpload1.HasFile)
        {
            </span><span style="color: #0000ff;">try</span><span style="color: #000000;">
            {
                FileUploadUtil fuUtil = </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> FileUploadUtil();
                </span><span style="color: #008000;">// Atama işleminin ardından dosyaya yeni isim atanıyor.
</span><span style="color: #000000;">                fuUtil.FileName = FileUpload1.FileName;
                fuUtil.UploadDictionaryPath = fuAttribute.UploadDictionaryPath;

                </span><span style="color: #008000;">// Dosyayı yükle ve yeni dosya adını dönüş değeri olarak ata.
                // Hata kontrolüne karşı ilgili değişken(string ErrorMessage)
                // kontrol edilebilir.
</span><span style="color: #000000;">                </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (fuUtil.UploadFile(FileUpload1.PostedFile, fuAttribute))
                    dictionary[Column.Name] = fuUtil.FileName;
            }
            </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Exception Ex)
            {
                </span><span style="color: #008000;">// Denetlenmemiş herhangi bir hata oluşursa sayfanın tamamen
                // hata vermesi yerine hata mesajını hata özetlerinde ve atama
                // işleminin yapıldığı alanın yanında görünmesi için CustomValidator1
                // nesnesinden yararlanılıyor.
</span><span style="color: #000000;">                CustomValidator1.IsValid = </span><span style="color: #0000ff;">false</span><span style="color: #000000;">;
                CustomValidator1.ErrorMessage = Ex.Message;
            }
        }
    }

    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">override</span><span style="color: #000000;"> Control DataControl
    {
        </span><span style="color: #0000ff;">get</span><span style="color: #000000;">
        {
            </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> Label1;
        }
    }
}</span></pre>
</div>
<p>Listeleme ve detay sayfa şablonlarında kullanılacak alan şablonu kodları aşağıdaki gibidir. Yüklenen dosyaların(ilgili verilerin) yalnızca    resim dosyası olduğu öngörülerek yazılmıştır. Dosya tipi yada türüne göre özelleştirilmiş görüntüleme tekniği kullanılabilir.</p>
<p><strong>MyUpload.ascx.cs</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.UI;

</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;"> MyUpload : System.Web.DynamicData.FieldTemplateUserControl
{
    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">override</span><span style="color: #000000;"> Control DataControl
    {
        </span><span style="color: #0000ff;">get</span><span style="color: #000000;">
        {
            </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> imgThumbnail;
        }
    }

    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">string</span><span style="color: #000000;"> GetSrcUrl()
    {
        </span><span style="color: #008000;">// Veri boş ya da null ise NoImage.gif dönder
</span><span style="color: #000000;">        </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (String.IsNullOrEmpty(FieldValueString)) </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #800000;">"NoImage.gif"</span><span style="color: #000000;">;

        </span><span style="color: #008000;">// Veri http, ftp vb herhangi bir protokolü kullanıyor ise
        // olduğu gibi değilse upload klasörünü kök dizin alarak dönder
</span><span style="color: #000000;">        </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (-</span><span style="color: #800080;">1</span><span style="color: #000000;"> &lt; FieldValueString.IndexOf(</span><span style="color: #800000;">"://"</span><span style="color: #000000;">))
            </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> FieldValueString;
        </span><span style="color: #0000ff;">else</span><span style="color: #000000;">
            </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #800000;">"~/uploads/"</span><span style="color: #000000;"> + FieldValueString;
    }
} </span></pre>
</div>
<p><em>Dynamic Data’nın en sevdiğim kısımı tabiki MetaData üzerinde yapılan tanımlamalardır. O kadar çok kod yazmak gerekiyorki daha ne yapalım birde diyenleri duyar gibiyim.</em></p>
<p></span></p>
<table border="0" cellspacing="1" cellpadding="1" width="100%">
<tbody>
<tr>
<td><img style="width: 23px; height: 25px;" src="http://www.yazgelistir.com/Makaleler/Resimler/1000002422_postit_733719.jpg" alt="" /></td>
<td><span style="text-decoration: underline;">Dynamic Data ile yapılan her geliştirme tasarruf niteliği taşır. </span></td>
</tr>
</tbody>
</table>
<p><span id="lblMakale">Geliştirdiğimiz dosya yükleme aracı için klasik kodlama kullansaydık benzer kodları kullanmak istediğimiz sayfalarda(aynı sayfada pek çok kere de olabilir) harcanan efor göz önüne alınmalıdır. Yapılan geliştirme bir sonraki proje için <strong><span style="text-decoration: underline;">yatırımdır</span></strong>. Ayrıca geriye dönük olarak yapılan projelerde kullan/a/mamak için bir neden söz konusu değildir.</p>
<p>Şimdi en zevkli kısıma gelelim. Bundan böyle dosya yükleme(FileUpload) işlemi ile çalışmasını istediğiniz herhangi bir kolon için meta data üzerinde aşağıdaki gibi bir tanımlama yapmanız yeterli oluyor.</p>
<p><em><strong>NORTWIND </strong></em>veritabanında bulunan <em>Employee </em>tablosundaki <span style="text-decoration: underline;"><em>PhotoPath </em></span>kolonu için yapılan örnek tanımlama:</p>
<div class="codeBlock">
<pre style="background-color: white;"><span style="color: #0000ff;">using</span><span style="color: #000000;"> System.ComponentModel.DataAnnotations;

[MetadataType(</span><span style="color: #0000ff;">typeof</span><span style="color: #000000;">(EmployeeMetaData))]
</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;"> Employee
{

}

</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> EmployeeMetaData
{
    [Eposta.Core.CustomAttributes.FileUpload(
        AllowedFileFormats = </span><span style="color: #800000;">"jpg|gif|png|JPG|GIF|PNG"</span><span style="color: #000000;">,
        MaximumFileSize = </span><span style="color: #800080;">1</span><span style="color: #000000;">, </span><span style="color: #008000;">// MB
</span><span style="color: #000000;">        UploadDictionaryPath = </span><span style="color: #800000;">"~/uploads/"</span><span style="color: #000000;">
        )]
    [UIHint(</span><span style="color: #800000;">"MyUpload"</span><span style="color: #000000;">)]
    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">string</span><span style="color: #000000;"> PhotoPath { </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>Ekran görüntüleri<br />
<em>Listemele ve detay sayfa şablonlarında:</em></p>
<p style="text-align: center;"><img src="http://www.yazgelistir.com/Makaleler/Resimler/1000002422_1_733710.JPG" alt="" /></p>
<p><em>Ekleme ve Güncelleme sayfa şablonlarında:</em></p>
<p><img src="http://www.yazgelistir.com/Makaleler/Resimler/1000002422_2_733710.JPG" alt="" /></p>
<p>Meraklısından meraklılarına faydalı olması dileğiyle. Mutlu kodlar.</p>
<p><strong>Ömer Faruk ZORLU</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-web-site-ile-file-upload-islemleri-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

