tag:blogger.com,1999:blog-354814502009-07-15T00:02:30.247+03:00Turhal Temizer 'in BloguWPF, Silverlight, C#, F#, Asp.Net, MVC Framework, Windows 7, Windows Mobile 7, ...turhaltemizerhttp://www.blogger.com/profile/14762155033738029313noreply@blogger.comBlogger269125tag:blogger.com,1999:blog-35481450.post-74055482626818961122009-07-15T00:01:00.000+03:002009-07-15T00:02:30.371+03:00Asp.Net MVC Framework - Validation İşlemleri - I<div align="justify"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Asp.Net ile geliştirdiğimiz uygulamalarda kullanıcı bazlı olarak işlem yaptırmak istediğimizde verilen doğru olarak girilip girilmediğini kontrol etmemiz gerekmektedir. Örneğin böyle bir kontrol yapmadığımızda kişiler kimlik numarasını girmek yerine adını da yazabilmektedir. Bu istenmeyen bir durumdur. Kimlik numarası 11 haneden oluşmakta ve yalnızca rakamlardan oluşmaktadır ki harf girilmesi istenmeyen durumlar arasında gösterilmektedir. Peki bu kontrolü yapmak için nasıl işlemler uygulamamız gerekmekte kısaca bir hatırlayalım. Klasik yöntemlerden birincisi sayfamızın markup kod tarafında Java Script ile hazırlanmış kontrolleri ekleyerek kullanabiliriz. Bir diğer seçeneğimiz *.cs veya *.vb kod tarafında hazırlamış olduğumuz manüel kontroller yardımı ile bu durumu engelleyebilme şansımız vardır. Fakat bu yöntemin çalışması için internet sayfasının en az bir kez server ile haberleşmesi ve yeniden yüklenmesi gerekmektedir ki bu da web sitesinin hızlılığı açısından istenmeyen bir durumdur. Son ve en sık kullanılan özellik ise Asp.Net Validation kontrollerinin kullanılmasıdır. Bu yöntem oldukça başarılı ve bizim kullanmış olduğumuz kontrol üzerindeki işlemimiz tamamlandığı anda kendisini aktifleştiren bir yöntemdir. <br /> <br />Yukarıdaki paragrafta yer alan özelliklerin hepsini okuduktan sonra her şey çok güzel o zaman ben işlemimi Asp.Net Validation kontrolleri yardımı ile gerçekleştireyim şeklinde aklınıza çözüm gelebilir. Evet yapabiliriz. Fakat bizim ana amacımız hazırlanan internet sayfalarınız daha performanslı bir şekilde açılabilmesi olduğu için Validation kontrolleri yerine başka bir kontrol kullanalım. Fakat unutmayalım ki MVC Framework ile hazırlamış olduğumuz uygulamalarda Asp.Net kontrolleri kullanılması mümkündür. Ama biz controller tarafında hazırlayacak olduğumuz işlemler yardımı ile Validation kontrollerini kullanmak istiyoruz. Çünkü bizler web sayfasının markup kodunda asp kontrolleri yerine <strong>Html.*</strong> şeklinde HTML içeriklerini kullanmak istemekteyiz. Bu yazımız boyunca bu işlemleri nasıl yapabileceğimize detaylı bir şekilde incelemeye çalışıyoruz olacağız. <br /> <br />Validation işlemlerimizi yapabilmemiz için Model kavramını incelerken kullanmış olduğumuz proje üzerinde değişiklikler yaparak başlıyoruz. İlk olarak veri tabanımıza Dukkan isimli bir tablo daha ekliyoruz ve alanları olarak; <br />• Id <br />• Name <br />• Description <br />• UnitPrice <br />• Stock <br />belirledikten sonra Entity modele ekleme işlemini gerçekleştirebilmek için *.edmx ara yüzünün üzerinde sağ tıklama yaptıktan sonra <strong>Update Model from Database</strong> seçeneğine tıklayarak yeni bir tablo ekleyebileceğimiz ekrana geliyoruz. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak57_1.gif" width="234" height="264" /> <br /> <br />Karşımıza gelen ekranda Tables seçeneğinden yeni eklemek istediğimiz tabloyu seçtikten sonra tamam seçeneğine basarak Entity modelinin içeriğindeki tablo sayısını arttırıyoruz. Ayrıca daha önceki yazılarımızda değinmiş olmamıza karşın tekrardan hatırlamak gerekirse, Entity Model 'in içerisine tablo,view ve store prodecure (sp) ekleyebilmemiz mümkündür. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak57_2.gif" width="536" height="419" /> <br /> <br />Eklemiş olduğumuz tablo entity modelde gözükmüştür. Bu tabloya ilişkin işlemleri yapabilmemiz için projeye bir tane Controller sınıfı ekliyoruz. İçeriğinde ilk olarak tablo içerisinde yer alan verilerin gözükmesi için index() metodunu dolduruyoruz. Sonrasında da herhangi bir veri yoksa yeni bir kayıt ekleme işlemini yapacağız. Bu noktada dikkat edeceğimiz yer başlamaktadır. Yazımızın başlarında Validation işlemlerini açıklarken en sık kullanım yerinin başında son kullanıcıya veri ekleme izni verilen yerlerde olduğundan bahsetmiştik. İşte bizde bu controller içerisinde yeni bir kayıt eklemek istediğimiz durumda Validation işlemlerini nasıl uygulayabileceğimize göz atacağız. Bunun için Create metodunda aşağıdaki eklemeleri ve düzenlemeleri yapıyoruz. <br /> <br /><strong>Controller\ProductController.cs</strong> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">public ActionResult Create() <br />{ <br />&#160;&#160;&#160; return View(); <br />} <br /> <br />// <br />// POST: /Product/Create <br /> <br />[AcceptVerbs(HttpVerbs.Post)] <br />public ActionResult Create([Bind(Exclude=&quot;Id&quot;)] Dukkans dukkansToCreate) <br />{ <br /> <br /><strong>&#160;&#160;&#160; //Kontrollerin yapıldığı kısımdır.</strong> <br />&#160;&#160;&#160; if (dukkansToCreate.Name.Trim().Length == 0) <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>ModelState.AddModelError</strong>(&quot;Name&quot;, &quot;İsim degeri bos gecilemez...&quot;); <br />&#160;&#160;&#160; if (dukkansToCreate.Description.Trim().Length == 0) <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>ModelState.AddModelError</strong>(&quot;Description&quot;, &quot;Aciklama degerleri bos gecilemez&quot;); <br />&#160;&#160;&#160; if(dukkansToCreate.UnitStock&lt;0) <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>ModelState.AddModelError</strong>(&quot;UnitPrice&quot;,&quot;UnitPrice degeri 0 dan az olamaz...&quot;); <br />&#160;&#160;&#160; if (ModelState.IsValid) <br />&#160;&#160;&#160; return Create(); <br />&#160;&#160;&#160; try <br />&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; // TODO: Add insert logic here <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; _db.AddToDukkansSet(dukkansToCreate); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; _db.SaveChanges(); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; return RedirectToAction(&quot;Index&quot;); <br />&#160;&#160;&#160; } <br />&#160;&#160;&#160; catch <br />&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; return View(); <br />&#160;&#160;&#160; } <br />} </font></td> </tr> </tbody></table> <br />Entity Model 'de yer alan veri tabanı tablosuna ilişkin elemanları tek tek değer kontrolü ettikten sonra bizim belirtmiş olduğumuz özellikler kriterleri kullanıcının girmiş olduğu veriler geçemezse <strong>ModelState.AddModelError()</strong> ile işlem yapılacak alan için istenilen mesaj verilebilir duruma gelinmiştir. Peki, <em><strong>&quot;bizler hiç kontrol eklemezse varsayılan olarak yaptığı kontroller var mıdır?&quot;</strong></em> şeklinde aklınıza bir soru takılabilir. Cevabı ise, evet vardır. Veri tabanı üzerindeyken tablonuzu oluşturma esnasında alanlardan boş geçilemez olarak tanımlamış olduğunuz alanlarda varsayılan olarak kontrol yapılmaktadır ve yapılan kontrol verilerin girilip girilmediği kontrolüdür. <br /> <br />MVC uygulamalarında kullanıcıların göreceği katmana View denilmekteydi ve bu sayfaları controller da oluşturulmuş olan metotlar yardımı ile basitçe oluşturabiliyorduk. Şimdi tekrardan kısaca bu işleme göz atmak gerekirse, <br /> <br />İlk olarak oluşturmuş olduğumuz metodun üzerine geliyoruz ve sağ tıklama sonrası addView seçeneğine tıklıyoruz. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak57_3.gif" width="355" height="135" /> <br /> <br />Bir sonraki adımda karşımıza gelen ekranda Oluşturmak istediğimiz View 'ın adını (eğer vermezsek varsayılan olarak metodun adını alacaktır) ne tür işlem yapacağımızı ve veri sınıfının ne olacağını sormaktadır. Veri sınıfı bölümünde model isim alanı içerisinde yer alan nesnelerden tablomuzun isminin olduğu seçeneği seçmemiz durumunda yapmak istediğimiz işlemler sorunsuzca çalışacaktır. Aksi durumda çalışma anında hata ile karşılacaksınız. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak57_4.gif" width="414" height="439" /> <br /> <br />Yaptığımız işlemler sonrasında view sayfasını oluşturmuş bulunuyoruz. Artık bu sayfanın içeriğini inceleyebiliriz. <br /> <br /><strong>View\Product\Create.aspx</strong> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">&lt;%@ Page Title=&quot;&quot; Language=&quot;C#&quot; MasterPageFile=&quot;~/Views/Shared/Site.Master&quot; Inherits=&quot;System.Web.Mvc.ViewPage&lt;FilmUygulama.Models.Dukkans&gt;&quot; %&gt; <br /> <br />&lt;asp:Content ID=&quot;Content1&quot; ContentPlaceHolderID=&quot;TitleContent&quot; runat=&quot;server&quot;&gt; <br />&#160;&#160;&#160; Create <br />&lt;/asp:Content&gt; <br /> <br />&lt;asp:Content ID=&quot;Content2&quot; ContentPlaceHolderID=&quot;MainContent&quot; runat=&quot;server&quot;&gt; <br /> <br />&lt;h2&gt;Create&lt;/h2&gt; <br /> <br />&lt;%= Html.ValidationSummary(&quot;Create was unsuccessful. Please correct the errors and try again.&quot;) %&gt; <br /> <br />&lt;% using (Html.BeginForm()) {%&gt; <br /> <br />&#160;&#160;&#160; &lt;fieldset&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;legend&gt;Fields&lt;/legend&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;p&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;label for=&quot;Id&quot;&gt;Id:&lt;/label&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;%= Html.TextBox(&quot;Id&quot;) %&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;%= Html.ValidationMessage(&quot;Id&quot;, &quot;*&quot;) %&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/p&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;p&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;label for=&quot;Name&quot;&gt;Name:&lt;/label&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;%= Html.TextBox(&quot;Name&quot;) %&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;%= Html.ValidationMessage(&quot;Name&quot;, &quot;*&quot;) %&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/p&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;p&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;label for=&quot;Description&quot;&gt;Description:&lt;/label&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;%= Html.TextBox(&quot;Description&quot;) %&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;%= Html.ValidationMessage(&quot;Description&quot;, &quot;*&quot;) %&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/p&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;p&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;label for=&quot;Price&quot;&gt;Price:&lt;/label&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;%= Html.TextBox(&quot;Price&quot;) %&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;%= Html.ValidationMessage(&quot;Price&quot;, &quot;*&quot;) %&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/p&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;p&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;label for=&quot;UnitStock&quot;&gt;UnitStock:&lt;/label&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;%= Html.TextBox(&quot;UnitStock&quot;) %&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;%= Html.ValidationMessage(&quot;UnitStock&quot;, &quot;*&quot;) %&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/p&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;p&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;input type=&quot;submit&quot; value=&quot;Create&quot; /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/p&gt; <br />&#160;&#160;&#160; &lt;/fieldset&gt; <br /> <br />&lt;% } %&gt; <br /> <br />&#160;&#160;&#160; &lt;div&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;%=Html.ActionLink(&quot;Back to List&quot;, &quot;Index&quot;) %&gt; <br />&#160;&#160;&#160; &lt;/div&gt; <br /> <br />&lt;/asp:Content&gt;dasda </font></td> </tr> </tbody></table> <br />HTML elementinin özelliklerinden <strong>ValidationMessage()</strong> ile kullanıcıların veri girişinde yapmış oldukları hataları gösterebilmemize olanak tanımaktadır. Gerekli kontrolleri hatırlayacağınız üzere ProductController sınıfının içerisinde yer alan Create metodunun içerisinde yapılmıştı. Sizler index() metodunun dışında yer alan sayfaları da oluşturarak uygulamanızı daha da kullanışlı bir biçime getirebilmeniz mümkündür. Eğer bu işlemler esnasında herhangi bir zorluk yaşıyorsanız Asp.Net MVC Framework ile ilgili geçmiş yazıları okuyarak eksiklerinizi tamamlayabilirsiniz. Gerekli sayfaları oluşturduk ve web sayfasını çalıştırıyoruz. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak57_5.gif" width="650" height="368" /> <br /> <br />Adres çubuğuna dikkat edersek, oluşturulan controller in adına göre view katmanına alt klasörler oluşturuldu ve o klasörün içerisinde oluşturulmuş olan index sayfası çağırıldı. Fakat tablomuzda hiç bir kayıt olmadığı için karşımıza sadece tablo alanlarının isimleri gelmektedir. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak57_6.gif" width="650" height="501" /> <br /> <br />Gördüğünüz üzere ProductController sınıfında Create() metodunda kullanılacak değerler için eklemiş olduğumuz bütün Validation kontrolleri gerçekleşmiştir. Çok ufak bir hatırlatma yapmak gerekirse, Create() metodunda <strong>[Bind(Exclude=&quot;&quot;)]</strong> kullanım şekli veri tabanından ya da başka bir yerden otomatik olarak eklenecek olan verileri belirtmektedir. Bu bize belirtilen alan için değer bekleme eğer ki alan view sayfa üzerinde kaldırılmadıysa dahi girilen değeri görmeden işlemleri yapmaya devam et anlamına gelmektedir. <br /> <br />Yazımızda değinmiş olduğumuz konulara kısaca bir göz atmak gerekirse; İlk olarak Validation işlemlerinin hangi durumlarda, nasıl ve hangi amaçlarla kullanıldığını açıklamaya çalıştık. Bir sonraki adımımızda bir proje oluşturarak tablomuzu Entity Data model 'e ekleyerek proje içerisinde kullanılabilir bir duruma getirdikten sonra tablo için gerekli olan controller sınıf oluşturuldu. MVC Framework ile hazırlanmış olan web uygulamalarında Validation işlemlerini kullanmak istediğimizde Controller sınıflarının içerisinde yapmamız gerektiğini ve <strong>ModelState.AddModelError()</strong> özelliğini kullanmamız gerektiğine göz attık. Daha sonra oluşturmuş olduğumuz metodun view sayfasını nasıl oluşturabileceğimizi tekrardan hatırlayarak Create sayfasını oluşturduk. Markup kod tarafına otomatik olarak eklenen kodları incelediğimiz de gözümüze HTML elementinin bir başka özelliği çarpmaktadır ki bu özellik bizim uygulamak istediğimiz Validation işlemlerinde en çok yarayan '*' 'ı koymaktadır. <strong>HTML.ValidationMessage()</strong> özelliği ile de hatalı girilen bileşenlerin yanına kırmızı bir * koyarak daha da belirgin olabilmesine olanak tanımaktadır. En son olarak da yaptığımız işlemleri internet tarayıcında kontrol ederek işlemlerimizi tamamladık. <br /> <br />Umarım yararlı olabilmiştir. <br /> <br /><strong>Turhal Temizer</strong> <br /><a href="mailto:info@turhaltemizer.com">info@turhaltemizer.com</a> <br /></font></div> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35481450-7405548262681896112?l=turhal.blogspot.com'/></div>turhaltemizerhttp://www.blogger.com/profile/14762155033738029313noreply@blogger.com0tag:blogger.com,1999:blog-35481450.post-33559411009473012622009-07-14T22:53:00.000+03:002009-07-14T22:54:01.682+03:00Windows Azure için ücretler belirlendi<p>Windows Azure için hizmet bedelleri belirlendi. 1 GB lık seçenek için,</p> <p>Fiyatlara göz atacak olursak : </p> <ul> <li>Hesaplama = $0.12 / hour (Yani worker veya web role instance larının her biri için çalıştığı saat başına ücret.) </li> <li>Depolama = $0.15 / GB stored (Azure Table Services üzerinde tabi, Relational değil bu seçenek) </li> <li>Depolama Sorgulamaları = $0.01 / 10.000 adet sorgu için. (sorgu yapmamak gerek yani güzel bir caching mekanizması çalıştırmak gerek)</li> <li> Bant genişliği = $0.10 içeri / $0.15 dışarı / GB </li> </ul> <p>SQL Azure için ise : </p> <ul> <li>Web Edition – 1 GB'a kadar ilişkisel veritabanı = $9.99 / Aylık </li> <li>Business Edition – 10 GB'a kadar ilişkisel veritabanı = $99.99 / Aylık Bant Genişliği yukardaki ücretler ile aynı.</li> </ul> <p>Detaylı bilgiyi : <a href="http://www.microsoft.com/azure/pricing.mspx">http://www.microsoft.com/azure/pricing.mspx</a> adresinden yararlanabilirsiniz.</p> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35481450-3355941100947301262?l=turhal.blogspot.com'/></div>turhaltemizerhttp://www.blogger.com/profile/14762155033738029313noreply@blogger.com0tag:blogger.com,1999:blog-35481450.post-30947500936006278112009-07-12T22:21:00.000+03:002009-07-12T22:22:08.640+03:00Asp.Net MVC Framework - Master Pages Kullanımı - II<div align="justify"><span class="style1">Asp.Net MVC Framework ile bugüne kadar bir çok konuya değinme şansı bulduk ve temel kavramlarını rahatlıkla yapabilir duruma geldik. Görsel olarak uygulamalarımızı daha da kuvvetli duruma getirebilmek için bir önceki MVC Framework yazımızda Master Page 'i nasıl kullanabileceğimize değinmiştik. Peki bu noktada aklımıza bir kaç soru takılıyor. Eğer tasarımsal öğelerini rahatlıkla düzenleyebiliyorsak hazır şablonlar da olmalı ve onlar yardımı ile de düzenleyebiliriz şeklinde sorular gelmektedir. Bunun cevabı ise oldukça basittir. MVC ile geliştirilen uygulamalarda kullanılmak üzere oluşturulan tasarım galerisi sayfası mevcuttur. Buradan erişebilmemiz mümkün olacaktır. <br /> <br />Yazımızın girişinde de anlayacağınız gibi farklı tasarım şablonlarını uygulamalarımızda nasıl kullanabileceğimizi inceleye çalışacağız. Ama ilk olarak bu değişiklikleri uygulayabilmemiz için bir projeye ihtiyacımız vardır. Daha önceki yazılarımızdan yararlanarak hızlıca bir tane oluşturuyoruz. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak56_1.gif" width="496" height="376" /> <br /> <br />İlk olarak yapmamız gereken yukarıda görmüş olduğumuz standart MVC Framework tasarımını düzenleyecek görsel şablonu seçmemiz gerekiyor. Bu işlemi gerçekleştirmek için MVC Framework galeri sitesine girmemiz gerekecektir. Sitemize <a href="http://www.asp.net/mvc/gallery/">http://www.asp.net/mvc/gallery/</a> adresinden ulaşabilmemiz mümkündür. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak56_2.gif" width="527" height="152" /> <br /> <br />Yukarıda görmüş olduğunuz tasarımların dışında daha onlarca tasarım yer almaktadır. Bu tasarımlardan herhangi birini seçerek web sitemize uygulamayabilmemiz mümkündür. Beğendiğimiz herhangi bir tasarımı beğeniyoruz ve aşağıdaki işlemleri uygulamaya başlıyoruz. <br /> <br /><strong>1.</strong> Beğenmiş olduğumuz tasarımı bilgisayara indirebilmek için tasarımın hemen altında yer alan <strong>Download</strong> seçeneğine tıklıyoruz. <br /><strong>2. </strong>İndirmiş olduğunuz sıkıştırılmış dosyanın üzerinde sağ tıklama sonrası özelliklerine giriyoruz ve Unblock seçeneğine tıklıyoruz. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak56_3.gif" width="264" height="359" /> <br /> <br /><strong>3.</strong> Tasarımı sıkıştırılmış dosyanın içerisinden çıkartıyoruz. <br /><strong>4.</strong> Çıkartmış olduğunuz dosyalar CS ve VB için oluşturulmuştur. Hangi programlama dili ile projenizi geliştiriyorsanız onun içeriğini kopyalıyorsunuz. <br /><strong>5.</strong></span><font size="2" face="Verdana, Arial, Helvetica, sans-serif"> Geliştirmekte olduğunuz MVC Framework web projesinin bilgisayarınızda olduğu klasöre gidiyorsunuz ve kopyalamış olduğunuz dosyaları yapıştırıyorsunuz ve benzer dosyaları değiştireyim mi diye soran ekranda evet seçeneğini seçiyoruz. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak56_4.gif" width="492" height="156" /> <br /> <br /><strong>6.</strong> Artık projenizin tasarımı indirmiş olduğunuz tasarıma göre güncellenmiştir. Yapmanız gereken son işlem <em>[YourProjectName]</em> yazan yerleri kendi projenizin ismi ile değiştirmek olacaktır. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak56_5.gif" width="354" height="302" /> <br /> <br />Yapılan işlemler sonucunda projenin almış olduğu görünüme bir göz atalım. Bakalım seçmiş olduğumuz tasarım hazırlanmış olan projenin üzerinde nasıl gözüktü. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak56_6.gif" width="504" height="313" /> <br /> <br />Artık oldukça şık tasarıma sahip bir web sitesine sahibiz. <br /> <br />Şimdi eklemiş olduğumuz tasarımı bizlerde biraz daha düzenleyerek çok daha görsel bir görünüme getirelim. Örneğin <em>düzenle, detaylar </em>ve <em>yeni oluştur </em>yazılarını ikon olarak değiştirip çok daha anlaşılır bir görünüme kavuşturalım. bu işlemi gerçekleştirmek için yapmamız gereken ister bir tasarımcı tarafında oluşturulmuş olan ister internet üzerinden bulunmuş resimleri yazıların yerine kullanmak olacaktır. <br /> <br />Ekran üzerinde controller üzerinden gelen bilgilere göre işlemlere yönlendirirken <strong>Html.ActionLink() </strong>'i kullanıyorduk. Fakat bu yöntem içerisine resim ekleyebilmemiz mümkün değildir. Aldığı parametreler <strong>Html.ActionLink(&quot;string&quot;,&quot;ActionStrign&quot;,RouteValue&quot;)</strong> şeklindedir. Projelerde kullanım şeklide aşağıdaki gibi olmaktadır. <br /> <br /> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">&lt;%= Html.ActionLink(&quot;Düzenle&quot;, &quot;Edit&quot;, new { id=item.Id }) %&gt; <br />| <br />&lt;%= Html.ActionLink(&quot;Detaylar&quot;, &quot;Details&quot;, new { id=item.Id })%&gt;</font></td> </tr> </tbody></table> <br />Fakat bizim bu noktada yapmak istediğimiz proje eklenmiş ikonları detaylar ve düzenle bölümünde gösterirken linkleri de bu resimler üzerinde aktif olarak kullanılmasını isteyeceğiz. Tabii tekrar hatırlamak gerekirse bu işlemi <em>Html.ActionLink()</em> yardımı ile yapamıyoruz. Bunun için <strong>Url.Action()</strong> 'ı kullanırsak yapmak istediğimizi gerçekleştirebilir duruma geleceğiz. Çünkü bu parametre olarak <strong>Url.Action(&quot;ActionName&quot;,&quot;RouteValue&quot;)</strong> almaktadır. Bu durumda bizde <strong>&lt;a href=&quot;&quot;&gt;&lt;/a&gt; </strong>taglarının arasında <em>Url.Action()</em> 'ı kullanırsak istemiş olduğumuz yönteme gelmiş olacağız. Ne gibi derseniz, web sayfalarında link vermek istediğimizde bizden linkin görünebilmesi için bir metin istemektedir. Bizler metin yerine resmi gösterirsek istediğimiz sonuca ulaşmış olacağız. Bu durumda yapmak istediklerimiz kod olarak görmek istersek aşağıdaki gibi bir görünüme sahip olacağız. <br /> <br /> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">&lt;td class=&quot;actions edit&quot;&gt; <br /><strong>&#160;&#160; &lt;a href='&lt;%= <em>Url.Action(&quot;Edit&quot;, new {id=item.Id})</em> %&gt;'&gt; <br />&#160;&#160;&#160;&#160;&#160; &lt;</strong><strong>img </strong><strong>src=&quot;../../Pictures/component_edit.gif&quot; alt=&quot;Edit&quot; width=&quot;20&quot; height=&quot;20&quot;/&gt;&lt;/a&gt;</strong> <br />&lt;/td&gt; <br />&lt;td class=&quot;actions details&quot;&gt; <br />&#160;&#160; <strong>&lt;a href='&lt;%= <em>Url.Action(&quot;Details&quot;, new {id=item.Id})</em> %&gt;'&gt; <br />&#160;&#160;&#160;&#160;&#160; &lt;</strong><strong>img </strong><strong>src=&quot;../../Pictures/components.gif&quot; alt=&quot;Detaylar&quot; width=&quot;20&quot; height=&quot;20&quot;/&gt;&lt;/a&gt; <br /></strong>&lt;/td&gt;</font></td> </tr> </tbody></table> <br />Düşündüğümüz gibi controller dan gelen action ları link içerisinde tanımladık ve metin gireceğimiz bölümlere projenin içerisinde yer alan resim değerlerini vererek üzerine tıklandığında istenilen değerin detaylarına gitmesine olanak tanıdık. Peki yeni bir kayıt oluşturmak istediğimiz durumda ne gibi bir işlem yapmamız gerekmektedir. Ne gibi bir fark var diyebilirsiniz. Çok ufak bir fark bulunmaktadır. Bu da RouteValue parametresinin bulunmamasıdır. Fakat bizlere biliyoruz ki hem <em>Html.ActionLink() </em>'te hem de <em>Url.Action() </em>RouteValue parametresi boş bırakılabilmektedir. Bu sebepten ötürüdür ki yeni bir kayıt oluşturma esnasında yukarıda vermiş olduğumuz kod parçasını olduğu gibi kullanmakla beraber yalnızca <em><strong>new{id=item.Id}</strong></em> parametresinin olduğu değeri silmemiz yeterli olacaktır. Yapmış olduğumuz işlemler sonrasında projemizin nasıl bir görünüme sahip olduğuna göz atmak gerekirse, <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak56_7.gif" width="504" height="361" /> <br /> <br />Oldukça hoş bir uygulamaya sahip olduk. Hem görsel açıdan hem de performans açısından başarılı bir uygulamamız oldu. Fakat değinmek istediğim bir nokta var. Eklemiş olduğumuz resimlerin boyutları oranında sayfanın açılmasında çok ufakta olsa bir yavaşlama gözlemlenmektedir. Bu açıdan resim eklerken boyutlarına mümkün oldukça dikkat ediniz. <br /> <br />Geldik bir MVC Framework yazımızın daha sonuna. Nelere değindiğimize kısaca göz atmak gerekirse, MVC Framework ile hazırlanan uygulamaların varsayılan tasarımının dışına çıkmak için Master Pages üzerinde yapabileceğimiz değişiklikleri bir önceki yazımızda inceledikten sonra bu yazımızda da MVC uygulamaları kullanılabilecek tasarımların yer aldığı galeriden yararlanarak seçmiş olduğumuz tasarımı kendi uygulamamız üzerinde nasıl kullanabileceğimize ve üzerinde düzenleme yapmak istediğimiz hangi adımları ve değişiklikleri yapmamız gerektiğini incelemeye çalıştık. Bir sonraki yazımızda görüşünceye dek, esenlikle kalın... <br /> <br />Umarım yararlı olabilmiştir. <br /> <br /><strong>Turhal Temizer</strong> <br /><a href="mailto:info@turhaltemizer.com">info@turhaltemizer.com</a> <br /></font></div> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35481450-3094750093600627811?l=turhal.blogspot.com'/></div>turhaltemizerhttp://www.blogger.com/profile/14762155033738029313noreply@blogger.com0tag:blogger.com,1999:blog-35481450.post-15355775492857514812009-07-11T19:24:00.000+03:002009-07-11T19:25:02.404+03:00WPF - Visual Studio 2010 Başlangıç Sayfasının Düzenlenmesi<div align="justify"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">.Net ile yazılım geliştiricilerin en sık kullandığı geliştirme platformu Visual Studio 'dur. Sizlerinde bildiği üzere yıl başından bu yana geliştirme platformunun yeni sürümü olacak olan Visual Studio 2010 'nun CTP ve Beta1 sürümleri bizlerin kullanımına sunulmuştur. Bu sürümleri bilgisayarlara kurduğumuzda dikkatimizi çeken en büyük değişiklik görsel anlamda olmuştur. Bu değişikliği sağlayan en büyük faktör ise platformun tekrardan Windows Presentation Foundation (<strong>WPF</strong>) ile yazılmasıdır. <br /> <br />Daha önceki yazılarımızdan hatırlayacağınız üzere Windows Vista ve Windows 7 işletim sistemleri WPF mimarisine göre geliştirilmişti. Bu değişiklik sonucunda grafik kartı üreticileri Windows Vista uyumlu ekran kartı çıkarttılar. Peki neden Vista uyumlu ekran kartlarına gerek vardı. Çünkü Windows Vista öncesi işletim sistemleri yani Windows Form uygulamaları o kadar fazla grafik kartları kullanmasına gerek yoktu. Fakat Windows Vista ve WPF uygulamalarının yaygınlaşması ile grafik kartlarının üzerine düşen yük arttı ve bu yenilikleri sağlayacak kartlara gerekli sürücüler oluşturuldu. Bu konu ile ilgili detaylı içeriğe daha önce yayınlamış olduğumuz yazıları okuyarak edinebilirsiniz. <br /> <br />İnsanların görselliğe önem vermesi ve yeni geliştirilen uygulamaların WPF ve XAML 'in gücünden yararlanılarak geliştirilmesine daha da olanak tanıyordu. Ayrıca bu teknolojilerin web versiyonu olan Silverlight uygulamalarının da web üzerinde yaygınlaşması gelecekte ne denli önemli bir yer alacağını da gözler önüne seriyordu. Bu durumda yapılması gereken ise yeni geliştirecek olduğumuz projelerde görsel anlamda bir düşüncemiz var ise WPF alt yapısı üzerine geliştirilen uygulamalara dikkat etmek olacaktır. <br /> <br />WPF günümüzde yer alan uygulamalarda bu kadar gelişiyor ve dikkat çekiyorsa geliştiricilerinde kullandığı araçlarda geliştirmeler bu teknoloji ile yapılması düşünülebilir bir duruma gelmiştir ki Expression Studio ailesi içerisinde yer alan ürünler bahsettiklerimizi karşılar biçimdeydi. Çok daha görsel ve daha performanslı bir biçimde çalışan geliştirme ortamları ile çalışabilinmesine olanak tanınmaktadır. Expression Blend ile aramıza katılan OSLO projesinin geliştirme ekranında aşina olmaya başladığımız yeni nesil pencereler Visual Studio 2010 ile geliştirme ortamlarında da aramızdaki yerini alacaktır. <br /> <br />Visual Studio 2010 'a .Net 4.0 'ın eklenmesinin dışında geliştirme platformu da yeniden hazırlanmıştır. Peki, hazırlanan teknolojiyi sizlere sorsam sanırım yukarıdaki yazdıklarımızı okuduktan sonra hiç düşünmeden &quot;<em>WPF</em>&quot; diye soruyu cevaplayacaksınızdır. Neden WPF kullanıldı sorusuna kısmen cevap verdik. Fakat bunun sebeplerini biraz daha araştıralım. WPF uygulamalarının en önemli özelliği görsel öğeleri çok iyi şekilde kullanmaktadır. Grafikerlerin hazırlamış olduğu tasarımları XAML yardımı ile projelerde rahatlık kullanılıyor olması, Data Binding işlemini oldukça başarılı yapılabilmesi ve bunun gibi şu anda aklımıza gelmeyen bir çok sebepten ötürü WPF tercih edilmiştir. <br /> <br />Visual Studio 2010 'un neden WPF ile yazıldığını ve bize ne gibi yararlar sağlayacağına değinmeye çalıştık. Peki, Visual Studio 2010 Beta1 'in WPF ile hazırlanmış olan yeni giriş ekranın görüntüsü nasıl olduğuna bir göz atalım. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak55_1.gif" width="670" height="419" /> <br /> <br />Alışık olduğumuz görünümden oldukça farklı fakat bir o kadar şık bir görünüme sahip olmuştur. Tabii yazımızın başında beri de değindiğimiz bir özelliğe sahip olmuştur. Bu da WPF ile hazırlanmış olmasıdır. Bizler de WPF yardımı ile bu ana ekran görüntüsünü düzenleyebilme imkanına sahibiz. Bu işlem için ister Visual Studio 2008 veya 2010 ortamlarından ya da Expression Studio ailesinden Expression Blend yardımı ile yapabilmemiz mümkündür. İşlemi gerçekleştirebilmemiz için bir <strong>Visual Studio 2010</strong> üzerinde bir kaç değişiklik yapmamız gerekmektedir. <br /> <br /><strong>Not: </strong>İşlemlere başlamadan önce <strong>C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\StartPages</strong> klasörünün içeriğini bilgisayarda başka bir noktaya kopyalamanızı öneriyorum. Malum yeni hazırlayacağınız tasarım sonrası ana sayfanız açılmaz bir görünüme de bürünebilir. :) <br /> <br />Visual Studio 2010 ortamını açıyoruz ve ilk olarak <strong>Tools\Options</strong> adımlarını izleyerek Visual Studio özellikleri ekranına geliyoruz. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak55_2.gif" width="260" height="262" /> <br /> <br />Karşımıza gelen ekranda <strong>Environment\Startup </strong>yolunu izledikten sonra açılan ekranda <strong>Allow Custom Start Page</strong> checkbox 'ını seçili duruma getiriyoruz. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak55_3.gif" width="530" height="307" /> <br /> <br />Yapmış olduğumuz bu işlemler sonrasında artık Visual Studio 2010 'nun karşılama ekranını istediğimiz şekilde düzenleyebilinmesine olanak tanınacaktır. Peki bu işlemi nasıl gerçekleştireceğiz. Biraz önce yedeklediğimiz klasörün içerisinde yer alan proje dosyasını açarsak gördükleriniz sizi çok şaşırtacaktır. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak55_4.gif" width="431" height="168" /> <br />StartPage.csproj dosyasını ister Visual Studio 2008 ister Visual Studio 2010 ile açıyoruz. VS2010 'nun ana sayfası design kodları ile karşınızdadır. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak55_5.gif" width="587" height="367" /> <br /> <br />Doğruyu söylemek gerekirse bu kodları görmek pek alışık olduğumuz bir durum değildir. :) <br /> <br /><strong>StartPage.xaml <br /></strong> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">&lt;Grid xmlns=&quot;<a href="http://schemas.microsoft.com/winfx/2006/xaml/presentation">http://schemas.microsoft.com/winfx/2006/xaml/presentation</a>&quot; <br />&#160;&#160;&#160;&#160; xmlns:x=&quot;<a href="http://schemas.microsoft.com/winfx/2006/xaml">http://schemas.microsoft.com/winfx/2006/xaml</a>&quot; <br />&#160;&#160;&#160;&#160; xmlns:vs=&quot;clr-namespace:Microsoft.VisualStudio.PlatformUI;assembly=Microsoft.VisualStudio.Shell.UI&quot; <br />&#160;&#160;&#160;&#160; xmlns:sys=&quot;clr-namespace:System;assembly=mscorlib&quot; <br />&#160;&#160;&#160;&#160; Style=&quot;{DynamicResource {x:Static vs:StartPageResourceKeys.OuterGridStyleKey}}&quot; <br />&#160;&#160;&#160; &gt; <br /> <br />&#160;&#160;&#160; &lt;Grid.Resources&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;!-- Welcome tab links --&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;sys:String x:Key=&quot;Links.WhatsNew&quot;&gt;http://go.microsoft.com/fwlink/?LinkId=123638&lt;/sys:String&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;sys:String x:Key=&quot;Links.Walkthroughs&quot;&gt;http://go.microsoft.com/fwlink/?LinkId=147108&lt;/sys:String&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;sys:String x:Key=&quot;Links.Feedback&quot;&gt;http://go.microsoft.com/fwlink/?LinkId=147445&lt;/sys:String&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;sys:String x:Key=&quot;Links.Customize&quot;&gt;http://go.microsoft.com/fwlink/?LinkId=123641&lt;/sys:String&gt; <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;!-- Visual Studio tab links --&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;sys:String x:Key=&quot;Links.MSDNLibrary&quot;&gt;http://go.microsoft.com/fwlink/?LinkId=123642&lt;/sys:String&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;sys:String x:Key=&quot;Links.MSDNForums&quot;&gt;http://go.microsoft.com/fwlink/?LinkId=123643&lt;/sys:String&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;sys:String x:Key=&quot;Links.Community&quot;&gt;http://go.microsoft.com/fwlink/?LinkId=123644&lt;/sys:String&gt; <br />&#160;&#160;&#160; &lt;/Grid.Resources&gt; <br /> <br />&#160;&#160;&#160; &lt;Grid.ColumnDefinitions&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;ColumnDefinition Width=&quot;*&quot; MinWidth=&quot;0&quot; MaxWidth=&quot;90&quot;/&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;ColumnDefinition Width=&quot;*&quot; MinWidth=&quot;530&quot;/&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;ColumnDefinition Width=&quot;*&quot; MinWidth=&quot;0&quot; MaxWidth=&quot;100&quot;/&gt; <br />&#160;&#160;&#160; &lt;/Grid.ColumnDefinitions&gt; <br />&#160;&#160;&#160; &lt;Grid.RowDefinitions&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;RowDefinition Height=&quot;*&quot; MaxHeight=&quot;100&quot;/&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;RowDefinition Height=&quot;*&quot; /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;RowDefinition Height=&quot;*&quot; MaxHeight=&quot;65&quot;/&gt; <br />&#160;&#160;&#160; &lt;/Grid.RowDefinitions&gt; <br /> <br />&#160;&#160;&#160; &lt;Border Grid.RowSpan=&quot;3&quot; Grid.ColumnSpan=&quot;3&quot; Height=&quot;800&quot; VerticalAlignment=&quot;Top&quot; Style=&quot;{DynamicResource {x:Static&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; vs:StartPageResourceKeys.OuterBorderStyleKey}}&quot; /&gt; <br /> <br />&#160;&#160;&#160; &lt;!-- Logo --&gt; <br />&#160;&#160;&#160; &lt;Image Grid.Row=&quot;0&quot; Grid.Column=&quot;1&quot; Style=&quot;{DynamicResource {x:Static vs:StartPageResourceKeys.LogoImageStyleKey}}&quot; /&gt; <br /> <br />&#160;&#160;&#160; &lt;!-- RSS feed --&gt; <br />&#160;&#160;&#160; &lt;vs:RssRotator Grid.Row=&quot;2&quot; Grid.Column=&quot;1&quot; Style=&quot;{DynamicResource {x:Static vs:StartPageResourceKeys.RssRotatorStyleKey}}&quot; /&gt; <br /> <br /> <br />&#160;&#160;&#160; &lt;!-- Tray --&gt; <br />&#160;&#160;&#160; &lt;vs:Tray Grid.Row=&quot;1&quot; Grid.Column=&quot;1&quot; SelectedIndex=&quot;0&quot; x:Name=&quot;PART_Tray&quot;&gt; <br /> <br />&#160;&#160;&#160; &lt;!-- Welcome group --&gt; <br />&#160;&#160;&#160; &lt;vs:TrayItem Header=&quot;Welcome&quot; x:Uid=&quot;Welcome_Header&quot;&gt; <br />&#160;&#160;&#160; &lt;vs:TrayGroup SelectedIndex=&quot;0&quot;&gt; <br /> <br />&#160;&#160;&#160; &lt;vs:TrayGroupItem Content=&quot;Welcome&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ImageSource=&quot;pack://application:,,,/Microsoft.VisualStudio.Shell.UI;component/Images/StartPage/01_whatsnew.png&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; x:Uid=&quot;Welcome_Item&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;vs:TrayGroupItem.InnerContent&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;StackPanel&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;TextBlock FontSize=&quot;18pt&quot; Foreground=&quot;#E8E8E8&quot; Margin=&quot;15&quot; x:Uid=&quot;Welcome_Text&quot;&gt;Welcome to the Visual Studio 2010 Beta 1&lt;/TextBlock&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;TextBlock Foreground=&quot;#E8E8E8&quot; Margin=&quot;15&quot; TextWrapping=&quot;Wrap&quot; x:Uid=&quot;Welcome_Paragraph&quot; &gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; This release contains many features new to Visual Studio. <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; We have created a set of walkthroughs for major new feature areas. <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; We would also appreciate hearing your feedback. <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Thank you for taking the time to evaluate and provide your input; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; it will help us make Visual Studio 2010 the best release ever. <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/TextBlock&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;Button Content=&quot;More Information&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; HorizontalAlignment=&quot;Left&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Margin=&quot;15&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Style=&quot;{DynamicResource {x:Static vs:StartPageResourceKeys.WelcomeButtonStyleKey}}&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Command=&quot;{x:Static vs:VSCommands.Browse}&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; CommandParameter=&quot;{StaticResource Links.WhatsNew}&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; x:Uid=&quot;Welcome_Button&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/StackPanel&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/vs:TrayGroupItem.InnerContent&gt; <br />&#160;&#160;&#160; &lt;/vs:TrayGroupItem&gt; <br /> <br />&#160;&#160;&#160; &lt;vs:TrayGroupItem Content=&quot;Walkthroughs&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; ImageSource=&quot;pack://application:,,,/Microsoft.VisualStudio.Shell.UI;component/Images/StartPage/02_ctpwalkthroughs.png&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; Command=&quot;{x:Static vs:VSCommands.Browse}&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; CommandParameter=&quot;{StaticResource Links.Walkthroughs}&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; x:Uid=&quot;Walkthroughs_Item&quot; <br />&#160;&#160;&#160; /&gt; <br /> <br />&#160;&#160;&#160; &lt;vs:TrayGroupItem Content=&quot;Feedback&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; ImageSource=&quot;pack://application:,,,/Microsoft.VisualStudio.Shell.UI;component/Images/StartPage/03_feedback.png&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; Command=&quot;{x:Static vs:VSCommands.Browse}&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; CommandParameter=&quot;{StaticResource Links.Feedback}&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; x:Uid=&quot;Feedback_Item&quot; <br />&#160;&#160;&#160; /&gt; <br /> <br />&#160;&#160;&#160; &lt;vs:TrayGroupItem Content=&quot;Customize the Start Page&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; ImageSource=&quot;pack://application:,,,/Microsoft.VisualStudio.Shell.UI;component/Images/StartPage/04_customizestartpage.png&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; Command=&quot;{x:Static vs:VSCommands.Browse}&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; CommandParameter=&quot;{StaticResource Links.Customize}&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; x:Uid=&quot;Customize_Item&quot; <br />&#160;&#160;&#160; /&gt; <br /> <br />&#160;&#160;&#160; &lt;vs:TrayGroupItem Content=&quot;Find and Install Extensions&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; ImageSource=&quot;pack://application:,,,/Microsoft.VisualStudio.Shell.UI;component/Images/StartPage/11_extensibility.png&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; x:Uid=&quot;Extensibility_Item&quot;&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;vs:TrayGroupItem.InnerContent&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;StackPanel&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;TextBlock FontSize=&quot;18pt&quot; Foreground=&quot;#E8E8E8&quot; Margin=&quot;15&quot; x:Uid=&quot;ExtensionManager_Text&quot;&gt;Extension Manager&lt;/TextBlock&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;TextBlock Foreground=&quot;#E8E8E8&quot; Margin=&quot;15&quot; TextWrapping=&quot;Wrap&quot; x:Uid=&quot;ExtensionManager_Paragraph&quot;&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; The Extension Manager allows you to find new extensions online and manage your currently installed extensions. <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/TextBlock&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;Button Content=&quot;Show Extension Manager&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; HorizontalAlignment=&quot;Left&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Margin=&quot;15&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Style=&quot;{DynamicResource {x:Static vs:StartPageResourceKeys.WelcomeButtonStyleKey}}&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Command=&quot;{x:Static vs:VSCommands.ExecuteCommand}&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; CommandParameter=&quot;Tools.ExtensionManager&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; x:Uid=&quot;ExtensionManager_Button&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/StackPanel&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/vs:TrayGroupItem.InnerContent&gt; <br />&#160;&#160;&#160; &lt;/vs:TrayGroupItem&gt; <br /> <br />&#160;&#160;&#160; &lt;/vs:TrayGroup&gt; <br />&#160;&#160;&#160; &lt;/vs:TrayItem&gt; <br /> <br />&#160;&#160;&#160; &lt;!-- Projects group --&gt; <br />&#160;&#160;&#160; &lt;vs:TrayItem Header=&quot;Projects&quot; x:Uid=&quot;Projects_Header&quot;&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;vs:TrayGroup SelectedIndex=&quot;0&quot;&gt; <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;vs:TrayGroupItem Content=&quot;Recent Projects&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ImageSource=&quot;pack://application:,,,/Microsoft.VisualStudio.Shell.UI;component/Images/StartPage/05_recentprojects.png&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; InnerContentUri=&quot;Microsoft.VisualStudio.Shell.UI.Internal;component/Packages/MRU/Controls/RecentProjects.xaml&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; x:Uid=&quot;RecentProjects_Item&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; /&gt; <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;vs:TrayGroupItem Content=&quot;New Project&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ImageSource=&quot;pack://application:,,,/Microsoft.VisualStudio.Shell.UI;component/Images/StartPage/07_newproject.png&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Command=&quot;{x:Static vs:VSCommands.ExecuteCommand}&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; CommandParameter=&quot;File.NewProject&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; x:Uid=&quot;NewProject_Item&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; /&gt; <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;vs:TrayGroupItem Content=&quot;Open Solution&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ImageSource=&quot;pack://application:,,,/Microsoft.VisualStudio.Shell.UI;component/Images/StartPage/06_openproject.png&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Command=&quot;{x:Static vs:VSCommands.ExecuteCommand}&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; CommandParameter=&quot;File.OpenProject&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; x:Uid=&quot;OpenProject_Item&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; /&gt; <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/vs:TrayGroup&gt; <br />&#160;&#160;&#160; &lt;/vs:TrayItem&gt; <br /> <br />&#160;&#160;&#160; &lt;!-- Visual Studio group --&gt; <br />&#160;&#160;&#160; &lt;vs:TrayItem Header=&quot;Visual Studio&quot; x:Uid=&quot;VisualStudio_Header&quot;&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;vs:TrayGroup&gt; <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;vs:TrayGroupItem Content=&quot;MSDN Library&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ImageSource=&quot;pack://application:,,,/Microsoft.VisualStudio.Shell.UI;component/Images/StartPage/08_msdnlibrary.png&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Command=&quot;{x:Static vs:VSCommands.Browse}&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; CommandParameter=&quot;{StaticResource Links.MSDNLibrary}&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; x:Uid=&quot;MSDNLibrary_Item&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; /&gt; <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;vs:TrayGroupItem Content=&quot;MSDN Forums&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ImageSource=&quot;pack://application:,,,/Microsoft.VisualStudio.Shell.UI;component/Images/StartPage/09_msdnforums.png&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Command=&quot;{x:Static vs:VSCommands.Browse}&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; CommandParameter=&quot;{StaticResource Links.MSDNForums}&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; x:Uid=&quot;MSDNForums_Item&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; /&gt; <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;vs:TrayGroupItem Content=&quot;Community&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ImageSource=&quot;pack://application:,,,/Microsoft.VisualStudio.Shell.UI;component/Images/StartPage/10_community.png&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Command=&quot;{x:Static vs:VSCommands.Browse}&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; CommandParameter=&quot;{StaticResource Links.Community}&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; x:Uid=&quot;Community_Item&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; /&gt; <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;vs:TrayGroupItem Content=&quot;Settings&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ImageSource=&quot;pack://application:,,,/Microsoft.VisualStudio.Shell.UI;component/Images/StartPage/12_settings.png&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Command=&quot;{x:Static vs:VSCommands.ExecuteCommand}&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; CommandParameter=&quot;Tools.Options&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; x:Uid=&quot;Settings_Item&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; /&gt; <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/vs:TrayGroup&gt; <br />&#160;&#160;&#160;&#160; &lt;/vs:TrayItem&gt; <br /> <br />&#160;&#160;&#160; &lt;/vs:Tray&gt; <br />&lt;/Grid&gt;</font></td> </tr> </tbody></table> <br />XAML kodu yukarıdaki gibidir. Bu kodları incelediğimizde dikkatimizi çeken kodların; <br />&#160;&#160; •&lt;vs:Tray&gt; <br />&#160;&#160; •&lt;vs:TrayGroup&gt; <br />&#160;&#160; •&lt;vs:TrayGroupItem&gt; <br />&#160;&#160; •&lt;vs:RssRotator&gt; <br />arasında yeralmasıdır. <br /> <br />Görsel olarak değişiklikler için WPF bilgimizden yararlanılarak ekran birkaç değişiklik yapıyoruz. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak55_6.gif" width="640" height="385" /> <br /> <br />Gördüğünüz gibi Visual Studio 2010 'nun giriş ekranını istediğimiz biçimde düzenleyebiliyoruz. Sizlerin hayal gücünüze bağlı olarak istediğiniz şekilde başlangıç ekranı düzenleyebilmeniz mümkündür. Örneğin VS 'in başlangıç ekranında şirket logonuzu görebilmek çok güzel bir duygu olsa gerek. :) <br /> <br />Windows Presentation Foundation yazılım dünyasında yerini gittikçe sağlamlaştırdığını bu uygulama ile daha net bir biçimde görmekteyiz. <br /> <br />Umarım yararlı olabilmiştir. <br /> <br /><strong>Turhal Temizer</strong> <br /><a href="mailto:info@turhaltemizer.com">info@turhaltemizer.com</a> <br /></font></div> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35481450-1535577549285751481?l=turhal.blogspot.com'/></div>turhaltemizerhttp://www.blogger.com/profile/14762155033738029313noreply@blogger.com0tag:blogger.com,1999:blog-35481450.post-28363975920021525032009-07-11T17:00:00.002+03:002009-07-12T21:27:56.815+03:00Silverlight 3.0 Final& Expression Studio 3.0 RC sürüm yayınlandı.<p><span style="font-family:Verdana;">Web uygulamalarında RIA uygulamalarına en kapsamlı şekilde kullanılmasına olanak tanıyan Microsoft Silverlight teknolojisinin 3.0 sürümü artık tam sürümü ile hazırdır.</span></p> <p><span style="font-family:Verdana;">HD Medya uygulamaları, tarayıcı dışında çalışabilen uygulamalar hazırlayabilmemize artık olanak tanınabilecektir. Ayrıca Expression Studio ailesi Rc sürümüne Silverlight 3.0 sürümü ise final sürüm durumuna getirilmiştir.</span></p> <p><a href="http://www.silverlight.net/getStarted"><span style="font-family:Verdana;">www.silverlight.net/getStarted</span></a></p><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35481450-2836397592002152503?l=turhal.blogspot.com'/></div>turhaltemizerhttp://www.blogger.com/profile/14762155033738029313noreply@blogger.com0tag:blogger.com,1999:blog-35481450.post-75018661251713684882009-07-08T23:04:00.000+03:002009-07-08T23:05:53.310+03:00Asp.Net MVC Framework - Master Pages Kavramı - I<div align="justify"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Microsoft 'un web projelerini hazırlarken bizlere mimari tasarıları daha basit ve kullanışlı bir biçimde kullanmamızı sağlayan Asp.Net MVC Framework 'ü daha önceki yazılarımızda detaylı bir biçimde tanımaya çalıştık. Peki neler yapabiliyorduk. Son kullanıcıdan gelen istekler doğrultusunda başka bir sayfaya nasıl yönlendirebileceğimizi, Controller katmanı ile veri tabanı işlemlerini nasıl işleyip görsel sayfaya ileteceğimizi, model katmanı yardımı ile veri tabanı ile haberleşmelerin çok daha basit bir şekilde yapılabileceğini, veri tabanını aktif olarak kullandığımızda nasıl bir uygulama geliştirdiğimizi ve view sayfaları nasıl kolayca oluşturabileceğimizi detaylı olarak daha önceki yazılarımızda inceledik ve neler yapabileceğimizi gördük. Ayrıca uygulamalarımızda MVC tasarımını kullandığımızda daha önceden oldukça fazla uğraştığımız işlemleri ne kadar kolaylıkla yapabildiğimizi defalarca yapmış olduğumuz pratiklerde doğrulamış olduk. Bu yazımızda ise Asp.Net sayfalarında tasarım standardı açısından sıkça kullandığımız <strong>Master Pages</strong> kavramını MVC Framework 'te kullanım yapısını detaylı olarak inceliyor olacağız. <br /> <br />Asp.Net uygulamaların Master Page kullanmamızın sebebini kısaca hatırlayacak olursak. Benzer tarzda tasarım şablonu kullanacak olduğumuz sayfalarda tekrardan o tasarımsal öğeleri serverdan çağırıp sayfa üzerinde yüklenmemesini beklememek için oluşturulmuş başarılı bir yapıdır. Özellikle tasarım yapısı üzerinde herhangi bir değişiklik yok ise ve sadece içerikler değişecekse çok önemli bir tercih durumundadır. Aynı Asp.Net uygulamalarında olduğu gibi MVC uygulamalarında da Master Page kavramı önemli bir yer tutmaktadır. Varsayılan olan mavi bir tasarımı olan Master Page kullanılmaktadır. Peki biz bu tasarımı değil de kendi tasarımımızı Master Page 'e taşımak istersek neler yapmamız gerekir. Gelin hep birlikte bunu incelemeye çalışalım. <br /> <br />Her zaman olduğu gibi ilk olarak yapmamız gereken Visual Studio 2008 SP1 geliştirme ortamında bir Asp.Net MVC Framework Web uygulaması oluşturuyoruz. Proje dosyasının içerisinden ilk olarak varsayılan olarak oluşturulan Master Page 'in yerini bulalım. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak54_1.gif" width="217" height="156" /> <br /> <br />MVC tasarımını dikkate alarak araştırmalarımızı yaptığımızda görsel öğelerin view katmanında olduğunu görürüz. Master Page her yerde kullanılacak bir içerik olduğu içinde view içerisinde Shared klasörünün içerisinde yer alır. <br /> <br />Biz uygulamamızda bu otomatik olarak oluşturulan Master Page 'i kullanmak yerine kendimize bir tane oluşturalım. Ama ilk olarak oluşturulmuş olan Site.Master 'ı siliyoruz. Sonrasında da Add- NewItem yolunu izleyerek web sitesine yeni bir Master Page ekliyoruz. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak54_2.gif" width="441" height="282" /> <br /> <br />Master Page 'i sorunsuzca projeye ekledikten sonra nasıl bir içerik oluşturulacağının düşünülmesinin zamanı gelmiştir. Basit olması açısında içeriğe göre değiştirilebilir iki sütun ekleyelim. Bu değişen içerik eklemeyi Asp.Net 'ten de alışık olduğu gibi <strong>&lt;asp:ContentPlaceHolder&gt;</strong> yardımı ile yapacağız. İçeriği arttırdıktan sonra temel CSS ile Master Page 'in içerisine stil özellikleri de ekliyoruz ve bu yaptığımız işlemler sonrasında elimizdeki değişikler aşağıdaki gibi olacaktır. <br /> <br /><strong>View\Shared\Site.Master</strong> <br /> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">&lt;%@ Master Language=&quot;C#&quot; Inherits=&quot;System.Web.Mvc.ViewMasterPage&quot; %&gt; <br /> <br />&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt; <br /> <br />&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; &gt; <br />&lt;head runat=&quot;server&quot;&gt; <br />&#160;&#160; &lt;title&gt;&lt;asp:ContentPlaceHolder ID=&quot;TitleContent&quot; runat=&quot;server&quot; /&gt;&lt;/title&gt; <br /> <br />&#160;&#160; &lt;style type=&quot;text/css&quot;&gt; <br />&#160;&#160;&#160;&#160;&#160; html <br />&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; background-color:Gray; <br />&#160;&#160;&#160;&#160;&#160; } <br /> <br />&#160;&#160;&#160;&#160;&#160; .column <br />&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; float:left; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; width:300px; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; border:solid 1px black; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; margin-right:10px; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; padding:5px; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; background-color:white; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; min-height:500px; <br />&#160;&#160;&#160;&#160;&#160; } <br /> <br />&#160;&#160; &lt;/style&gt; <br />&#160;&#160; &lt;asp:ContentPlaceHolder ID=&quot;head&quot; runat=&quot;server&quot;&gt; <br />&#160;&#160; &lt;/asp:ContentPlaceHolder&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />&#160;&#160; &lt;h1&gt;Sitem&lt;/h1&gt; <br /> <br />&#160;&#160; &lt;div class=&quot;column&quot;&gt; <br />&#160;&#160;&#160;&#160;&#160; &lt;asp:ContentPlaceHolder ID=&quot;ContentPlaceHolder1&quot; runat=&quot;server&quot;&gt; <br />&#160;&#160;&#160;&#160;&#160; &lt;/asp:ContentPlaceHolder&gt; <br />&#160;&#160; &lt;/div&gt; <br />&#160;&#160; &lt;div class=&quot;column&quot;&gt; <br />&#160;&#160;&#160;&#160;&#160; &lt;asp:ContentPlaceHolder ID=&quot;ContentPlaceHolder2&quot; runat=&quot;server&quot;&gt; <br />&#160;&#160;&#160;&#160;&#160; &lt;/asp:ContentPlaceHolder&gt; <br />&#160;&#160; &lt;/div&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; </font></td> </tr> </tbody></table> <br />Eklemiş olduğumuz içerik kontrollerini <strong>body '</strong>nin içerisine<strong> &lt;div&gt;</strong> taglarının arasına yerleştiriyoruz. Ayrıca div taglarının sütün gibi hareket etmesi için stil özelliğine daha önceden hazırlamış olduğumuz <strong>column</strong> 'u tanımlıyoruz. Yaptığımız bu işlemler sonucunda Master Page 'in görünümü aşağıdaki gibi olacaktır. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak54_3.gif" width="512" height="315" /> <br /> <br />Basit fakat bizlerin hazırlamış olduğu bir Master Page 'e sahip olduk. <br /> <br /><b><font color="#ff3300"><span class="normal">Master Page 'i Kullanan View Sayfa Oluşturmak</span></font></b> <br /> <br />Asp.Net uygulamalarında Master Page 'ten yararlanarak web sayfaları oluşturabilmemiz mümkündü. Bunun bize en büyük yararı oluşturmuş olduğumuz sayfalarda Master Pages üzerinde belirtmiş olduğumuz içerik kontrol alanlarının düzenlenebilmesi ve diğer taraflar üzerinde herhangi bir değişiklik yapmadan hazırlıyor olmamızdır. MVC Framework 'ten yararlanarak hazırlamış olduğumuz web sayfalarında da Master Page Asp.Net uygulamalarında olduğu gibi kullanılmaktadır. <br /> <br />View klasörünün içerisinde yer alan Home klasörünün üzerinde sağ tıklama sonrasında karşımıza gelen menüden Add - NewItem seçeneğine tıklayarak ekrandan <strong>MVC View Content Page </strong> i seçerek Master Page 'i kullanabileceği bir web sayfa oluşturmaya başlıyoruz. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak54_4.gif" width="410" height="95" /> <br />Sayfa tipimizi seçip ekle dediğimizde hazırlamış olduğumuz Master Page 'ler den istediğimizi seçmek için bir ekran çıkacaktır. <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak54_5.gif" width="465" height="282" /> <br /> <br />Tamam dedikten sonra artık Master Page 'i kullanan bir web sayfası uygulamamızda oluşturulmuş olacaktır. Oluşturulan sayfanın arka plan kodları aşağıdaki gibi oluşturulmuştur. <br /> <br /><strong>View\Home\Index.aspx</strong> <br /> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">&lt;%@ Page Title=&quot;&quot; Language=&quot;C#&quot; <strong>MasterPageFile=&quot;~/Views/Shared/Site.Master&quot;</strong> Inherits=&quot;System.Web.Mvc.ViewPage&quot; %&gt; <br />&lt;asp:Content ID=&quot;Content1&quot; ContentPlaceHolderID=&quot;TitleContent&quot; runat=&quot;server&quot;&gt; <br />&lt;/asp:Content&gt; <br />&lt;asp:Content ID=&quot;Content2&quot; ContentPlaceHolderID=&quot;head&quot; runat=&quot;server&quot;&gt; <br />&lt;/asp:Content&gt; <br />&lt;asp:Content ID=&quot;Content3&quot; ContentPlaceHolderID=&quot;ContentPlaceHolder1&quot; runat=&quot;server&quot;&gt; <br />&lt;/asp:Content&gt; <br />&lt;asp:Content ID=&quot;Content4&quot; ContentPlaceHolderID=&quot;ContentPlaceHolder2&quot; runat=&quot;server&quot;&gt; <br />&lt;/asp:Content&gt; </font></td> </tr> </tbody></table> <br />Standart olarak projelere eklenmiş olan *.aspx sayfalardan farklı olarak HTML ve Body tagları yer almaktadır. Bu taglar Master Page de oluşturulduğu için yalnızca belirttiğimiz içerik kontrol alanları sayfada gözükmüştür ve sayfa içerisinde kullanıcılara göstermek istediğimiz içerikleri buralardan yayınlarız. Örnek olması açısında body taglarının içerisine eklemiş olduğumuz &lt;asp:content&gt; 'lerin içerisinde biraz değişiklik yaparak aldığımız sonuca hep birlikte çok atalım. <br /> <br /><strong>View\Home\Index.aspx</strong> <br /> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">&lt;%@ Page Title=&quot;&quot; Language=&quot;C#&quot; <strong>MasterPageFile=&quot;~/Views/Shared/Site.Master&quot;</strong> Inherits=&quot;System.Web.Mvc.ViewPage&quot; %&gt; <br />&lt;asp:Content ID=&quot;Content1&quot; ContentPlaceHolderID=&quot;TitleContent&quot; runat=&quot;server&quot;&gt; <br />&lt;/asp:Content&gt; <br />&lt;asp:Content ID=&quot;Content2&quot; ContentPlaceHolderID=&quot;head&quot; runat=&quot;server&quot;&gt; <br />&lt;/asp:Content&gt; <br />&lt;asp:Content ID=&quot;Content3&quot; ContentPlaceHolderID=&quot;ContentPlaceHolder1&quot; runat=&quot;server&quot;&gt; <br />&#160;&#160; İlk içerik kontrol alanı <br />&lt;/asp:Content&gt; <br />&lt;asp:Content ID=&quot;Content4&quot; ContentPlaceHolderID=&quot;ContentPlaceHolder2&quot; runat=&quot;server&quot;&gt; <br />&#160;&#160; İkinci içerik kontrol alanı <br />&lt;/asp:Content&gt; </font></td> </tr> </tbody></table> <br />Yaptığımız düzenleme sonrasında ekran değişikliğimiz aşağıdaki gibi olacaktır. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak54_6.gif" width="592" height="252" /> <br /> <br />Yapılmış olan değişikler sonrasında web sayfamızın içeriği istediğimiz gibi olmuştur. <br /> <br /><b><font color="#ff3300"><span class="normal">Master Page yardımı ile oluşturulan view sayfanın içeriğini düzenlemek</span></font></b> <br /> <br />İlk olarak düzenleme yapağımız yer sayfamızın başlığı olacaktır. Oluşturmuş olduğumuz web sayfası internet tarayıcısında açıldığında pencerenin en üst kısmında yer alan bölümü düzenleyelim. Asp.Net ten ve diğer bütün web sayfası kodlama yapılarından alışık olduğumuz üzere title bölümünde belirtmemiz yeterli olacaktır. <br /> <br />Sayfamızın markup kod tarafında en üstte yer alan <strong>&lt;Page&gt; &lt;/Page&gt;</strong> bölümün aralığının içerisinde yer alan title özelliğini değiştirerek sayfa başlığını sorunsuzca oluşturmuş oluruz. <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak54_7.gif" width="238" height="65" /> <br /> <br />Yapmış olduğumuz işlemi hazırlanmış olan Master Pages ile ilişkilendirerek tekrardan yapalım. Bu durumda ilk olarak oluşturulan Master Pages içerisine koyduğumuz içerik kontrol alanlarını hatırlamamız gerekir ve bir tane head bölümünün içerisine &lt;asp:contentplaceholder&gt; ekledik. Alana başlık, meta ve diğer birçok kriteri ekleyebilmemiz mümkündür. Bu özellikten yararlanarak aspx sayfasının içerisinde aşağıdaki değişiklikleri uyguluyoruz. <br /> <br /><strong>View\Home\Index.aspx</strong> <br /> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">&lt;%@ Page Language=&quot;C#&quot; <strong>MasterPageFile=&quot;~/Views/Shared/Site.Master&quot;</strong> Inherits=&quot;System.Web.Mvc.ViewPage&quot; %&gt; <br /><em>&lt;asp:Content ID=&quot;Content1&quot; ContentPlaceHolderID=&quot;TitleContent&quot; runat=&quot;server&quot;&gt;</em> <br />&#160;<strong>&#160; &lt;title&gt;Başlık buraya yazılacak&lt;/title&gt; <br />&#160;&#160; &lt;meta name=&quot;description&quot; content=&quot;İçindekiler buraya&quot; /&gt; <br />&#160;&#160; &lt;meta name=&quot;keywords&quot; content=&quot;ana arama kriterleri buraya&quot; /&gt;</strong> <br /><em>&lt;/asp:Content&gt;</em> <br />&lt;asp:Content ID=&quot;Content2&quot; ContentPlaceHolderID=&quot;head&quot; runat=&quot;server&quot;&gt; <br />&lt;/asp:Content&gt; <br />&lt;asp:Content ID=&quot;Content3&quot; ContentPlaceHolderID=&quot;ContentPlaceHolder1&quot; runat=&quot;server&quot;&gt; <br />&#160;&#160; İlk içerik kontrol alanı <br />&lt;/asp:Content&gt; <br />&lt;asp:Content ID=&quot;Content4&quot; ContentPlaceHolderID=&quot;ContentPlaceHolder2&quot; runat=&quot;server&quot;&gt; <br />&#160;&#160; İkinci içerik kontrol alanı <br />&lt;/asp:Content&gt; </font></td> </tr> </tbody></table> <br />Asp.Net uygulamaları ile uygulamadığımız tekniklerin birebir aynısıdır. Bu örneklerin bu kadar detaylı olarak gösterilmesinin sebebi Master Pages kavramının temel yapısının alışık olduğumuz Asp.Net Master Pages kavramından bir farkının olmadığını da göstermek amacıyladır. Yapmış olduğumuz işlemler sonrasında karşımıza gelen ekran görüntüsü aşağıdaki gibi olacaktır. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak54_8.gif" width="564" height="402" /> <br /> <br />Yaptığımız işlemler sonucunda gayet başarılıyız. :) <br /> <br />Bu yazımızda Asp.Net MVC Framework ile hazırlanmış olan uygulamalarda Master Pages kavramını nasıl kullanabileceğimizi ve içerik düzenlemelerini nasıl kullanabileceğimizi detaylı bir biçimde incelemeye çalıştık. Bir sonraki MVC Framework yazımızda Master Pages kavramını incelemeye devam ederken veri tabanı işlemleri ile ilişkilerine de detaylı bir biçimde değineceğiz. <br /> <br />Umarım yararlı olabilmiştir. <br /><a href="mailto:info@turhaltemizer.com">info@turhaltemizer.com</a></font></div> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35481450-7501866125171368488?l=turhal.blogspot.com'/></div>turhaltemizerhttp://www.blogger.com/profile/14762155033738029313noreply@blogger.com0tag:blogger.com,1999:blog-35481450.post-15076796101677083792009-07-08T23:03:00.000+03:002009-07-08T23:04:04.070+03:00Windows Vista: Disable UAC for selected applications<p align="justify">Microsoft has released a Knowledgebase article that explains how users can disable UAC, that is the User Account Control, for selected applications in Windows Vista. This solution requires an administrator account and the Application Compatibility Toolkit which can be downloaded <a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=24DA89E9-B581-47B0-B45E-492DD6DA2971&amp;displaylang=en">from</a> Microsoft directly.</p> <p align="justify">The advantage of this solution is that you can disable the User Account Control for selected applications. This is for instance useful if you use an application day in day out getting that irritating UAC popup whenever you start it. The following process has to be done only once but it takes some time, here are the steps:</p> <p align="justify">1)Download and install the Application Compatibility Toolkit </p> <p align="justify">2) In the Start menu, locate the new folder. Find the shortcut icon for Compatibility Administrator. Right click it and clik Run as administrator.</p> <p align="justify">3) In the left hand pane, right-click on the database under Custom Databases and select Create New, and select Application Fix.</p> <p align="justify">4) Enter the name and other details of the application you want to alter behavior on and then browse to it to select it. Click Next.</p> <p align="justify">5) Click Next until you are in the Compatibility Fixes screen.</p> <p align="justify">6) On the Compatibility Fixes screen, find the item RunAsInvoker, and check it.</p> <p align="justify">7) Click Next and then Finish.</p> <p align="justify">8) Select File and Save As. Save the file as a filename.SDB type file in a directory you will easily find it.</p> <p align="justify">9) Copy the .sdb file to the Vista computer you want to alter the elevation prompt behavior on.</p> <p align="justify">10) Click Start&gt;All Programs&gt;Accessories. Right click Command Prompt and click Run as administrator.</p> <p align="justify">11) Run the command below:</p> <p align="justify">sdbinst \.sdb</p> <p align="justify">For example, if you saved the .SDB file as abc.sdb in the c:\Windows folder, the command should be like this:</p> <p align="justify">sdbinst c:\windows\abc.sdb</p> <p align="justify">It should prompt: Installation of complete.</p> <p align="justify">Source: <a title="http://www.ghacks.net/2008/01/08/vista-disable-uac-for-selected-applications/" href="http://www.ghacks.net/2008/01/08/vista-disable-uac-for-selected-applications/">http://www.ghacks.net/2008/01/08/vista-disable-uac-for-selected-applications/</a></p> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35481450-1507679610167708379?l=turhal.blogspot.com'/></div>turhaltemizerhttp://www.blogger.com/profile/14762155033738029313noreply@blogger.com0tag:blogger.com,1999:blog-35481450.post-91185900110153736302009-07-08T22:59:00.000+03:002009-07-08T23:02:03.880+03:00Online Capture Captivate Uygulaması<p align="justify">Ekran görüntülerini yakalamak ve sonrasında flash animasyon veya video dosyası olarak dönüştürmek istediğimizde en sık kullanılan program Camtasia Studio uygulamasıdır. Fakat anlı bize bu uygulama lazım oldu ve kurulumunu bulamadık. Ne yapmamız gerekiyor. Aşağıda vereceğim link yardımı ile online capture captivate uygulamasını kullanmanız gerekiyor. Bu uygulama yardımı ile sesli olarak ekran görüntülerinizi yakalayıp istediğiniz şekilde eğitim çekebilmeniz mümkündür. </p> <p><a href="http://www.screencast-o-matic.com/">http://www.screencast-o-matic.com/</a></p> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35481450-9118590011015373630?l=turhal.blogspot.com'/></div>turhaltemizerhttp://www.blogger.com/profile/14762155033738029313noreply@blogger.com0tag:blogger.com,1999:blog-35481450.post-45274627677213534022009-06-23T00:06:00.001+03:002009-06-23T00:06:32.053+03:00Asp.Net MVC Framework - Model Kavramı<div align="justify"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Asp.Net MVC Framework ile gelen web proje şablonunun kullanımını ve detaylarını incelemeye başladığımız serimizde üç temel katmandan sonuncusu olan model yani veri tabanındaki tablolarını nesne olarak kullanabilmemize olanak tanıyacak yapıyı incelemeyerek serimize devam ediyoruz. <br /> <br />MVC Framework ile uygulamalar geliştirirken eğer veri tabanı işlemlerini de kullanmak istiyorsak model katmanı içerisinde nesne modelimizi oluşturarak işlemlerimizi yapabilmemiz mümkün olacaktır. Asp.Net ile veri tabanı uygulaması geliştirmek istediğimizde ya Enterprise Library ya NHibernate ya da SqlHelper gibi connection pooling ten tutunda daha bir çok veri tabanı işlemini bünyesinde yapabilen projeleri kullanırdık. .Net Framework 3.0 'ın çıkışı ile bu işlemlerimizi LinQ to SQL ile de yapabilir duruma geldik. Zaman ilerleyip .Net 3.5 'in çıkışı ile Ado.Net Entity Framework yapısı ile tanıştık, SP1 'i ile de projelerimizde kullanmaya başladık. Genel olarak hem Linq to SQL hem de Ado.Net Entity Model O/RM modelini daha kolay ve anlaşılabilir biçimde gerçekleştirebilmemize olanak tanımaktadır. <br /> <br />Genel olarak MVC Framework' te model veri tabanı işlemlerimizi yapabilmemiz için gerekli olan tablo, StoreProcedure ve function gibi işlevleri nesne olarak tanımlayıp daha sonrasında controller katmanınında gerekli işlemleri yaparak kullanabilmemize olaran tanımaktadır. <br /> <br />Yazımızı incelerken Ado.Net Entity Data Modeli inceleyerek devam edeceğiz. <br /> <br />Modeli oluşturabilmek için ilk olarak bir veri tabanına ve bunun içerisinde yer alan tablolara ihtiyacımız olacaktır. Bu sebepten ötürü ilk olarak veri tabanını oluşturuyoruz. Biz şirket isimli veri tabanını oluştururak ilk adımı tamamlıyoruz. Sonrasında aşağıdaki kolonları tabloya ekliyor ve adını SirketSektor olarak belirliyoruz. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak53_1.gif" /> <br /> <br />Artık veri tabanını ve tabloyu oluşturduğumuza göre MVC uygulamasını oluşturup model kavramını incelemeye başlayabiliriz. <br /> <br /><b><font color="#ff3300"><span class="KucukBaslik">Ado.Net Entity Data Model Oluşturulması</span></font></b> <br /> <br />Ado.Net Entity Data Model daha öncede bahsettiğimiz .Net Framework 3.5 SP1 ile Visual Studio ide mize eklenmiştir. İlk olarak MVC proje şablonundan MVC web uygulamasını oluşturuyoruz. Model klasörünün üzerinde sağ tıklama yaparak yeni bir data model ekliyoruz. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak53_2.gif" /> <br /> <br />Sonrasında karşımıza çıkan ekranda Generate From DataBase seçeneğini seçerek ilerle diyoruz. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak53_3.gif" /> <br /> <br />Veri tabanına erişebilmemiz için gerekli bağlantı ayarlarının yapılması gereken ekrana sıra geldi. Burada veri tabanı bağlantı bilgilerimizi ekliyoruz. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak53_4.gif" /> <br /> <br />Oluşturmuş olduğumuz veri tabanı tablosunu projemize model olarak eklediğimizde bize oluşturulan nesne yapısı aşağıdaki gibidir. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak53_5.gif" /> <br />Veri modelini MVC Framework ile hazırlamış olduğumuz web projesine sihirbaz yardımıyla adım adım nasıl ekleyeceğimize göz attık. Eklemiş olduğumuz modeli designer ekranında isim ve benzeri özelliklerini değiştirebilmemiz mümkündür. Veri tabanını model olarak projemize ekledik ve kullanabilir bir duruma getirdik. Şimdi oluşturmuş olduğumuz modeli diğer sınıflarda da kullanabilmek için ilk olarak projemizi derliyoruz. Derledikten sonra modeli kullanmak istediğimiz controller sınıfına Model isim alanını ekliyoruz. <br /> <br /><strong>Entity Framework ile Veri Tabanı Kayıtlarına Select işlemi Uygulamak <br /> <br /></strong>Daha önceki yazılarımızdan hatırlayacağınız üzere kullanıcıların kullanacağı sayfalara ilişkin verileri controller sınıflarında hazırlardık. Index sayfasında gösterilecek veriler için Index() metodu kullanılır ve içeriği ona göre doldurulur. Controller içerisindeki metottan da otomatik view ekle dediğimizde bize bir liste mi oluşturmak istediğimizi soruyor. Bu bizim yaptığımız işlem sonucunda ToList() yardımı ile sorgumuzu tamamlayacağımızı göstermektedir. <br /> <br /><strong>Controller\HomeController.cs</strong> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">using System.Linq; <br />using System.Web.Mvc; <br />using MovieEntityApp.Models; <br /> <br />namespace ModelInside.Controllers <br />{ <br />&#160;&#160;&#160; [HandleError] <br />&#160;&#160;&#160; public class HomeController : Controller <br />&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>MoviesDBEntities _db;</strong> <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public HomeController() <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>_db = new MoviesDBEntities();</strong> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public ActionResult Index() <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>ViewData.Model = _db.MovieSet.ToList();</strong> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return View(); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } <br />&#160;&#160;&#160; } <br />}</font></td> </tr> </tbody></table> <br />Ado.Net Entity Framework veri modeli üzerinde oluşturulmuş olan veri tabanı objesine erişebilmek için ilk olarak değerimizi yüklüyoruz. Sonrasında _db objesine veri tabanı nesnelerine erişebilmemiz için gerekli EDML sınıfımızı tanımlıyoruz. Bu işlemler sonucunda artık projemizde veri tabanı nesnelerini kullanabilir duruma gelmiş bulunuyoruz. Bu işlemleri gerçekleştirdikten&#160; artık tablo üzerinde işlemleri yapabiliriz. Yukarıdaki kod parçasında da görüleceği üzere index() sayfasında verilerimizi göstermek istiyoruz. Bu işlemleri daha önceden select sorguları yazarak yapmamız gerekiyordu. Fakat Linq To Sql ile artık kullanımına alıştığımız nesnesel veri tabanı öğeleri var. Bu özelliklerden MovieSet 'i kullanarak belirtilen tablo içerisinde ki bütün verileri bir List olarak döndürebilmemiz mümkündür. Bu kısa yöntemi LinqToSQL ile yazmış olsaydık nasıl bir kod parçası yazacağımıza kısaca bir göz atalım. <br /> <br /> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">ViewData.Model = _db.MovieSet.ToList(); //Ado.Net Entity Framework ile <br />ViewData.Model = (from m in _db.MovieSet select m).ToList(); //LinqToSQL ile</font></td> </tr> </tbody></table> <br />LinqToSql ile yazılmış sorgunun metot olarak kullanılmış hali Ado.Net Entity Model de olan yapıdır. Basitçe hazırlamış olduğumuz index metodunun view sayfasını oluşturarak yazımıza devam edelim. <br /> <br /> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">&lt;%@ Page Title=&quot;&quot; Language=&quot;C#&quot; MasterPageFile=&quot;~/Views/Shared/Site.Master&quot; Inherits=&quot;System.Web.Mvc.ViewPage&lt;IEnumerable&lt;mak53.Models.Film&gt;&gt;&quot; %&gt; <br /> <br />&lt;asp:Content ID=&quot;Content1&quot; ContentPlaceHolderID=&quot;TitleContent&quot; runat=&quot;server&quot;&gt; <br />&#160;&#160;&#160; Index <br />&lt;/asp:Content&gt; <br />&lt;asp:Content ID=&quot;Content2&quot; ContentPlaceHolderID=&quot;MainContent&quot; runat=&quot;server&quot;&gt; <br />&#160;&#160; &lt;h2&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160; Index&lt;/h2&gt; <br />&#160;&#160; &lt;div&gt; <br />&#160;&#160;&#160;&#160;&#160; &lt;% foreach (var item in ViewData.Model) <br />&#160;&#160;&#160;&#160;&#160; { %&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Film Adi: <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;%= item.Film_Adi %&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;br /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Yonetmen: <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;%= item.Yonetmen%&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;br /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;%= Html.ActionLink(&quot;Edit&quot;, &quot;Edit&quot;, new { id = item.Id })%&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;%= Html.ActionLink(&quot;Delete&quot;, &quot;Delete&quot;, new { id = item.Id })%&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;hr /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160; &lt;% } %&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160; &lt;%= Html.ActionLink(&quot;Add Movie&quot;, &quot;Create&quot;) %&gt; <br />&#160;&#160;&#160; &lt;/div&gt; <br />&lt;/asp:Content&gt;</font></td> </tr> </tbody></table> <br />Foreach yardımı ile sorgumuz sonucunda dönen verileri sayfamızda gösterebilmesine olanak tanınır. Index metodunu index view ı ile ilişkilendirdiğimizde karşımıza çıkan sonuç aşağıdaki gibi olacaktır. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak53_6.gif" /> <br /> <br /><strong>Entity Framework ile Veri Tabanı Kayıtlarına Insert işlemi Uygulamak <br /> <br /></strong>Daha önceki yazılarımızda da defalarca nasıl insert işlemini gerçekleştireceğimize değinmeye çalıştık. Bu yazımız tamamen sql işlemlerine odaklı olduğu için daha farklı bir kod yazımı ile işlemlerimizi gerçekleştireceğiz. Fakat kısaca hangi metotlarda hangi işlemleri yapacağımızı kısaca tekrardan değinelim. Insert işlemlerini gerçekleştirmek için controller sınıflarındaki create metotlarını kullanmamız gerekmektedir. Form koleksiyonu olan metotta gerekli veri ekleme işlemleri yapar ve veri sonucunu create metodu içerisinde tamamlanır. <br /> <br />Yukarıda değindiğimiz işlemleri gerçekleştiren kod bloğu aşağıdaki gibi olacaktır. <br /> <br /> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">public ActionResult Create() <br />{ <br />&#160;&#160; return View(); <br />} <br /> <br />// <br />// POST: /Home/Create <br /> <br />[AcceptVerbs(HttpVerbs.Post)] <br />public ActionResult Create(FormCollection collection) <br />{ <br />&#160;&#160; var filmEkle = new Film(); <br /> <br />&#160;&#160; //Deserialize (Listeye ekliyoruz...) <br />&#160;&#160; TryUpdateModel(filmEkle, new string[] {&quot;Film_Adi&quot;, &quot;Yonetmen&quot;}, collection.ToValueProvider()); <br />&#160;&#160; if (string.IsNullOrEmpty(filmEkle.Film_Adi)) <br />&#160;&#160;&#160;&#160;&#160; ModelState.AddModelError(&quot;Film_Adi&quot;, &quot;Film adini hatali girdiniz&quot;); <br />&#160;&#160; if (string.IsNullOrEmpty(filmEkle.Yonetmen)) <br />&#160;&#160;&#160;&#160;&#160; ModelState.AddModelError(&quot;Yonetmen&quot;, &quot;Yonetmen bilgilerini hatalı girdiniz..&quot;); <br />&#160;&#160; //Bilgiler doğruysa filmi kaydediyoruz, <br />&#160;&#160; if(ModelState.IsValid) <br />&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160; _db.AddToFilm(filmEkle); <br />&#160;&#160;&#160;&#160;&#160; _db.SaveChanges(); <br />&#160;&#160;&#160;&#160;&#160; return RedirectToAction(&quot;index&quot;); <br />&#160;&#160; } <br />&#160;&#160; return View(filmEkle); <br />}</font></td> </tr> </tbody></table> <br />Form üzerinden toplanan bilgiler ile veri doğrulaması yapıyoruz, sonrasında da gerekli tabloya veri ekleme işlemini gerçekleştirmiş oluyoruz. Veri tabanına verinin eklendiği satırlar <strong>_db_addToFilm(filmEkle)</strong> ve <strong>_db.SaveChanges()</strong> 'tır. TryUpdateModel metodu bize kullanıcılar tarafında girilen verileri kontrol etmemize olanak tanır. Validation kontrolü gibi çalışmaktadır. <br /> <br />Bu işlemler sonucunda otomatik olarak Create view 'ı oluşturduktan sonra projemizi derleyip çalıştırıyoruz. Herhangi bir veri girmeden kayıt yap dediğimizde aşağıdaki gibi bir sonuç alınmaktadır. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak53_7.gif" /> <br /> <br />İki alan için kontrol yapmıştık ve istediğimiz sonucu aldığımızı görüyoruz. Basit bir şekilde validation kontrollü olarak insert işlemini nasıl gerçekleştireleceğine değinmeye çalıştık. <br /> <br /><strong>Entity Framework ile Veri Tabanı Kayıtlarına Update işlemi Uygulamak</strong> <br /> <br />MVC uygulamalarında güncelleme işlemlerini gerçekleştirmek için edit metotlarının kullanıldığını ve temel olarak hangi işlemleri uygulamamız gerektiğini detaylı bir biçimde incelemiştik. <br />Herkese mutlu günler diliyorum. Güncelleme işlemlerinde dikkat edilmesi gereken en kritik nokta tek bir kayıt üzerinde güncelleme yapılacağı için seçilen kayıta doğru sonucu getirebilmektedir. <br /> <br /> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">public ActionResult Edit(int id) <br />{ <br />&#160;&#160; var filmToGuncelle = _db.Film.First(m =&gt; m.Id == id); <br />&#160;&#160; ViewData.Model = filmToGuncelle; <br />&#160;&#160; return View(); <br />} <br /> <br />// <br />// POST: /Home/Edit/5 <br /> <br />[AcceptVerbs(HttpVerbs.Post)] <br />public ActionResult Edit(FormCollection collection) <br />{ <br />&#160;&#160; var id = Int32.Parse(collection[&quot;id&quot;]); <br />&#160;&#160; var filmToGuncelle = _db.Film.First(m =&gt; m.Id == id); <br /> <br />&#160;&#160; TryUpdateModel(filmToGuncelle, new String[] {&quot;Film_Adi&quot;, &quot;Yonetmen&quot;}, collection.ToValueProvider()); <br />&#160;&#160;&#160;&#160;&#160; if (String.IsNullOrEmpty(filmToGuncelle.Film_Adi)) <br />&#160;&#160; ModelState.AddModelError(&quot;Film_Adi&quot;, &quot;film adini hatali girdiniz&quot;); <br />&#160;&#160;&#160;&#160;&#160; if (String.IsNullOrEmpty(filmToGuncelle.Yonetmen)) <br />&#160;&#160; ModelState.AddModelError(&quot;Yonetmen&quot;, &quot;Yonetmen bilgilerini giriniz&quot;); <br /> <br />&#160;&#160; if(ModelState.IsValid) <br />&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160; _db.SaveChanges(); <br />&#160;&#160;&#160;&#160;&#160; return RedirectToAction(&quot;index&quot;); <br />&#160;&#160; } <br />&#160;&#160; return View(filmToGuncelle); <br />}</font></td> </tr> </tbody></table> <br /><font size="2" face="Verdana"><strong>var filmToGuncelle = _db.Film.First(m =&gt; m.Id == id);</strong> kod parçasında hangi kayıtın güncelleneceği bilgisine ulaşıyoruz. Diğer satırlarda ise yeni bir kayıt oluşturma işlemimde de olduğu gibi verileri kontrol ediyoruz ve en sonunda işlemleri doğruluyoruz. <br /> <br /><font size="2" face="Verdana, Arial, Helvetica, sans-serif"><strong>Entity Framework ile Veri Tabanı Kayıtlarına Delete işlemi Uygulamak <br /> <br /></strong>Veri tabanında veri silme işleminde güncelleme işleminde olduğu gibi bir gerekli id 'ye ilişkin kayda ulaştıktan sonra entity modelinde yer alan delete metodunu kullanarak işlemi tamamlıyoruz.</font> <br /></font> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">public ActionResult Delete(int id) <br />{ <br />&#160;&#160; var filmToSil = _db.Film.First(m =&gt; m.Id == id); <br /> <br />&#160;&#160; _db.DeleteObject(filmToSil); <br />&#160;&#160; _db.SaveChanges(); <br /> <br />&#160;&#160; return RedirectToAction(&quot;index&quot;); <br />}</font></td> </tr> </tbody></table> <br />Veri silme işlemini başarılı bir şekilde gerçekleştirmiş bulunuyoruz. Sonuç olarak yazımızda nelere değindiğimize göz atmak gerekirse, entity data model i nasıl oluşturacağımıza, projemize nasıl ekleyeceğimize ve eklemiş olduğumuz bu data model yardımı ile select,update,insert ve delete işlemlerini incelemeye çalıştık. <br /> <br />Umarım yararlı olabilmiştir.</font></div> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35481450-4527462767721353402?l=turhal.blogspot.com'/></div>turhaltemizerhttp://www.blogger.com/profile/14762155033738029313noreply@blogger.com0tag:blogger.com,1999:blog-35481450.post-73939967156496532182009-06-18T23:57:00.000+03:002009-06-18T23:58:27.526+03:00Silverlight 2.0 – SQL İşlemleri için WCF ve Linq To SQL Kullanım<p align="justify">Silverlight uygulamları RIA yapısında oldukları için direk sql işlemleri ile çalışmak yerine bunları bir servis olarak oluşturup kullanmamız önerilmektedir. Bu sebepten ötürü veri tabanı işlemlerimizi yapmak için ister Linq Data Model oluşturduktan sonra WCF servisine querynin yapılacağı metota bağlyoruz. Sonrasında Silverlight projesine Web service referance olarak ekledikten sonra gerekli işlemleri yaparak istediğimiz data kontrollerine ekleyebilinmesi mümkündür. </p> <p align="justify">Sırası ile yapılması aşağıdaki adımları uygularsanız sizin projenizde sorunsuz bir biçimde çalışacaktır.</p> <ul> <li> <div align="justify">Silverlight projesi oluşturuyoruz. </div> </li> <li> <div align="justify">Oluşturulan web projesine Linq To SQL Data Model ekliyoruz. </div> </li> <li> <div align="justify">Oluşturulan web projesine WCF Service ekliyoruz ve aşağıdaki kodları interface ve sınıfa ekliyoruz.</div> </li> </ul> <p align="justify"><strong>IService1.cs</strong></p> <p>using System.Collections.Generic; <br />using System.ServiceModel; </p> <p>namespace SQLData.Web <br />{ <br />&#160;&#160;&#160; // NOTE: If you change the interface name &quot;IService1&quot; here, you must also update the reference to &quot;IService1&quot; in Web.config. <br />&#160;&#160;&#160; [ServiceContract] <br />&#160;&#160;&#160; public interface IService1 <br />&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; [OperationContract] <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; List&lt;Customer&gt; GetCustomerGetByLastName(string lastName); <br />&#160;&#160;&#160; } <br />}</p> <p><strong>Service1.cs</strong></p> <p>using System.Collections.Generic; <br />using System.Linq; </p> <p>namespace SQLData.Web <br />{ <br />&#160;&#160;&#160; // NOTE: If you change the class name &quot;Service1&quot; here, you must also update the reference to &quot;Service1&quot; in Web.config. <br />&#160;&#160;&#160; public class Service1 : IService1 <br />&#160;&#160;&#160; { </p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; #region IService1 Members </p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; public List&lt;Customer&gt; GetCustomerGetByLastName(string lastName) <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var ctx = new DataClasses1DataContext(); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var matchingCustomer = from cust in ctx.Customers <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; where cust.LastName.StartsWith(lastName) <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; select cust; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return matchingCustomer.ToList(); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; #endregion <br />&#160;&#160;&#160; } <br />}</p> <ul> <li>Yukarıdaki işlemleri gerçekledikten sonra webconfigte ws service content özelliğini basic olarak değiştiriyoruz.</li> <li>Uygulamayı derliyoruz.</li> <li>Sİlverlight uygulaması üzerine ilk olarak Silverlight.Data.Control assembly ‘ını projeye ekliyoruz. Bu işlem silverlight uygulamasında DataGrid kontrolünü kullanabilmenize olanak tanıyacaktır.</li> <li>Silverlight uygulamasına WCF service ini referans olarak ekliyoruz.</li> <li>Sonrasında Page.xaml ve page.xaml.cs ‘e aşağıdaki kod bloklarını ekliyoruz</li> </ul> <p><strong>Page.xaml</strong></p> <p>&lt;UserControl x:Class=&quot;SQLData.Page&quot; <br />&#160;&#160;&#160; xmlns=&quot;<a href="http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;">http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;</a> <br />&#160;&#160;&#160; xmlns:x=&quot;<a href="http://schemas.microsoft.com/winfx/2006/xaml&quot;">http://schemas.microsoft.com/winfx/2006/xaml&quot;</a> <br />&#160;&#160;&#160; xmlns:my=&quot;clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data&quot; <br />&#160;&#160;&#160; Width=&quot;700&quot; Height=&quot;300&quot;&gt; <br />&#160;&#160;&#160; &lt;Grid x:Name=&quot;LayoutRoot&quot; Background=&quot;White&quot; ShowGridLines=&quot;True&quot;&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;Grid.RowDefinitions&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;RowDefinition Height=&quot;30&quot;/&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;RowDefinition /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;RowDefinition Height=&quot;30&quot; /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/Grid.RowDefinitions&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;Grid.ColumnDefinitions&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;ColumnDefinition/&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/Grid.ColumnDefinitions&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;TextBlock Text=&quot;Lütfen Arayacağınız kişinin soyadını giriniz..&quot; Grid.Column=&quot;0&quot; Grid.Row=&quot;0&quot; HorizontalAlignment=&quot;Left&quot;/&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;TextBox x:Name=&quot;txtLastName&quot; Grid.Row=&quot;0&quot; Grid.Column=&quot;0&quot; HorizontalAlignment=&quot;Right&quot; Width=&quot;150&quot; Text=&quot;Lütfen arayın...&quot;/&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;my:DataGrid x:Name=&quot;grd&quot; AlternatingRowBackground=&quot;Beige&quot; AutoGenerateColumns=&quot;True&quot; Width=&quot;700&quot; Height=&quot;200&quot; CanUserResizeColumns=&quot;True&quot; Grid.Row=&quot;1&quot;/&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;Button x:Name=&quot;btnClick&quot; Grid.Row=&quot;2&quot; HorizontalAlignment=&quot;Center&quot; Content=&quot;Ara&quot;/&gt; <br />&#160;&#160;&#160; &lt;/Grid&gt; <br />&lt;/UserControl&gt;</p> <p><strong>Page.xaml.cs</strong></p> <p>using System; <br />using System.Windows; <br />using System.Windows.Controls; </p> <p>namespace SQLData <br />{ <br />&#160;&#160;&#160; public partial class Page : UserControl <br />&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public Page() <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; InitializeComponent(); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Loaded += new RoutedEventHandler(Page_Loaded); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; void Page_Loaded(object sender, RoutedEventArgs e) <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; btnClick.Click += new RoutedEventHandler(btnClick_Click); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; void btnClick_Click(object sender, RoutedEventArgs e) <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ServiceReference1.Service1Client webService = new SQLData.ServiceReference1.Service1Client(); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; webService.GetCustomerGetByLastNameCompleted += new EventHandler&lt;SQLData.ServiceReference1.GetCustomerGetByLastNameCompletedEventArgs&gt;(webService_GetCustomerGetByLastNameCompleted); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; webService.GetCustomerGetByLastNameAsync(txtLastName.Text); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </p> <p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; void webService_GetCustomerGetByLastNameCompleted(object sender, SQLData.ServiceReference1.GetCustomerGetByLastNameCompletedEventArgs e) <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; grd.ItemsSource = e.Result; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } <br />&#160;&#160;&#160; } <br />}</p> <p>Yukarıdaki işlemleri adım adım yaptıktan sonra projemizi çalıştırdığımız da sorunsuzca uygulamamız çalışacaktır. Yaptığımız işlem ise soyadını girdiğimiz kullanıcıları DataGrid kontrolünde listelemektir.</p> <p>Not: Linq To Sql Data Model de SQL Server 2008 veri tabanı örneklerinden <strong>AdventureWorks_LT</strong> veri tabanından <strong>Customer</strong> tablosunu kullandık.</p> <p>Herkese mutlu günler diliyorum.</p> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35481450-7393996715649653218?l=turhal.blogspot.com'/></div>turhaltemizerhttp://www.blogger.com/profile/14762155033738029313noreply@blogger.com0tag:blogger.com,1999:blog-35481450.post-62201457687389314562009-06-17T22:23:00.001+03:002009-06-17T22:23:54.499+03:00Apple iPhone 3.0 Yazılım Güncellemesi<p align="justify">Saat 20:00 civarında iPhone için version 3.0 güncellemesi kullanıcılara sunuldu. Kurmak isteyen arkadaşlar da iTunes üzerinden sistemlerine indirdikten sonra telefonlarına kurabilirler. Daha önceki yazılarımızda da bahsettiğimiz gibi MMS, Kopyala yapıştır ve daha bunun gibi istenen bir çok özellik telefona eklenmiş bulunuyor. 3.0 sürümü ile video kayıt özelliği de kazanıyor. Fakat bu özelliğe sahip olabilmek için <strong>iPhone 3G s</strong> ürününe sahip olmanız gerekiyor. Bu üründe performanstan kamera kabiliyetine kadar bir çok özelliği geliştirilmiş durumda. Ayrıca uygun fiyatı da düşünenler için iyi bir seçenek olacaktır.</p> <p align="justify"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Untitled" border="0" alt="Untitled" src="http://lh3.ggpht.com/_iDpLJsj9ybc/SjlCye0ofaI/AAAAAAAAAwo/kPncwegCPLA/Untitled%5B5%5D.jpg?imgmax=800" width="551" height="274" /> </p> <p>Herkese mutlu ve güzel günler diliyorum…</p> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35481450-6220145768738931456?l=turhal.blogspot.com'/></div>turhaltemizerhttp://www.blogger.com/profile/14762155033738029313noreply@blogger.com0tag:blogger.com,1999:blog-35481450.post-1643007030478405892009-06-17T01:02:00.003+03:002009-06-17T01:21:27.804+03:00Silverlight 2.0 – Çalışma Anında Otomatik Kontrol Eklenmesi<p align="justify"><font size="2" face="Verdana">Silverlight web forma eklemiş olduğumuz button kontrolü yardımı ile sınırsız button kontrolü eklenmesini açıklayan XAML ve C# kodunu vereceğim. Bu örneği kullanarak diğer kontrolleri de ekleyebilmeniz mümkündür. </font></p> <p align="justify"><font size="2"><font face="Verdana"><strong>XAML</strong> <br /></font><font size="1" face="Verdana">&lt;UserControl x:Class=&quot;Controls.Page&quot; <br />&#160;&#160;&#160; xmlns=&quot;</font></font><a href="http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;"><font size="1" face="Verdana">http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;</font></a> <br /><font size="1" face="Verdana">&#160;&#160;&#160; xmlns:x=&quot;</font><a href="http://schemas.microsoft.com/winfx/2006/xaml&quot;"><font size="1" face="Verdana">http://schemas.microsoft.com/winfx/2006/xaml&quot;</font></a> <br /><font size="1" face="Verdana">&#160;&#160;&#160; Width=&quot;400&quot; Height=&quot;300&quot;&gt; <br />&#160;&#160;&#160; &lt;Canvas x:Name=&quot;myCanvas&quot;&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;Button x:Name=&quot;btnIsMy&quot; Content=&quot;Oylesine duruyor...&quot; Canvas.Left=&quot;10&quot; Canvas.Top=&quot;10&quot;/&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;Button x:Name=&quot;btnAnother&quot; Content=&quot;Another&quot; Canvas.Left=&quot;10&quot; Canvas.Top=&quot;30&quot;/&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;CheckBox x:Name=&quot;rushOrder&quot; Content=&quot;Rush&quot; Canvas.Left=&quot;10&quot; Canvas.Top=&quot;50&quot;/&gt; <br />&#160;&#160;&#160; &lt;/Canvas&gt; <br />&lt;/UserControl&gt;</font></p> <p><font size="2"><strong><font face="Verdana">C# <br /></font></strong></font><font size="1" face="Verdana">using System.Windows; <br />using System.Windows.Controls; </font></p> <p><font size="1" face="Verdana">namespace Controls <br />{ <br />&#160;&#160;&#160; public partial class Page <br />&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public Page() <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; InitializeComponent(); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; btnAnother.Click += BtnAnotherClick; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </font></p> <p><font size="1" face="Verdana">&#160;&#160;&#160;&#160;&#160;&#160;&#160; private double _newButtonPosition = 100.0; </font></p> <p><font size="1" face="Verdana">&#160;&#160;&#160;&#160;&#160;&#160;&#160; void BtnAnotherClick(object sender, RoutedEventArgs e) <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var b = new Button {Content = &quot;Ben yaşıyorum&quot;}; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; b.SetValue(Canvas.LeftProperty, 10.0); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; b.SetValue(Canvas.TopProperty, _newButtonPosition); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _newButtonPosition += 30.0; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; b.Width = 100; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; b.Height = 20; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; b.IsEnabled = true; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; b.Click += b_Click; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; myCanvas.Children.Add(b); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </font></p> <p><font size="1" face="Verdana">&#160;&#160;&#160;&#160;&#160;&#160;&#160; static void b_Click(object sender, RoutedEventArgs e) <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var btn = sender as Button; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (btn == null) return; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; btn.Content = &quot;Basma...&quot;; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; btn.IsEnabled = false; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } <br />&#160;&#160;&#160; } <br />}</font></p> <p><font size="2" face="Verdana">Umarım yararlı olabillr. İyi çalışmalar…</font></p><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35481450-164300703047840589?l=turhal.blogspot.com'/></div>turhaltemizerhttp://www.blogger.com/profile/14762155033738029313noreply@blogger.com0tag:blogger.com,1999:blog-35481450.post-9178678036622854342009-06-16T10:40:00.000+03:002009-06-17T10:43:47.362+03:00Facebook Kullanıcı Adı<p align="justify">facebook profilinize internet penceresinden giriş yapmak istediğiniz de id lerle dolu bir adres girmeniz gerekmekteydi. Artık kullanıcı adınız ile girmenize olanak tanımak istemişler. Ben de bu yapıya uyum dedim. Benim profilime erişmek isteyenler, <a href="http://www.facebook.com/turhal.temizer">http://www.facebook.com/turhal.temizer</a> adresini kullanarak girebilirler.</p> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35481450-917867803662285434?l=turhal.blogspot.com'/></div>turhaltemizerhttp://www.blogger.com/profile/14762155033738029313noreply@blogger.com0tag:blogger.com,1999:blog-35481450.post-29142674090498210882009-06-11T11:17:00.001+03:002009-06-11T11:18:38.932+03:00Windows 7 RC DownloadWindows 7 RC sürümü ile testerların kullanımına sunulmuştur. İndirmek isteyenler aşağıda yer alan linki kullanarak ürünü edinebilirler.<br /><br /><a href="https://www.microsoft.com/betaexperience/productkeys/win7-rc-32/enus/">https://www.microsoft.com/betaexperience/productkeys/win7-rc-32/enus/</a><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35481450-2914267409049821088?l=turhal.blogspot.com'/></div>turhaltemizerhttp://www.blogger.com/profile/14762155033738029313noreply@blogger.com0tag:blogger.com,1999:blog-35481450.post-13969288580301756942009-06-03T11:20:00.001+03:002009-06-03T11:20:47.180+03:00Windows 7 - Çıkış Tarihi<p align="justify"><font size="2" face="Verdana">Microsoft, işletim sistemi Windows 7'nin 22 Ekim'de satışa çıkarılacağını açıkladı. </font></p> <p align="justify"><font size="2" face="Verdana">Fazla tutulmayan Vista'nın yerini alacak olan sistem, PC yapımcılarına temmuz ayı sonunda verilmeye başlanacak. Windows 7 yüklü yeni bilgisayarlar, 22 Ekim'den itibaren satın alınabilecek veya yüklü işletim sistemleri yeni sisteme yükseltilebilecek. </font></p> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35481450-1396928858030175694?l=turhal.blogspot.com'/></div>turhaltemizerhttp://www.blogger.com/profile/14762155033738029313noreply@blogger.com0tag:blogger.com,1999:blog-35481450.post-2088933041866335762009-05-27T10:07:00.000+03:002009-05-27T10:09:40.110+03:00Windows Server 2008 & Windows Vista – Service Pack 2<p align="justify"><font size="2" face="Verdana">Windows Vista kullanıcıları için iyi bir haber!!! SP2 dün(26-05-2009) itibari ile otomatik güncellemelere sunulmuştur. Sistemlerini güvenlik ve benzeri açıklardan korumak isteyenler kurup kullanabilirler. Otomatik güncellemelerdeki ekran görüntüsü aşağıdaki gibidir.</font></p> <p align="justify"><font size="2" face="Verdana"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="VistaSp2" border="0" alt="VistaSp2" src="http://lh6.ggpht.com/_iDpLJsj9ybc/ShznINA5wEI/AAAAAAAAAwk/QjSxpOFVljw/VistaSp2%5B5%5D.gif?imgmax=800" width="563" height="222" /> </font></p> <p align="justify"><font size="2" face="Verdana">Ayrıca harici olarak indirip kurmak isteyenler aşağıdaki linkten yararlanarak indirebilirler…</font></p> <p align="justify"><a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=a4dd31d5-f907-4406-9012-a5c3199ea2b3&amp;DisplayLang=en" target="_blank"><font size="2" face="Verdana">Windows Server 2008 Service Pack 2 and Windows Vista Service Pack 2 - Five Language Standalone (KB948465)</font></a></p> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35481450-208893304186633576?l=turhal.blogspot.com'/></div>turhaltemizerhttp://www.blogger.com/profile/14762155033738029313noreply@blogger.com0tag:blogger.com,1999:blog-35481450.post-2976647659413978152009-05-24T23:39:00.001+03:002009-05-24T23:39:55.115+03:00Asp.Net MVC Framework - View Kavramı<div align="justify"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">ASP.NET MVC Framework incelemeye View katmanı ile devam ediyoruz. Bu yazımızda Asp.Net MVC View, View Data ve HTML Helper kavramlarına değinip detaylı bir biçimde açıklamaya çalışıyor olacağız. Yazımızı tamamladığımızda MVC uygulamalarında View oluşturabilmeyi, Controller üzerinden gelen verileri view üzerinde gösterebilmeyi ve kendi html helper 'ımızı oluşturabilmeyi yapabiliyor olacağız. <br /> <br /><b><font color="#ff3300"><span class="KucukBaslik">Asp.Net MVC Framework - View 'ı Anlamak</span></font></b> <br /> <br />Çok uzun zamandır web uygulamaları geliştiriciler tarafından hazırlanmakta ve kullanıcıların kullanımlarına sunulmaktadır. <strong>Asp.Net</strong> veya <strong>Active Server Page</strong> (ASP) kullanırken son kullanıcıdan gelen istekler doğrultusunda yapılacak işlemleri arka plan kodlarında işlemi gerçekleştirir ve Controller kavramı tam olarak işlemezdi. Ayrıca aspx ya da Asp sayfaların içerisine yönetilebilir kodların yazıldığı bir çok proje görebiliriz. Bu işlemin olması injection ataklarından tutunda yaptığımız projenin yavaş çalışmasına kadar bir çok olumsuz faktör ile bizi karşı karşıya bırakmaktadır. MVC Framework ile geliştirdiğimiz uygulamaların View sayfalarında ise sadece HTML kodların yazılmasına olanak tanınmaktadır. Sebebi ise performansın dışında gereksiz yere server 'a zorlayan işlemleri view sayfalarda kullanmamak. Çünkü bir işlem yapılmayacak dahi olsa view sayfaların açılmaktadır. Eğer ki kullanıcıların görecekleri sayfalara yönetilebilir kodlar eklersek sayfa açıldığında bu kodlarda işlenecek, sayfanın serverdan çağırılması esnasında yüklenmesi için geçecek zamanda da bandwith in dolmasına sebep olacaktır. <br /> <br />MVC uygulamalarında Controller katmanında olan sınıflarda oluşturulan metotlar ile eşleştirilmiş Viewlar üzerinde işlem yapılır. Controller üzerindeki metotlar 'da MVC 'ye göre Action işlemini gördüğünü daha önceki yazılarımızda incelemiştik. Kısacası MVC Framework 'te oluşturulan Viewler, Controller katmanında oluşturulan sınıflarda yer alan metotlar yani Action lara göre hazırlanır ve kod tarafında sadece html kodlar yer almaktadır. <br /> <br />MVC Framework ile varsayılan olarak oluşturulan <strong>HomeController.cs</strong> sınıfında <strong>Details()</strong> ve <strong>Index()</strong> metotlarını aşağıdaki gibi oluşturalım. Hatırlayacağınız üzere Controller da oluşturulan metotların isimleri Action olarak geçmektedir. <br /> <br /><strong>Controller\HomeController.cs</strong> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">using System.Web.Mvc; <br /> <br />namespace MvcApplication1.Controllers <br />{ <br />&#160;&#160;&#160; [HandleError] <br />&#160;&#160;&#160; public class HomeController : Controller <br />&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public ActionResult Index() <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return View(); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public ActionResult Details() <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return RedirectToAction(&quot;Index&quot;); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } <br />&#160;&#160;&#160; } <br />}</font></td> </tr> </tbody></table> <br />İlk olarak inleyeceğimiz Action Index() olacak ve URL içerisinde nasıl gösterileceğine de göz atacağız. <br /> <br />/Home/Index <br /> <br />İkinci olarak Details() Actionına ve URL 'de nasıl gözükeceğine göz atalım. <br /> <br />/Home/Details <br /> <br />Oluşturulan metotlarda geri dönüş değeri view olmalıdır. ActionResult kullanımında geri dönüş değerlerinin neler olacağını daha önceki yazılarımızda incelemiştik. Index() metodu açıldığı sayfada isteğe cevap verilmesi için View() ı kullanmaktadır. Details() ise onu ilişkilendiren bir istek geldiğinde Index view ına yönlendirme işlemini yapmaktadır. <br /> <br />Index() actionının geri dönüş değeri olan View(); 'ı web sunucunu nasıl algıladığına göz atmak gerekirse, <br /> <br />/View/Home/Index.aspx <br /> <br />Yukarıda verdiğimiz yol web sunucuna giden adrestir. Peki bu bize ne anlama gelmektedir. En baştan itibaren View yapacağı ana işi belirtmektedir. Home eşleştirileceği Controller 'ın adını, Index Controller içerisindeki Action (Metot) adını belitmektedir. <br /> <br />Details() 'te olduğu gibi başka bir view 'a yönlendirmek istediğimizde elimizle ya da sistemden gelen bir parametre ile harici bir view adı veririz. Bunu web sunucumuzun nasıl anladığına göz atmak gerekirse, <br /> <br /><strong>View(&quot;sertur&quot;); </strong>kullandığımızda <strong>/View/Home/sertur.aspx</strong> şeklinde olacaktır. <br /> <br /><b><font color="#ff3300"><span class="normal">View a İçerik Eklemek <br /></span></font></b> <br />Şimdiye kadar View lar hangi amaçla oluşturulmakta ve Controller 'dan nasıl kullanıldığına değindik. Şimdi dinamik olarak HTML 'i nasıl kullanabileceğimize değinmeye çalışacağız. <br /> <br />Şimdi Index view 'ında şu anın zamanını HTML nasıl göstediğimizi bir hatırlayalım. <br /> <br /><strong>View\Home\Index.aspx</strong> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">&lt;%@ Page Language=&quot;C#&quot; Inherits=&quot;System.Web.Mvc.ViewPage&quot; %&gt; <br /> <br />&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt; <br /> <br />&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; &gt; <br />&#160;&#160; &lt;head id=&quot;Head1&quot; runat=&quot;server&quot;&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160; &lt;title&gt;Index&lt;/title&gt; <br />&#160;&#160; &lt;/head&gt; <br />&#160;&#160; &lt;body&gt; <br />&#160;&#160;&#160;&#160;&#160; &lt;div&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;% Response.Write(DateTime.Now);%&gt; <br />&#160;&#160;&#160;&#160;&#160; &lt;/div&gt; <br />&#160;&#160; &lt;/body&gt; <br />&lt;/html&gt;</font></td> </tr> </tbody></table> <br />HTML sayfada günün zamanını sağlayan kod parçası<font size="2" face="Verdana"> <strong>&lt;% Response.Write(DateTime.Now);%&gt; </strong>dır. Tabii şimdiden dediklerinizi duyar gibiyim. &quot;Eğer böyle kullanacaksak MVC kullanmanın anlamı ne? Azcıkta burada düzenleme yapsalardı&quot; der gibisiniz. :) ASPX sayfalarımızın içerisine C# kod yazdığımızda da <strong>&lt;% %&gt; </strong>yazım şeklini kullanır ve içerisine scriptlerimizi C# olacak şekilde yazardık. MVC 'de ise HTML tarafına yönetilebilir kod yazılmasının yanlış olduğundan bahsetmiştik. Microsoft çalışanları da bu tür sık kullanımları görerek ufak kolaylıklar geliştirmişlerdir. Örneğin web sayfalarında bir değer göstermek için <strong>Response.Write()</strong> sık sık kullanmaktayız. Bu sebepten ötürü kullanmak istediğimiz sadece <strong>&lt;%= %&gt;</strong> kullanmamız yeterli olacaktır. <br /> <br />Örnek ile göstermek gerekirse, <br /> <br /></font><strong>View\Home\Index.aspx</strong> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">&lt;%@ Page Language=&quot;C#&quot; Inherits=&quot;System.Web.Mvc.ViewPage&quot; %&gt; <br /> <br />&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt; <br /> <br />&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; &gt; <br />&#160;&#160; &lt;head id=&quot;Head1&quot; runat=&quot;server&quot;&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160; &lt;title&gt;Index&lt;/title&gt; <br />&#160;&#160; &lt;/head&gt; <br />&#160;&#160; &lt;body&gt; <br />&#160;&#160;&#160;&#160;&#160; &lt;div&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;%= DateTime.Now %&gt; <br />&#160;&#160;&#160;&#160;&#160; &lt;/div&gt; <br />&#160;&#160; &lt;/body&gt; <br />&lt;/html&gt;</font></td> </tr> </tbody></table> <br />İki işlem sonucunda da kullanıcının gördüğü aynı olacaktır. Ayrıca bize bir katkısı da html sayfada daha az metin kullanacağımız için sayfa boyutu daha da azalacak ve sayfanın bir öncekine oranla daha hızlı açılmasına olanak tanınmış olacaktır. <br /> <br /><b><font color="#ff3300"><span class="normal">HTML Helper Kullanımı ile View İçeriğinin Oluşturulması <br /></span></font></b> <br />HTML Helper nesnelerini çağırarak View sayfamızında içeriğine çok hızlı ve kolayca oluşturabilmemiz mümkündür. HTML Helper metotları işlemleri sonucunda string tip üretmektedir. HTML Helper 'da standart HTML elementleri kullanılmaktadır. Bunları; <br /> <br />•<strong>Html.ActionLink</strong>: &lt;a&gt; elementi oluşturarak bir action metoduna link verilmesini sağlar. <br />•<strong>Html.BeginForm</strong>: &lt;form&gt; elementini oluşturur. <br />•<strong>Html.CheckBox</strong>: Checkbox; yani &lt;input type=&quot;checkbox&quot;...&gt; elementi oluşturur. <br />•<strong>Html.DropDownList</strong>: &lt;select..&gt;&lt;option&gt;..&lt;/option&gt;.....&lt;/select&gt; elementlerini(WebForm'lardan tanıdığımız DropDownList'in çıktısı) oluşturur. <br />•<strong>Html.Hidden</strong>: HTML içerisinde gizli alan; yani &lt;input type=&quot;hidden&quot;...&gt; elementi oluşturur. <br />•<strong>Html.ListBox</strong>: &lt;select multiple=&quot;multiple&quot;..&gt;&lt;option&gt;..&lt;/option&gt;.....&lt;/select&gt; elementlerini(WebForm'lardan ListBox'ın çıktısını) oluşturur. <br />•<strong>Html.Password</strong>: Şifre için metin kutusu oluşturur(&lt;input type=&quot;password&quot;...&gt;) <br />•<strong>Html.RadioButton</strong>: &lt;input type=&quot;radio&quot;....&gt; elementi oluşturur. <br />•<strong>Html.TextArea</strong>: Birden fazla satırı olan bir metin kutusu oluşturur(&lt;textarea....&gt; elementi). <br />•<strong>Html.TextBox</strong>: Metin kutusu oluşturur(&lt;input type=&quot;text&quot;....&gt; elementi). <br /> <br />olarak sıralayabilmemiz mümkündür. <br /> <br />Şimdi HTML helper kullanarak basit bir örnek oluşturalım. Örneğimizde BeginForm(), TextBox() ve Password() elementleri yer alsın. <br /> <br /><strong>View\Home\Index.aspx</strong> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">&lt;%@ Page Language=&quot;C#&quot; Inherits=&quot;System.Web.Mvc.ViewPage&quot; %&gt; <br /> <br />&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt; <br /> <br />&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; &gt; <br />&#160;&#160;&#160; &lt;head id=&quot;Head1&quot; runat=&quot;server&quot;&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160; &lt;title&gt;Login Form&lt;/title&gt; <br />&#160;&#160;&#160; &lt;/head&gt; <br />&#160;&#160;&#160; &lt;body&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160; &lt;div&gt; <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;% using (<strong>Html.BeginForm()</strong>) <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; { %&gt; <br />&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;label for=&quot;UserName&quot;&gt;User Name:&lt;/label&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;br /&gt; <br /><strong>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;%= Html.TextBox(&quot;UserName&quot;) %&gt;</strong> <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;br /&gt;&lt;br /&gt; <br />&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;label for=&quot;Password&quot;&gt;Password:&lt;/label&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;br /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>&lt;%= Html.Password(&quot;Password&quot;) %&gt; <br /></strong>&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;br /&gt;&lt;br /&gt; <br />&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;input type=&quot;submit&quot; value=&quot;Log in&quot; /&gt; <br />&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;% } %&gt; <br />&#160; <br />&#160;&#160;&#160;&#160;&#160; &lt;/div&gt; <br />&#160;&#160; &lt;/body&gt; <br />&lt;/html&gt;</font></td> </tr> </tbody></table> <br />Response.Write() yerine &lt;%= %&gt; kullanmamızın daha kolay olacağından bahsetmiştik. Bu sebeple <strong>TextBox()</strong> ve <strong>Password()</strong> kullanırken bu kullanım şeklini tercih ettik. Yaptığımız işlemler sonrasında karşımza çıkan görünüm aşağıdaki gibi olacaktır. <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak52_1.gif" /> <br />Gördüğünüz üzere sadece HTML helper ları kullanarak istediğimizi gerçekleştirdik. Peki, HTML kullanaraj bu işlemi yapmak isteseydik yazmamız gereken kod parçacığının nasıl olacağına değinelim. <br /> <br /> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">&lt;%@ Page Language=&quot;C#&quot; Inherits=&quot;System.Web.Mvc.ViewPage&quot; %&gt; <br /> <br />&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt; <br /> <br />&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; &gt; <br />&#160;&#160;&#160; &lt;head id=&quot;Head1&quot; runat=&quot;server&quot;&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160; &lt;title&gt;Login Form&lt;/title&gt; <br />&#160;&#160;&#160; &lt;/head&gt; <br />&#160;&#160;&#160; &lt;body&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160; &lt;div&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160; &lt;form method=&quot;post&quot; action=&quot;/Home/Login&quot;&gt; <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160; &lt;label for=&quot;userName&quot;&gt;User Name:&lt;/label&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160; &lt;br /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160; &lt;input name=&quot;userName&quot; /&gt; <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160; &lt;br /&gt;&lt;br /&gt; <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160; &lt;label for=&quot;password&quot;&gt;Password:&lt;/label&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160; &lt;br /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160; &lt;input name=&quot;password&quot; type=&quot;password&quot; /&gt; <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160; &lt;br /&gt;&lt;br /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160; &lt;input type=&quot;submit&quot; value=&quot;Log In&quot; /&gt; <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160; &lt;/form&gt; <br />&#160;&#160;&#160;&#160;&#160; &lt;/div&gt; <br />&#160;&#160; &lt;/body&gt; <br />&lt;/html&gt;</font></td> </tr> </tbody></table> <br />İki yöntemde de sorunsuz bir şekilde çözüm aldığımızı gördük. Ancak MVC kullanmak istediğimiz durumlarda HTML helper kullanmak çok daha yararlı olacaktır. Değindiğimiz ve bir süre daha değineceğimiz örnekler geliştirilen uygulamalar için çok basit kalabilir. Örneğin aklınıza GridView() kontrolü yok mu diye gelebilir. Verdiğimiz listeden de görebileceğiniz gibi yoktur. Ancak yazımızın devamında göreceğimiz üzere HTML Helper özellikleri kullanarak kendimiz GridView() 'ı oluturacağız. <br /> <br /><b><font color="#ff3300"><span class="normal">View Sayfalara Verilerin Taşınması</span></font></b> <br />Controller içerisnde View sayfalara veri aktarılması mümkündür. View Data özelliği ile bu işlemler gerçekleştirilebilir. Bu özellik gönderilen verilerin tamamını bir pakete alarak view sayfada kullanılabilir bir biçimde kullanılabilmesine olanak tanımaktadır. <br /> <br />ViewData özelliğini bir örnek ile incelemek gerekirse, <br /> <br /><strong>Controller/UrunController.cs</strong> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">using System.Web.Mvc; <br /> <br />namespace MvcApplication1.Controllers <br />{ <br />&#160;&#160;&#160; public class ProductController : Controller <br />&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; public ActionResult Index() <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ViewData[&quot;Mesaj&quot;] = &quot;Merhaba Dünya!&quot;; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return View(); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } <br />&#160;&#160;&#160; } <br />}</font></td> </tr> </tbody></table> <br />ViewData özelliğine view sayfada göstereceğimiz veriyi atıyoruz. Sonrasında Html.Encoding() özelliği ile gelen veriyi çözümleyerek son kullanıcı ekranında görünmesini sağlıyoruz. Html.Encoding() controller lardan gelen string verileri view sayfalarda görülecek şekilde çözümleyerek görüntülenmesine olanak tanımaktadır. <br /> <br /> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">&lt;%@ Page Title=&quot;&quot; Language=&quot;C#&quot; MasterPageFile=&quot;~/Views/Shared/Site.Master&quot; Inherits=&quot;System.Web.Mvc.ViewPage&quot; %&gt; <br />&lt;asp:Content ID=&quot;Content1&quot; ContentPlaceHolderID=&quot;TitleContent&quot; runat=&quot;server&quot;&gt; <br />&#160;&#160;&#160; Index <br />&lt;/asp:Content&gt; <br />&lt;asp:Content ID=&quot;Content2&quot; ContentPlaceHolderID=&quot;MainContent&quot; runat=&quot;server&quot;&gt; <br />&#160;&#160;&#160; &lt;h2&gt;Index&lt;/h2&gt; <br />&#160;&#160;&#160; &lt;%= Html.Encode(ViewData[&quot;Mesaj&quot;]) %&gt; <br />&lt;/asp:Content&gt;</font></td> </tr> </tbody></table> <br />Html.Encode() yardımıyla Merhaba Dünya! mesajımızı basitçe gösteriyor olduk. Bu işlemimiz sonucunda ekran görüntüsü aşağıdaki gibi olmaktadır. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak52_2.gif" /> <br /> <br />Basit merhaba dünya örneğimiz dışında veri tabanında alınan verileri view sayfasında da göstermek istediğimiz ViewData ve Html.Encoding() kullanılması mümkündür. <strong> <br /> <br /></strong><font color="#ff3300"><span class="KucukBaslik"><strong>Harici HTML Helper (Yardımcı HTML) Kullanımı</strong></span></font><strong> <br /></strong>MVC uygulamalarında View sayfalarında gösterilen sayfa içeriğinin HTML Helper (yardımcı HTML) yardımıyla gösterildiğini görmüş ve geçmiş örneklerimizde bunları detaylı bir biçimde incelemiştik. Normalde alışık olduğumuz &lt;form&gt; elementinin yerine <strong>Html.BeginForm()</strong> özelliği kullanılmaktadır. HTML elementlerinin en sık kullanıldığı zamanlarda &lt;input&gt; ve &lt;img&gt; en çok tercih edilen elementlerdi. Zaman geçtikçe bunların yerini Asp.Net kontrolleri almıştır. Fakat Asp.Net kontrolleri de arka planda derlendiğinde &lt;input&gt; olduğu gözlenmiştir. Bu sebepten bizlere HTML Helper kütüphanesi hazırlanmış ve kullanımımıza sunulmuştur. Tekrardan kullanabileceğimiz en temel HTML Helper metotlarına göz atmak gerekirse; <br /> <br />•Html.ActionLink() <br />•Html.BeginForm() <br />•Html.CheckBox() <br />•Html.DropDownList() <br />•Html.EndForm() <br />•Html.Hidden() <br />•Html.ListBox() <br />•Html.Password() <br />•Html.RadioButton() <br />•Html.TextArea() <br />•Html.TextBox() <br />şeklinde sıralayabilmemiz mümkündür. <br /> <br /><strong>Not:</strong> View sayfalar<strong> </strong>kullanılan elementlerine <strong>HTML Helper</strong> 'ı çözümlerken <strong>&lt;%= %&gt; </strong>kullanımı ile <strong>&lt;% %&gt;</strong> birbirlerine eş değildirler. İkinci şekilde kullanmak istediğimizde uygulama hata verecek ve çalışmayacaktır. <br /> <br /><font color="#ff3300"><span class="normal"><strong>HTML Helper ile Statik Metot Oluşturma</strong></span></font> <br /> <br />Basit olarak HTML Helper da kullanılmak üzere yeni bir statik metodu nasıl oluşturabileceğimize değineceğiz. Yapacağımız örnekte view sayfaya eklenecek kontrolde sabit değeri ve kullanıcının göreceği metin olacaktır. <br /> <br /><strong>Helpers\LabelHelper.cs</strong> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">namespace MvcApplication1.Helpers <br />{ <br />&#160;&#160;&#160; public class LabelHelper <br />&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public static string Label(string target, string text) <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return string.Format(&quot;&lt;label for='{0}'&gt;'{1}'&lt;/label&gt;&quot;, target, text); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } <br />&#160;&#160;&#160; } <br />}</font></td> </tr> </tbody></table> <br />Geri dönüş değeri string olan statik bir metot hazırladık. Artık bizimde bir HTML Helper metodumuz vardır. Şimdi bunu View sayfada nasıl kullanacağımızı açıklamaya çalışalım. İlk olarak yapmamız gereken sayfaya Helpers alanını göstermemiz gerekmektedir. Bu işlemi <strong>&lt;%@ imports %&gt;</strong> ile yapacağız. Sonrasında ise <strong>&lt;%= %&gt; </strong>içerisine LabelHelper.Label&#160; 'ı kullanarak istediğimiz sonucu alabiliriz. Şimdi yazı olarak anlattıklarımızı uygulamalı olarak nasıl yapacağımıza değinmeye çalışalım. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak52_3.gif" width="400" height="98" /> <br /> <br /> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">&lt;%@ Page Language=&quot;C#&quot; MasterPageFile=&quot;~/Views/Shared/Site.Master&quot; Inherits=&quot;System.Web.Mvc.ViewPage&quot; %&gt; <br /><strong>&lt;%@ Import Namespace=&quot;MvcApplication1.Helpers&quot; %&gt; <br /></strong>&lt;asp:Content ID=&quot;indexTitle&quot; ContentPlaceHolderID=&quot;TitleContent&quot; runat=&quot;server&quot;&gt; <br />&#160;&#160; Home Page <br />&lt;/asp:Content&gt; <br /> <br />&#160;&#160; &lt;asp:Content ID=&quot;indexContent&quot; ContentPlaceHolderID=&quot;MainContent&quot; runat=&quot;server&quot;&gt; <br />&#160;&#160; &lt;p&gt; <br />&#160;&#160; &lt;div&gt; <br />&#160;&#160;&#160;&#160;&#160; &lt;%using(Html.BeginForm()) <br />&#160;&#160;&#160;&#160;&#160; {%&gt; <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>&lt;%=LabelHelper.Label(&quot;firstName&quot;, &quot;First Name:&quot;) %&gt; <br /></strong>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;br /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;%=Html.TextBox(&quot;firstName&quot;)%&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;br /&gt;&lt;br /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;label for=&quot;Password&quot;&gt;Password&lt;/label&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;br /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;%=Html.Password(&quot;Password&quot;)%&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;br /&gt;&lt;br /&gt; <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;input type=&quot;submit&quot; value=&quot;Giris&quot; /&gt; <br /> <br />&#160;&#160;&#160;&#160;&#160; &lt;%}%&gt; <br />&#160;&#160; &lt;/div&gt; <br />&#160;&#160; &lt;/p&gt; <br />&lt;/asp:Content&gt;</font></td> </tr> </tbody></table> <br />View sayfamızda istediğimiz değerler sorunsuzca görülmektedir. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak52_4.gif" width="338" height="327" /> <br /> <br />Artık kendimize ait bir HTML Helper sınıfımızı vardır. Fakat biz bu metotları kullanmak istediğimizde hangi sınıf adıydı diye hatırlamamız gerekecektir. En iyi yöntem Html Helper metotlarını extension lar yardımı ile kullanılmasına olanak tanımak olacaktır. <br /> <br /><font color="#ff3300"><span class="normal"><strong>HTML Helper Uzantılı(Extension) Metotlar Oluşturmak </strong></span></font> <br /> <br />HTML Helper ile çalışırken MVC Framework bünyesinde oluşturulmuş olan metotları kullanarak view sayfalarımızın içeriklerini oluştururuz. Bu yöntem standart HTML elementlerinden yararlanılarak oluşturulmuş metotları projelerimizde Html Helper olarak kullanabilmemize olanak tanımaktadır. Şimdi biz örneğimizde HTML helper sınıfına ek bir metot ekleyerek <strong>html. </strong>koyduğumuzda bizim hazırladığımız metodunda kullanılmasını nasıl olacağını incelemeye çalışacağız. <br /> <br /><strong>Helpers\LabelExtensions.cs</strong> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">using System; <br />using System.Web.Mvc; <br /> <br />namespace MvcApplication1.Helpers <br />{ <br />&#160;&#160;&#160; public static class LabelExtensions <br />&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public static string Label(<strong>this HtmlHelper helper</strong>, string target, string text) <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return String.Format(&quot;&lt;label for='{0}'&gt;{1}&lt;/label&gt;&quot;, target, text); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } <br />&#160;&#160;&#160; } <br />}</font></td> </tr> </tbody></table> <br />Visual Studio üzerinde intellisense i kullandığımızda view sayfada html helper için extension olduğuna bize belirtmektedir. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak52_5.gif" width="424" height="64" /> <br /> <br />Yaptığımız değişikliğe göre index.aspx sayfamızı güncellersek sonuç aşağıdaki gibi olacaktır. <br /> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">&lt;%@ Page Language=&quot;C#&quot; MasterPageFile=&quot;~/Views/Shared/Site.Master&quot; Inherits=&quot;System.Web.Mvc.ViewPage&quot; %&gt; <br /><strong>&lt;%@ Import Namespace=&quot;MvcApplication1.Helpers&quot; %&gt; <br /></strong>&lt;asp:Content ID=&quot;indexTitle&quot; ContentPlaceHolderID=&quot;TitleContent&quot; runat=&quot;server&quot;&gt; <br />&#160;&#160; Home Page <br />&lt;/asp:Content&gt; <br /> <br />&#160;&#160; &lt;asp:Content ID=&quot;indexContent&quot; ContentPlaceHolderID=&quot;MainContent&quot; runat=&quot;server&quot;&gt; <br />&#160;&#160; &lt;p&gt; <br />&#160;&#160; &lt;div&gt; <br />&#160;&#160;&#160;&#160;&#160; &lt;%using(Html.BeginForm()) <br />&#160;&#160;&#160;&#160;&#160; {%&gt; <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>&lt;%=Html.Label(&quot;firstName&quot;, &quot;First Name:&quot;) %&gt; <br /></strong>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;br /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;%=Html.TextBox(&quot;firstName&quot;)%&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;br /&gt;&lt;br /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;label for=&quot;Password&quot;&gt;Password&lt;/label&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;br /&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;%=Html.Password(&quot;Password&quot;)%&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;br /&gt;&lt;br /&gt; <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;input type=&quot;submit&quot; value=&quot;Giris&quot; /&gt; <br /> <br />&#160;&#160;&#160;&#160;&#160; &lt;%}%&gt; <br />&#160;&#160; &lt;/div&gt; <br />&#160;&#160; &lt;/p&gt; <br />&lt;/asp:Content&gt;</font></td> </tr> </tbody></table> <br />Evet. Artık Html helper metotları gibi kullanılabilen bir metodumuz oluşmuştur. <br /> <br /><font color="#ff3300"><span class="KucukBaslik"><strong>Veri Tabanı Tablolarında Verilerin Gösterilmesi</strong></span></font> <br /> <br />Yazımızda şu ana kadar View üzerinde yapabileceğimiz temel işlemleri ve kendi istediğimiz doğrultuda HTML yardımcısı oluşturmayı incelemeye çalıştık. Yazımıza veri tabanı işlemleri sonucunda dönen verileri View sayfaları da html yardımcıları kullanılarak nasıl gösterebileceğimizi inceleyerek devam ediyoruz. <br /> <br />Konumuzu örnek üzerinde anlatmaya devam ediyoruz. İlk olarak yapılması gereken bir veri tabanı oluşturmak ve içerisine bir tablo eklemek olacaktır. Yazımızda kullanacağımız veri tabanının adı <strong>Sirket, </strong>Tablonun adı da <strong>Film</strong> olacaktır. Tablonun alanları ve tiplerine aşağıdaki resimden erişebilirsiniz. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak52_6.gif" width="344" height="138" /> <br /> <br />Veri tabanı ve tabloyu oluşturduğumuza göre artık MVC Framework ile oluşturmuş olduğumuz projemize ekleyebiliriz. Bu işlemi yaparken Ado.Net Entity Framework 1.0 'ı kullanacağız. Projeye ekleyebilmek için Model klasörünün üzerine sağ tıklama yapıp çıkan ekranda Ado.Net Entity Data Model 'i seçerek ekle diyoruz. Sonrasında boş bir model oluşturacağız dedikten sonra veri tabanının ne olacağı gibi bilgileri girerek bir sonrasında modeli uygulamaya eklenmiş oluyor. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak52_7.gif" width="174" height="197" /> <br />Artık film tablosu modele dönüştürüldü ve üzerinde işlem yapılmak üzere hazır durumdadır. Eğer model üzerinde bir işlem yapıyorsanız yapmanız gereken o dosyayı kaydetmek, sonrasında ise projeyi bir kere derlemek olacaktır. Sonrasında kullanılabilir sorunsuzca entity model kabiliyetlerini kullanarak işlemleri yapabiliriz. <br /> <br /> <br /><font color="#ff3300"><span class="normal"><strong>Film Controller Oluşturuyoruz</strong></span></font> <br /> <br />Controller hakkındaki ayrıntılı bilgileri daha önceki yazılarımızda değinmiştik. Şimdi ise hızlıca controller 'ı oluşturup işlemlerimizi yapmaya devam edeceğiz. İlk olarak en başta projeye <strong>UrunController.cs</strong> sınıfını oluşturuyoruz. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak52_8.gif" width="287" height="108" /> <br /> <br />Sonrasında karşımıza geçen ekranda Controller adını belirterek oluştur diyoruz. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak52_9.gif" width="325" height="134" /> <br /> <br />Sınıfı oluşturduktan sonra düzenleme yapmaya başlıyoruz. Index() metoduna tablo içerisindeki verileri çekerek işlemi yapıyoruz. <br /> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">using System.Linq; <br />using System.Web.Mvc; <br /><strong>using MvcApplication1.Models;</strong> <br />namespace MvcApplication1.Controllers <br />{ <br />&#160;&#160;&#160; public class FilmController : Controller <br />&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; // <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; // GET: /Film/ <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public ActionResult Index() <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var entity = new SirketDbEntities(); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return View(entity.FilmlerSet.ToList()); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } <br />&#160;&#160;&#160; } <br />}</font></td> </tr> </tbody></table> <br />Veri tabanına eriştik ve sonuçlar artık view sayfada kullanılmak üzere hazır durumda bizi bekliyor. Şimdi view sayfayı oluşturarak işlemlerimize devam ediyoruz. Otomatik olarak oluşturulması için Index() metodunun üzerinde sağ tıklama yaparak AddView seçeneğini seçiyoruz. Sonrasında karşımıza gelen ekranı aşağıdaki şekline getirerek veri tabanından gelen verileri gösteren view sayfamızı oluşturmuş oluruz. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak52_10.gif" width="414" height="439" /> <br /> <br />Otomatil olarak oluşturulan view sayfasındaki kodlar aşağıdaki gibi olmuştur. <br /> <br /> <br /> <br /> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">&lt;%@ Page Title=&quot;&quot; Language=&quot;C#&quot; MasterPageFile=&quot;~/Views/Shared/Site.Master&quot; Inherits=&quot;System.Web.Mvc.ViewPage&lt;IEnumerable&lt;MvcApplication1.Models.Filmler&gt;&gt;&quot; %&gt; <br /> <br />&#160;&#160; &lt;asp:Content ID=&quot;Content1&quot; ContentPlaceHolderID=&quot;TitleContent&quot; runat=&quot;server&quot;&gt; <br />&#160;&#160;&#160;&#160;&#160; Index <br />&#160;&#160; &lt;/asp:Content&gt; <br /> <br />&#160;&#160; &lt;asp:Content ID=&quot;Content2&quot; ContentPlaceHolderID=&quot;MainContent&quot; runat=&quot;server&quot;&gt; <br /> <br />&#160;&#160; &lt;h2&gt;Index&lt;/h2&gt; <br /> <br />&#160;&#160; &lt;table&gt; <br />&#160;&#160;&#160;&#160;&#160; &lt;tr&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;th&gt;&lt;/th&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;th&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Id <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/th&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;th&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Film_Adi <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/th&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;th&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Yonetmen <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/th&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;th&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Cikis_Tarihi <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/th&gt; <br />&#160;&#160;&#160;&#160;&#160; &lt;/tr&gt; <br /> <br />&#160;&#160;&#160;&#160;&#160; &lt;% foreach (var item in Model) { %&gt; <br /> <br />&#160;&#160;&#160;&#160;&#160; &lt;tr&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;td&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;%= Html.ActionLink(&quot;Edit&quot;, &quot;Edit&quot;, new { id=item.Id }) %&gt; | <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;%= Html.ActionLink(&quot;Details&quot;, &quot;Details&quot;, new { id=item.Id })%&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/td&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;td&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;%= Html.Encode(item.Id) %&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/td&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;td&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;%= Html.Encode(item.Film_Adi) %&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/td&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;td&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;%= Html.Encode(item.Yonetmen) %&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/td&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;td&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;%= Html.Encode(String.Format(&quot;{0:g}&quot;, item.Cikis_Tarihi)) %&gt; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/td&gt; <br />&#160;&#160;&#160;&#160;&#160; &lt;/tr&gt; <br /> <br />&#160;&#160;&#160;&#160;&#160; &lt;% } %&gt; <br /> <br />&#160;&#160; &lt;/table&gt; <br /> <br />&#160;&#160; &lt;p&gt; <br />&#160;&#160;&#160;&#160;&#160; &lt;%= Html.ActionLink(&quot;Create New&quot;, &quot;Create&quot;) %&gt; <br />&#160;&#160; &lt;/p&gt; <br /> <br />&lt;/asp:Content&gt;</font></td> </tr> </tbody></table> <br />Bu işlemler doğrultusunda ekran görüntüsü aşağıdaki biçimde olacak ve isteğimizi karşıladığını görüyor olacağız. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak52_11.gif" width="469" height="261" /> <br /> <br /><font color="#ff3300"><span class="KucukBaslik"><strong>TagBuilder Sınıfını Kullanarak Html Helper Oluşturmak</strong></span></font> <br /> <br />TagBuilder sınıfını kullanarak resim ve benzeri dosyaları projede gösterebilmemiz mümkündür. Bu işlemleri gerçekleştirirken diğer view sayfalarda da kullanıldığı gibi html yardımcı (HTML Helper) yardımcı kullanılarak gerçekleştirilir. <br /> <br />TagBuilder sınıfınının genel yapısına göz atmak gerekirse, <br /> <br /><strong>AddCssClass() </strong>= Yeni bir css sınıfı eklenmesine olanak tanır. <strong>class=&quot;&quot; <br /></strong><strong>GenerateId() </strong>= Özniteliklerini ekleyerek id işlenir. Bu metot değişikliklerin periyodik olarak ID bazlı değişiklik olanağı tanır. <br /><strong>MergeAttirbute()</strong> = Özniteliklerini ekleyerek id işlenir. Aşırı yüklenmiş metotlar için kullanılmaktadır. <br /><strong>SetInnerText()</strong> = İç metin ayarlamak için kullanılır. <br /><strong>ToString()</strong> = Daha fazla etiket oluşturulmasına olanak tanımaktadır. <br /> <br />TagBuilder sınıfının dört önemli özellikleri vardır. <br /> <br /><strong>Attribute</strong> = Temsil edilen tüm etiketlerin özniteliklerini taşır. <br /><strong>IdAttributeDotReplacement</strong> = Tekrardan gösterilen etiketlerin GenerateId() metodu kullanılarak değişik periyotlarda işler. <br /><strong>InnerHTML </strong> = Temsil edilen etiketin iç içeriğini sunar. <br /><strong>TagName</strong> = Etiketi gösterir. <br /> <br />TagBuilder sınıfı <br /> <br />TagBuilder sınfı aslında gerçek bir kullanılan ana sınıf değildir. StringBuilder sınıfı miraslanarak oluşturulmuş bir sınıftır. <br /> <br /> <br /><font color="#ff3300"><span class="normal"><strong>Resim Html Helper Oluşturuyoruz</strong></span></font> <br />TagBuilder sınıfının metotlarından GenerateId() ve MergeAttribute() metotlarını kullanarak controller ı oluşturulalım. <br /> <br /> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">using System.Web.Mvc; <br />using System.Web.Routing; <br /> <br />namespace MvcApplication1.Helpers <br />{ <br />&#160;&#160; public static class ResimHelpers <br />&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160; public static string Resim(this HtmlHelper helper, string id, string url, string alternateText) <br />&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return Resim(helper, id, url, alternateText, null); <br />&#160;&#160;&#160;&#160;&#160; } <br /> <br />&#160;&#160;&#160;&#160;&#160; public static string Resim(this HtmlHelper helper, string id, string url, string alternateText, object htmlAttributes) <br />&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // Create tag builder <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var builder = new TagBuilder(&quot;img&quot;); <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // Create valid id <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; builder.GenerateId(id); <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // Add attributes <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; builder.MergeAttribute(&quot;src&quot;, url); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; builder.MergeAttribute(&quot;alt&quot;, alternateText); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; builder.MergeAttributes(new RouteValueDictionary(htmlAttributes)); <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // Render tag <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return builder.ToString(TagRenderMode.SelfClosing); <br />&#160;&#160;&#160;&#160;&#160; } <br /> <br />&#160;&#160; } <br />}</font></td> </tr> </tbody></table> <br />TagBuilder sınıfını kullanarak kendi HTML Helper metodumuzu oluşturuyoruz ve view sayfada kullanılabilir duruma getiriyoruz. Bu noktada yapmamız gereken view sayfada Html<strong>.Resim()</strong> metodunu kullanmak olacaktır. <br /> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">&lt;%@ Page Title=&quot;&quot; Language=&quot;C#&quot; MasterPageFile=&quot;~/Views/Shared/Site.Master&quot; Inherits=&quot;System.Web.Mvc.ViewPage&quot; %&gt; <br />&lt;%@ Import Namespace=&quot;MvcApplication1.Helpers&quot; %&gt; <br />&lt;asp:Content ID=&quot;Content1&quot; ContentPlaceHolderID=&quot;TitleContent&quot; runat=&quot;server&quot;&gt; <br />&#160;&#160; Index <br />&lt;/asp:Content&gt; <br />&lt;asp:Content ID=&quot;Content2&quot; ContentPlaceHolderID=&quot;MainContent&quot; runat=&quot;server&quot;&gt; <br />&#160;&#160; &lt;h2&gt;Index&lt;/h2&gt; <br />&#160;&#160; &lt;%= Html.Encode(ViewData[&quot;Mesaj&quot;]) %&gt;&lt;br /&gt; <br />&#160;&#160; &lt;%= <strong>Html.Resim</strong>(&quot;img1&quot;, ResolveUrl(&quot;~/Content/editor_turhal.jpg&quot;), &quot;Turhal Temizer&quot;)%&gt; <br />&#160;&#160; &lt;%= <strong>Html.Resim</strong>(&quot;img1&quot;, ResolveUrl(&quot;~/Content/editor_turhal.jpg&quot;), &quot;Turhal Temizer&quot;, new {border=&quot;4px&quot;})%&gt; <br />&lt;/asp:Content&gt;</font></td> </tr> </tbody></table> <br />İşlemlerimiz sonucunda ekran görüntüsü aşağıdaki gibi olacaktır. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak52_12.gif" width="273" height="291" /> <br /> <br />Yazımızda detaylı olarak view kavramına, Html Helper 'a ve kendi HTML helper metotlarımızı oluşturmayı detaylı bir biçimde incelemeye çalıştık. Bir sonraki Asp.Net MVC Framework yazımızda Model kavramını incelemeye çalışacağız. <br /> <br />Herkese mutlu günler diliyorum. </font></div> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35481450-297664765941397815?l=turhal.blogspot.com'/></div>turhaltemizerhttp://www.blogger.com/profile/14762155033738029313noreply@blogger.com0tag:blogger.com,1999:blog-35481450.post-55696643340717349952009-05-23T17:35:00.000+03:002009-05-24T00:35:04.373+03:00Turkcelliyseniz Outlook 2007 SMS ve MMS Atıyor<p align="justify"><font face="Verdana">Microsoft Office Outlook 2007 kullanıyorsanız https://oms.turkcell.com.tr sayfasından gerekli ayarları yaptıklarında bilgisayarınızdan dilediğiniz gibi SMS ve MMS gönderebilirsiniz. Ayrıca, Outlook 2007 Mobil Adres Defteri içinde tanımlanmış gruplara toplu SMS gönderebilirsiniz</font>.</p> <p><strong>Not: </strong>E-SMS ‘ler normal şartlara göre %50 indirimli gönderilmektedir.</p> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35481450-5569664334071734995?l=turhal.blogspot.com'/></div>turhaltemizerhttp://www.blogger.com/profile/14762155033738029313noreply@blogger.com0tag:blogger.com,1999:blog-35481450.post-49835702104750143972009-05-22T02:14:00.001+03:002009-05-22T02:14:38.704+03:00Asp.Net MVC Framework - Controller ve Action Kavramı<div align="justify"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Asp.Net MVC Framework web projesi şablonunu incelerken başlattığımız yazı dizimize Controller katmanına daha detaylı değinerek devam ediyor olacağız. <br /> <br />MVC Framework ‘te en önemli parçalarından biride Controller ‘dır. MVC patterninde son kullanıcılar tarafında yapılan istekler doğrultusunda route map yardımıyla gerekli controller sınıfına yönlendirerek işlemleri gerçekleştirmeye başlatır. Controller üzerinde modelle ilişkili olarak veri tabanı işlemleri, yönlendirme işlemleri, hesap işlemleri gibi bir web sitesi için en temel işlemlerin yapıldığı katmandır. <br /> <br /><b><font color="#ff3300"><span class="KucukBaslik">Controller ‘ı Anlamak</span></font></b> <br /> <br />Asp.Net MVC ‘ de kullanıcılar tarafında gelen istekleri alan işleyen ve geri ileten katman olarak tanımlayabiliriz. İnternet tarayıcısında parçalı olarak her controller için ayrı bir istek yapılır. Ufak bir örnek adres üzerinden değinmek gerekirse; <br /> <br />http://localhost/Urun/Index/7 başarılı bir gösterim olabilir. <br /> <br />Controller adı adres çubuğunda Urun olarak geçmektedir. Bu Controllers\ klasörünün alt dizininde yer alan UrunController.cs sınıfından gelmektedir. Bu sınıf gelen isteklere karşı gerekli sonuçları döndürmek için kullanılmaktadır. Controller ların bir diğer özelliği ise yapılan bir işlem sonrasında işlenecek daha parçalar var ise başka bir controller sınıfına aktarmaktadır. <br /> <br />Basit olarak UrunController.cs sınıfına göz atalım; <br /> <br /><strong>Controller\UrunController.cs</strong> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">using System.Web.Mvc; <br />using System.Web.Mvc.Ajax; <br /> <br />namespace MvcApplication1.Controllers <br />{ <br />&#160;&#160;&#160; public class UrunController : Controller <br />&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // GET: /Urun/ <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; public ActionResult Index() <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // Add action logic here <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return View(); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } <br /> <br />&#160;&#160;&#160;&#160; } <br />}</font></td> </tr> </tbody></table> <br />Harici olarak oluşturulan controller sınıfları System.Web.Mvc.Controller sınıfı miraslanarak oluşturulmaktadır. Ayrıca controller sınıflarında oluşturulan metotlarda en çok dikkatimizi çeken Action kullanımıdır. <br /> <br /><b><font color="#ff3300"><span class="KucukBaslik">Action ‘ı Anlamak</span></font></b> <br /> <br />Controller sınıflarını daha da işlevsel kılan Action kullanımıdır. Son kullanıcıdan gelen istek doğrultusunda hangi işlemi yapacağını belirtilen controller sınıfında yer alan metodlar yani action ‘lar yapmaktadır. <br /> <br />http://localhost/Urun/Index/7 adres çubuğunda Urun kontrollerken Index/7 belirtilen meto da 7 parametresine göre işlem yapması anlamına gelmektedir. <br /> <br />Controller ‘ı incelerken vermiş olduğumuz kod bloğunu örnek olarak kullanırsak, UrunController sınıfında yer alan Index() metodunu action ‘dır. Action public metot olmalıdır. C# metodları varsayılan olarak private oluşturulmaktadır. Bu sebepten ötürü action metotlarının public olarak belirtilmesi gerekmektedir. <br /> <br />Action metotlarının aşırı yüklenmesi kabul gören bir kullanım biçimi değildir. Action özellikle daha özelleştirilmiş kullanıma odaklandığı için benzer metot isimleri ile birden fazla işlem yapılması çalışma zamanında sorunlara sebep olabilmektedir. <br /> <br /><b><font color="#ff3300"><span class="normal">Action Result ‘ı Anlamak</span></font></b> <br /> <br />Controller da kullanılan action lar action result ile geri dönüşleri vardır. <br /> <br />1. ViewResult: HTML ve Markup sunar (Represent). <br />2. EmptyResult: Sunumu sonlandırır. <br />3. RedirectResult: Sunulan linki yeni bir adrese yönlendirmeye yarar <br />4. JsonResult: Java Script Object ‘leri Ajax ile birlikte kullanılabilir bir duruma getirir. <br />5. JavaScriptResult: Java Script leri sayfada kullanılabilir biçimde sunar. <br />6. ContentResult: Metin içeriği sunar. <br />7. FileContentResult: İndirilebilir dosyaları sunar (Binary içerik ile). <br />8. FilePathResult: İndirilebilir dosyaları sunar (Dosya yolu ile). <br />9. FileStreamResult: İndirilebilir dosyaları sunar (Stream dosyalar için). <br />View result kullanılarak hazırlanmış bir metoda göz atalım. <br /> <br /><strong>Controller\KitapController.cs</strong> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">using System.Web.Mvc; <br /> <br />namespace MvcApplication1.Controllers <br />{ <br />&#160;&#160;&#160; [HandleError] <br />&#160;&#160;&#160; public class KitapController : Controller <br />&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public ActionResult Index() <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return View(); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } <br />&#160;&#160;&#160; } <br />}</font></td> </tr> </tbody></table> <br />Action sonucunda ViewResult ile HTML view ‘e dönecektir. Index() metodunda view adına göre geri dönüşü yapacaktır. <br /> <br />ViewResult() ve View() metotları Controller sınıfında türetilerek oluşturulmuştur. Controller ‘ın temel sınıfları; <br /> <br />1. View: Action sonucunda ViewResult ‘a yönlendirilir. <br />2. Redirect: Action sonucunda RedirectResult ‘a yönlendirilir. <br />3. RedirectToAction: Action sonucundan RedirectToRouteResult ‘a yönlendirilir (action yardımıyla yönlendirilir). <br />4. RedirectToRoute: Action sonucunda RedirectToRouteResult ‘a yönlendirilir (route yardımıyla yönlendirilir). <br />5. Json: JsonResult döndürür. <br />6. JavaScriptResult: JavaScriptResult döndürür. <br />7. Content: Action işlemi sonucunda ActionResult döndürür. <br /> <br />İnternet tarayıcılarında Controller üzerinde action çağırıldığında View() metodu kullanılmaktadır. Kullanılan bir diğer Action metodu ise RedirectToAction ‘dır. Bu metot yapılan işlemler doğrultusunda geri dönülmesi gerekiyorsa kullanılmaktadır. <br /> <br />Eğer ki Details metodunda ki id parametresine gelen değer HasValue ‘dan farklıysa bizim belirttiğimiz bir view HTML sayfaya yönlendirilmesini talep eden bir controller sınıfı hazırlayalım. <br /> <br /><strong>Controller\KullaniciController.cs</strong> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">using System.Web.Mvc; <br /> <br />namespace MvcApplication1.Controllers <br />{ <br />&#160;&#160;&#160; [HandleError] <br />&#160;&#160;&#160; public class KullaniciController : Controller <br />&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public ActionResult Details(int? id) <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (!id.HasValue) <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return RedirectToAction(&quot;Index&quot;); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return View(); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public ActionResult Index() <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return View(); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } <br />&#160;&#160;&#160; } <br />}</font></td> </tr> </tbody></table> <br />Şimdi vereceğimiz örnek ise içeriklerin gösterimi ile ilgili. Index metodunda ContentResult metodunu kullanarak belirtilen içerisi göstermektedir. <br /> <br /><strong>Controller\DurumController.cs</strong> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">using System.Web.Mvc; <br /> <br />namespace MvcApplication1.Controllers <br />{ <br />&#160;&#160;&#160; [HandleError] <br />&#160;&#160;&#160; public class DurumController : Controller <br />&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public ActionResult Index() <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return Content(&quot;Merhaba Dunya!!!&quot;); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } <br />&#160;&#160;&#160; } <br />}</font></td> </tr> </tbody></table> <br />İçeriği ContentResult metodu da bizim girebilmemiz dışında oluşturulan metotların geri dönüş değerlerine göre de otomatik olarak belirtilebilmesi mümkündür. <br /> <br /><strong>Controller\IsController.cs</strong> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">using System.Web.Mvc; <br /> <br />namespace MvcApplication1.Controllers <br />{ <br />&#160;&#160;&#160; [HandleError] <br />&#160;&#160;&#160; public class IsController : Controller <br />&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public DateTime Index() <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return DateTime.Now; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } <br />&#160;&#160;&#160; } <br />}</font></td> </tr> </tbody></table> <br />Index() metodunda action olarak DateTime nesnesini geri dönüş değeri almaktadır. İnternet tarayıcısında DateTime ‘ın geri dönüş değeri metin olarak View sayfada gösterilmektedir. <br /> <br /><b><font color="#ff3300"><span class="KucukBaslik">Controller Oluşturuyoruz…</span></font></b> <br /> <br />Asp.Net MVC Framework ‘te Controllerları nerelerden nasıl ekleyebileceğimize ve detaylarını inceleyerek yazımıza devam ediyoruz. Bu işlemlerimizi Visual Studio geliştirme ortamı üzerinde örneklerimizi yapıyor olacağız. <br /> <br /><b><font color="#ff3300"><span class="normal">Menü üzerinde Projeye Menü Eklenmesi</span></font></b> <br /> <br />MVC Framework web projesi şablonu ile oluşturulmuş proje üzerinde yeni bir controller sınıfı eklemek için Controllers klasörünün üzerinde fare ile sağ tıklama ile Add-&gt;New -&gt; Controller yolunu izleyerek ekleyebilmemiz mümkündür. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak51_1.gif" /> <br /> <br />Sonrasında karşımıza controllerin adını gireceğimiz bir ekran çıkmaktadır. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak51_2.gif" /> <br /> <br /><strong>Controller\PersonelController.cs</strong> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">using System.Web.Mvc; <br /> <br />namespace MvcApplication1.Controllers <br />{ <br />&#160;&#160;&#160; [HandleError] <br />&#160;&#160;&#160; public class PersonelController : Controller <br />&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public ActionResult Index() <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return View(); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } <br />&#160;&#160;&#160; } <br />}</font></td> </tr> </tbody></table> <br /><b><font color="#ff3300"><span class="normal">Action Metotunun İskeleti</span></font></b> <br /> <br />Biraz önce anlattığımız gibi kolay bir şekilde controller sınıfı ekleyebilmemiz mümkündür. Anlattığımız temel işlemlerin dışında bir de Create, Update ve Details Action metotlarını da basitçe ekleyebilmemiz mümkündür. Sadece yapmamız gereken Controller adını verdiğimiz ekranda senaryolarında oluşmasını isteyip istemediğimizi soran bölüme onay vermek olacaktır. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak51_3.gif" /> <br /> <br />Seçeneği onaylayığ UrunController sınıfını ekle dediğimizde aşağıdaki sınıfı bize Visual Studio otomatik olarak oluşturmaktadır. <br /> <br /><strong>Controller\UrunController.cs</strong> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">using System.Web.Mvc; <br />using System.Web.Mvc.Ajax; <br /> <br />namespace MvcApplication1.Controllers <br />{ <br />&#160;&#160;&#160; public class UrunController : Controller <br />&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; // <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; // GET: /Urun/ <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public ActionResult Index() <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return View(); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // GET: /Urun/Details/5 <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; public ActionResult Details(int id) <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return View(); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // GET: /Urun/Create <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; public ActionResult Create() <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return View(); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // POST: /Urun/Create <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [AcceptVerbs(HttpVerbs.Post)] <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; public ActionResult Create(FormCollection collection) <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; try <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // TODO: Add insert logic here <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return RedirectToAction(&quot;Index&quot;); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; catch <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return View(); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // GET: /Urun/Edit/5 <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; public ActionResult Edit(int id) <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return View(); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // POST: /Urun/Edit/5 <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; [AcceptVerbs(HttpVerbs.Post)] <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; public ActionResult Edit(int id, FormCollection collection) <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; try <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // TODO: Add update logic here <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return RedirectToAction(&quot;Index&quot;); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; catch <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return View(); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } <br />&#160;&#160;&#160;&#160; } <br />}</font></td> </tr> </tbody></table> <br />Oluşturulan sınıf yardımıyla Index, Details, Update, Edit gibi temel veri tabanı işlemleri daha hızlı hazırlayabilmemize olanak tanır. <br /> <br /><b><font color="#ff3300"><span class="normal">Controller Sınıfı Oluşturmak</span></font></b> <br /> <br />Şu ana kadar sürekli olarak ya daha önceden oluşturulmuş olan controller sınıflarını inceledik ya da Visual Studio yardımıyla kolayca oluşturduk. Şimdi ise boş bir sınıf oluşturarak kendimiz bir controller sınıfı nasıl oluşturabileceğimizi incelemeye çalışalım. <br /> <br />Visual Studio ‘da controllers sınıfına sınıfımızı el ile ekliyoruz. Şimdi yapacağımız adımlara bir göz atalım. <br /> <br />1. Controllers klasörüne bir sınıf ekliyoruz. <br />2. Eklemiz olduğumuz sınıfın adı muhakkak Controller ile bitmelidir. <br />3. Sınıfı düzenlerken System.Web.Mvc.Controller ile miraslaşması gerekmektedir. <br /> <br />Bu işlemleri tamamladığımızda kendimiz sorunsuzca bir controller sınıfı oluşturmuş oluruz. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak51_4.gif" /> <br /> <br /><strong>Controller\YaziController.cs</strong> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">using System.Web.Mvc; <br /> <br />namespace MvcApplication1.Controllers <br />{ <br />&#160;&#160;&#160; [HandleError] <br />&#160;&#160;&#160; public class YaziController : Controller <br />&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public string Index() <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return &quot;Merhaba Dunya!!!&quot;; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } <br />&#160;&#160;&#160; } <br />}</font></td> </tr> </tbody></table> <br />Index() metodunu internet tarayıcısı üzerinde çağırmak istediğimizde http://localhost:40700/yazi adresini belirtmeniz yeterli olacaktır. Bize Merhaba Dünya!!! Sonucunu döndürecektir. <br /> <br /><strong>Not</strong>: localhost:40700 ‘deki 40700 port numarasıdır. Bu numara her yeni bir Asp.Net Development Server oluşturulduğunda birbirinden farklı bir biçimde oluşturulabilir. Eğer değişmesini istemiyorsanız projenin özelliklerinden statik olmasını sağlar ya da web sayfanızı localhost altına alıp hiç port numarasına gerek kalmadan kullanabilirsiniz. <br /> <br /><b><font color="#ff3300"><span class="KucukBaslik">Action Oluşturuyoruz…</span></font></b> <br /> <br />Yazımız boyunca controller sınıflarının ne işe yaradığını detaylı bir şekilde öğrendik. Şimdi ise yeni bir controller action nasıl oluşturulur, özellikleri nelerdir incelmeye çalışıyor olacağız. <br /> <br />Controller sınıfları içerisinden gelen istekler doğrultusunda işlemler action metotları ile gerçekleştirilir. Şimdi action metotlarının nasıl oluşturulabildiğini incelemeye çalışalım. <br /> <br /><b><font color="#ff3300"><span class="normal">Controller Action Ekliyoruz…</span></font></b> <br /> <br />HomeController sınıfının içerisine Index() action metodunun dışında birde MerhabaDe() action metodunu oluşturuyoruz. Şimdi bu değişikliği hemen yapalım. J <br /> <br /><strong>Controller\HomeController.cs</strong> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">using System.Web.Mvc; <br /> <br />namespace MvcApplication1.Controllers <br />{ <br />&#160;&#160;&#160; [HandleError] <br />&#160;&#160;&#160; public class HomeController : Controller <br />&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public ActionResult Index() <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return View(); <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } <br /> <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public string MerhabaDe() <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return &quot;Merhaba&quot;; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } <br />&#160;&#160;&#160; } <br />}</font></td> </tr> </tbody></table> <br />Action metot oluştururken dikkat etmemiz gereken kriterler aşağıdaki gibidir. <br /> <br />• Bu metot public(genel) olmalıdır . <br />• Metot statik olamaz. <br />• Metodun bir uzantısı olamaz. <br />• Metoda ilişkin bir yapıcı, alıcı ya da verici olamaz <br />• Metotta açık genel türleri olamaz. <br />• Bu metot controller temel alınarak hazırlanmış bir metot değildir. <br />• Metot parametreleri Ref veya out içeremez. <br /> <br />Controller action metotları geri dönüş değerleri olarak string, DateTime gibi tipleri alabilirler. Asp.Net MVC Framework string olmayan bir action metot parametresini tarayıcı tarafında string değer gönderildiği durumlarda dönüştürme işlemini yapamaz ve hata mesajı verir. <br /> <br />Action metotlarda kullanılacak parametrelerde boş değer de gelme olasılığını düşünerek tipler nullable olarak belirlenir. <br /> <br />Genel bir action metodu oluşturalım. Fakat bu oluşturma işleminde bu metoda action değilsin diyerek bir de çelişkiye sebep olduralım. Bu durumda controller ı ve action adının çağırdığımız durumda bize nasıl bir tepki vereceğine hep bir birlikte bir göz atalım. <br /> <br /><strong>Controller\SirketController.cs</strong> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">using System.Web.Mvc; <br /> <br />namespace MvcApplication1.Controllers <br />{ <br />&#160;&#160;&#160; [NoAction] <br />&#160;&#160;&#160; public class SirketController : Controller <br />&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; public string SirketSirri() <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; { <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return &quot;Bu bilgi şirket sırrıdır.&quot;; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } <br />&#160;&#160;&#160; } <br />}</font></td> </tr> </tbody></table> <br />İnternet tarayıcımızda Sirket/SirketSirri yazarak action metodumuzu çağırdığımızda nasıl bir tepki ile karşılaşacağımıza göz atalım. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak51_5.gif" /> Gördüğünüz üzere Sirket controlleri ve SirketSirri() metodu olduğu halde bize isteğiniz bulunamamaktadır gibi hata mesajı vermektedir. Bunun sebebi Action metodumuzun başına sen action değilsin dememizden kaynaklanmaktadır. <br /> <br />Bir yazımızın daha sonuna geldik. Bu yazımızı da Controller sınıflarını ve action metotlarını detaylı bir biçimde incelemeye çalıştık. <br /> <br />Herkese mutlu günler diliyorum. </font></div> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35481450-4983570210475014397?l=turhal.blogspot.com'/></div>turhaltemizerhttp://www.blogger.com/profile/14762155033738029313noreply@blogger.com0tag:blogger.com,1999:blog-35481450.post-49211454743023453502009-05-21T16:24:00.000+03:002009-05-21T20:24:29.878+03:00Asp.Net MVC Framework – Route Kavramı<div align="justify"> <font face="Verdana, Arial, Helvetica, sans-serif" size="2"> Asp.Net MVC Framework ile uygulamaların en sık kullanılan özelliklerden biridir Asp.Net Routing. Sayfa çağrımlarında ve Controller ile haberleşme esnasında kullanılmaktadır. Proje içerisinde Global.asax dosyasına eklenmektedir. MVC uygulamalarında sayfa istekleri doğrultusunda yapılan işlemler routing temeli göze alınarak gerçekleştirilmektedir.<br><br> <b><font color=#ff3300><span class="KucukBaslik">Asp.Net Route Kullanımı</span></font></b><br><br> MVC Framework ile geliştirilmiş olan web projesi şablonunda routing en temelde iki dosyada kullanılmaktadır. Bunlardan birincisi Web.config diğeri ise Global.asax dosyasındadır. Bu dosyalardan yer alan routing yapısı, son kullanıcılar tarafında yapılan istekler doğrultusunda Controller/Action/ID modelini ele alarak işlemesine olanak tanımaktadır.<br><br> Birincisi, web.config içerisinde bizlere sunulan dosyaları inceleyeceğiz. Bu bölümde Asp.Net Routing için konfigürasyonu yer almaktadır. Özellikle konfigürasyon dosyasında; system.web.httpModules ile ilgili seçimler, system.web.httpHandlers ile ilgili seçimler, system.webserver.Modules ile ilgili seçimler ve system.webServer.Handlers ile ilgili seçimler yer almaktadır. Config dosyasında yukarıda belirttiğimiz seçimleri silmemiz durumunda uzun zaman boyunca birçok işlem üzerine uğraşmamız gerekecektir. Bu sebepten ötürüdür ki silinmesi kesinlikle önerilmemektedir.<br><br> İkincisi ile uygulama içerisindeki Global.asax dosyasının içerisinde route table oluşturulmasıdır. Bu dosyada oluşturulan route yapısı Controller/Action/ID mantığını baz alarak oluşmuştur.<br><br> <strong>Global.asax</strong><br> <table border="0" cellpadding="5" cellspacing="0" width="100%" bgcolor="#FFCC66"> <tr> <td> <font face="Verdana" size="2"> ausing System;<br>using System.Collections.Generic;<br>using System.Linq;<br>using System.Web;<br>using System.Web.Mvc;<br> using System.Web.Routing;<br><br>namespace MvcApplication1<br> {<br>&nbsp;&nbsp;&nbsp;&nbsp; // Note: For instructions on enabling IIS6 or IIS7 classic mode, <br>&nbsp;&nbsp;&nbsp;&nbsp; // visit <a href="http://go.microsoft.com/?LinkId=9394801"> http://go.microsoft.com/?LinkId=9394801</a><br><br>&nbsp;&nbsp;&nbsp; public class MvcApplication : System.Web.HttpApplication<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void RegisterRoutes(RouteCollection routes)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; routes.IgnoreRoute(&quot;{resource}.axd/{*pathInfo}&quot;);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; routes.MapRoute(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;Default&quot;,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Route name<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;{controller}/{action}/{id}&quot;,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // URL with parameters<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new { controller = &quot;Home&quot;, action = &quot;Index&quot;, id = &quot;&quot; }&nbsp;&nbsp;&nbsp; // Parameter defaults<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected void Application_Start()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RegisterRoutes(RouteTable.Routes);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>} </font> </td> </tr> </table><br> MVC uygulaması ilk başlatıldığında Application_Start() metodu çağırılır. Bu metodu RegisterRoutes() metodunu çağırır. RegisterRoutes() metodunda route table oluşturulmuştur. Kısaca uygulamamız ilk başladığı andan uygulamayı durdurana kadar geçen süreçte sürekli olarak Route Table işlemi gerçekleştirilmektedir.<br><br> Varsayılan Route Table isminde “default” geçendir. Bu tek yönlü yönlendirme olarak ta gösterilmektedir. Varsayılan Route Table ilk internet penceremizin adres çubuğuna yazılacak olan url için ilk olarak controller name ‘i alır. Bir sonraki parametre olarak action ‘ı üçüncü ve son parametre olarak da id parametresini almaktadır. Daha önce değindiğimiz MVC yazılarında da görmüş olduğumuz örnekleri de hatırlarsak veri tabanından yararlanarak gösterdiğimiz verilerin detaylarını göstermek istediğimizde ilişkisel olan controller name, bu istek doğrultusunda ne tür bir işlem yapılacağına ilişkin action name gelir. En son olarak ta çağırılan kayda ilişkin id değerinden yararlanarak istediğimiz gerçekleştirmiş olur.<br><br> MVC Framework kullanarak geliştirdiğimiz projeleri çalıştırdığımızda ve herhangi bir yere istekte bulunduğumuz adres çubuğuna yazılacak olan url aşağıdakine benzeyecektir.<br><br> <strong>/Home/Index/3</strong><br><br> Yukarıdaki örneğimizi default Route map ‘i göz önüne olarak parçalara ayırırsak;<br><br> <strong>Controller = Home</strong><br> <strong>Action = Index</strong><br> <strong>Id = 87</strong><br><br> Şeklinde olacaktır.<br><br> Bu durumda yapılan istek adres çubuğunda URL/Home/Index/3 biçiminde gözükecektir. Peki bu bize programlama konusunda nasıl bir istekte bulunmuştur. En temel mvc mantığını hatırlamak gerekirse, son kullanıcı tarafında yapılan istekler yapılacak iş (action) bazlı olarak gerekli olan controller sınıfına gönderilir. Sınıflarda ilişkili metod bulunarak işlem gerçekleşir ve devam tamamlanır. Bu durumda adres çubuğunda yer alan url home controller sınıfının içerisindeki Index metodunu bulur ve aşağıdaki biçimde işleyebilmesine olanak tanır.<br><br> <strong>HomeController.Index(87)</strong> <br><br> Bu işlem sonucunda sayfada 3 nolu kayda ilişkin veriler gösterilir (Tabii bu id sonucunda gerekli değerlerin gelmesi için bir işlem yapılmışsa).<br><br> HomeController içerisinde yer alan Index() metodunu incelemek gerekirse; Yapılan istek sonucunda iki türlü istek alabilmemiz mümkündür. Bunlardan birincisi ID alanının boş olması, ikincisi ise parametre almasıdır. Varsayılan olarak parametresiz gelmektedir. Bunun sebebi herhangi bir veri olmadığı durumlarda null tip almayan bir parametre kullanılırsa hata vereceğinden ötürüdür.<br><br> Varsayılan Index metodu aşağıdaki gibidir.<br><br> <strong>Controller\HomeController.cs</strong> <table border="0" cellpadding="5" cellspacing="0" width="100%" bgcolor="#FFCC66"> <tr> <td> <font face="Verdana" size="2"> using System.Web.Mvc;<br><br>namespace MvcApplication1.Controllers<br> {<br>&nbsp;&nbsp;&nbsp; [HandleError]<br>&nbsp;&nbsp;&nbsp; public class HomeController : Controller<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public ActionResult Index()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return View();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>}</font></td> </tr> </table><br> Yukarıdaki kod parçasında da göreceğiniz üzere Index metodunda bir parametre alınmamıştır. Bu tür kullanımlarda ID istekleri es geçilerek işlem yapılacaktır.<br><br> Bir diğer kullanım seçeneği string parametre alarak kullanılmasıdır. Bu da değer gelmeme ihtimali olan durumlar için ideal bir kullanım seçeneğidir. Çünkü string te boş değer alarak işlem yapabilmektedir.<br><br> <strong>Controller\HomeController.cs</strong> <table border="0" cellpadding="5" cellspacing="0" width="100%" bgcolor="#FFCC66"> <tr> <td> <font face="Verdana" size="2"> using System.Web.Mvc;<br><br>namespace MvcApplication1.Controllers<br> {<br>&nbsp;&nbsp;&nbsp; [HandleError]<br>&nbsp;&nbsp;&nbsp; public class HomeController : Controller<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public ActionResult Index(<strong>string id</strong>)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return View();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>}</font></td> </tr> </table><br> Bu tür kullanımlarda ID parametresi boş geçildiği durumlarda String.Empty değerini alır işlemini ona göre devam ettirir. Aksi durumda değer girildiğinde ise girilen değere göre işlem yapar. <br><br> Bir diğer kullanım şekli integer bir ID parametresi kullanmaktadır. Integer kullanımını da iki şekilde değerlendirmek gerekiyor. İlk olarak nullable tipteki parametreye göz atalım.<br><br> <strong>Controller\HomeController.cs</strong> <table border="0" cellpadding="5" cellspacing="0" width="100%" bgcolor="#FFCC66"> <tr> <td> <font face="Verdana" size="2"> using System.Web.Mvc;<br><br>namespace MvcApplication1.Controllers<br> {<br>&nbsp;&nbsp;&nbsp; [HandleError]<br>&nbsp;&nbsp;&nbsp; public class HomeController : Controller<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public ActionResult Index(<strong>int? id</strong>)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return View();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>}</font></td> </tr> </table><br> Yine kullanıcı tarafında gelen istekte ID parametresinin boş geçilebilme ihtimalini düşünerek int olan id ‘yi nullable yaptık. Bu durumda eğer ki id parametresi boş gelirse bizden herhangi bir soru sormayacak ve varsayılan sayfaya yönlendirecektir. Aksi durumda ise alınan değere göre işlemi gerçekleştirecek ve bize istediğimiz sonucu sunacaktır.<br><br> Değineceğimiz son kullanım şekli integer tip alan bir parametre şekli olacaktır.<br><br> <strong>Controller\HomeController.cs</strong> <table border="0" cellpadding="5" cellspacing="0" width="100%" bgcolor="#FFCC66"> <tr> <td> <font face="Verdana" size="2"> using System.Web.Mvc;<br><br>namespace MvcApplication1.Controllers<br> {<br>&nbsp;&nbsp;&nbsp; [HandleError]<br>&nbsp;&nbsp;&nbsp; public class HomeController : Controller<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public ActionResult Index(<strong>int id</strong>)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return View();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>}</font></td> </tr> </table><br> Bu tür kullanımlarda kullanıcı tarafından yapılan istekler doğrultusunda gerekli ID parametresini uygulama değerlendirerek istediğimiz sonucu verecektir. Fakat olumsuz bir yönü olmaktadır. Eğer ki gönderilen istekte Id parametresi yok ise sorun ile karşı karşıya kalmış bulunuyoruz. MvcAction sınıfı null tipleri kabul etmemektedir. Bu sebepten ötürü de kullanıcılar tarafında id parametresi boş olan bir istek gönderildiğinde uygulamamız hata verecektir. Hata mesajında ise yukarıda da belirttiğimiz gibi “<em>kullandığınız tipin null değer alabilmesi gerekmektedir. Eğer ki bu tipi kullanmaya devam etmek istiyorsanız nullable bir tip kullanınız</em>” şeklinde bir mesaj alacağız.<br><br> <img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak49_1.gif"><br><br> Genel olarak ilk konumuzu toparlamak gerekirse; MVC şablonu ile geliştirilen projeler sayfa yönlendirme işlemleri Asp.Net Routing ile yaptıklarını, web.config ve Global.asax içerisinde bilgilerinin tutulduğunu ve son olarak ta routing ‘e talepte bulunan metotların alabileceği tipleri incelemeye çalıştık.<br><br> <strong>Not:</strong> Yaptığınız işlemler sonucunda hala parametre almıyor ya da sayfa bulunamadı hatası veriyorsa oluşturduğunuz controller sınıfına ilişkin view ‘ı oluşturarak sorunu çözebilirsiniz.<br><br> <b><font color=#ff3300><span class="KucukBaslik">Custom Routing Oluşturma</span></font></b><br><br> MVC patterninin ile gelen en temel özelliklerinden biri olan Asp.Net Routingin temel olarak nasıl kullanılacağını detaylı olarak inceledik. Şimdi değineceğimiz konu ise bize sunulan Controller/Action/ID routing map ‘inin dışında harici bir routing ‘i nasıl oluşturacağımızdır. <br><br> Web uygulamaları geliştirirken kesinlikle sürekli olarak id parametresine göre işlem yapmayız. Başka bir yapı için başka bir parametre üzerinde de işlem yapabilmemiz mümkündür. Örneğin, makalelerin yayınlandığı bir topluluk sitesini düşünelim ve biz bu makaleleri id bazlı değil de tarih bazlı göstermek istiyoruz. Bu durumda MVC ‘nin bize varsayılan olarak sunduğu yapı işimize yaramayacaktır. Farklı çözümler üretmemiz gerekecektir. Bu durumda yapmamız gereken kendimize ayrı bir route map oluşturmak olacaktır.<br><br> Bu işlemi diğer route maplerinde bir arada olduğu Global.asax dosyası üzerinde gerçekleştireceğiz.<br><br> Gerçekleşecek işlem sonucunda <em>Arsiv/25-12-2009</em> ‘u internet penceremizde adres satırına eklediğimizde istediğimiz karşılanmış ve sayfa getirilmiş olacaktır. Fakat unutulmaması gereken bir konu vardır ki tarihi DateTime tipinden çağıracağımız için tam olarak uygun bir veriyi uygulamaya göndermemiz gerekecektir.<br><br> Kendimize özel routing map eklediğimiz global.asax dosyası aşağıdaki gibi olacaktır.<br><br> <strong>Global.asax</strong><br> <table border="0" cellpadding="5" cellspacing="0" width="100%" bgcolor="#FFCC66"> <tr> <td> <font face="Verdana" size="2"> ausing System;<br>using System.Collections.Generic;<br>using System.Linq;<br>using System.Web;<br>using System.Web.Mvc;<br> using System.Web.Routing;<br><br>namespace MvcApplication1<br> {<br>&nbsp;&nbsp;&nbsp;&nbsp; // Note: For instructions on enabling IIS6 or IIS7 classic mode, <br>&nbsp;&nbsp;&nbsp;&nbsp; // visit <a href="http://go.microsoft.com/?LinkId=9394801"> http://go.microsoft.com/?LinkId=9394801</a><br><br>&nbsp;&nbsp;&nbsp; public class MvcApplication : System.Web.HttpApplication<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void RegisterRoutes(RouteCollection routes)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; routes.IgnoreRoute(&quot;{resource}.axd/{*pathInfo}&quot;);<br> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>routes.MapRoute(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;Makale&quot;,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;</strong><strong>Arsiv/{</strong><strong>yayinlanmaTarihi}&quot;,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new { controller = &quot;Arsiv&quot;, action = &quot;Tarih&quot; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</strong><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; routes.MapRoute(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;Default&quot;,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Route name<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;{controller}/{action}/{id}&quot;,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // URL with parameters<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new { controller = &quot;Home&quot;, action = &quot;Index&quot;, id = &quot;&quot; }&nbsp;&nbsp;&nbsp; // Parameter defaults<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected void Application_Start()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RegisterRoutes(RouteTable.Routes);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>} </font> </td> </tr> </table><br> Makaleler uygulamamız için gerekli olacak route map oluşturulmuş durumdadır. Artık istediğimiz bir controller sınıfında oluşturacağımız metotlar yardımı ile bunu kullanabiliriz. Kullanabileceğimiz örnek adres tiplerini yazmak gerekirse;<br><br> Arsiv/10-12-2009 <br> Arsiv/19-07-1987<br> Arvis/MVC<br><br> Örnek olarak değerlendirilebilir. Fakat biz route ‘ı DateTime tipinden çağıracağımızı belirttiğimiz için Arsiv/MVC adresinde hata almamız yüksek ihtimaldir.<br><br> ArsivController.cs isimli controller sınıfımızı oluşturarak aşağıdaki metodu oluşturuyoruz.<br><br> <strong>Controller\ArsivController.cs</strong><br> <strong>Controller\HomeController.cs</strong> <table border="0" cellpadding="5" cellspacing="0" width="100%" bgcolor="#FFCC66"> <tr> <td> <font face="Verdana" size="2"> using System.Web.Mvc;<br><br>namespace MvcApplication1.Controllers<br> {<br>&nbsp;&nbsp;&nbsp; [HandleError]<br>&nbsp;&nbsp;&nbsp; public class HomeController : Controller<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public string Tarih(DateTime? yayinlanmaTarihi)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "Makalenizin yayinlanma tarihi" + yayinlanmaTarihi.ToString();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>}</font></td> </tr> </table><br> Metod yardımıyla route ‘ı kullanabilmemiz mümkündür. Adres çubuğuna yanlış bir değer girmemiz durumunda ise girdiğimiz değeri dönüştüremeyeceğine ilişkin hata mesajını verecektir. Ayrıca null tip almasına karşında DateTime tipini nullable olarak belirtmemiz gerekmektedir.<br><br> <img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak49_2.gif"><br><br> DateTime tipinin dışında ve boş girdiğimiz değerlerde bize bu hata mesajını verecektir. Boş değer girdiğimiz zaman hata vermesini önlemek amacıyla yapmamız gereken en basit işlem nullable tip kullanmak olacaktır. Bu işlem sonucunda boş girdiğimiz anlar için hata mesajından kurtulmuş olacağız.<br><br> Routing i daha aktif bir şekilde kullanmamız ActionResult sınıfını da kullanarak işlemi yapmaktadır. Gerekli veri tabanı veya diğer işlemleri gerçekleştirdiğimizde bize gerekli sayfaya yönlendirir. Bu işlemler sonucunda da oluşturduğumuz custom routing yapıyı daha iyi kullanabilmemiz mümkün olacaktır.<br><br> <strong>Not:</strong> Yaptığınız işlemler sonucunda hala parametre almıyor ya da sayfa bulunamadı hatası veriyorsa oluşturduğunuz controller sınıfına ilişkin view ‘ı oluşturarak sorunu çözebilirsiniz.<br><br> <b><font color=#ff3300><span class="KucukBaslik">Route Oluşturma Kısıtları</span></font></b><br><br> Yazımızda şu ana kadar Route genel yapısını ve kendimize özgü route ları nasıl oluşturabileceğimizi incelemeye çalıştık. <br><br> Route table oluşturmak istediğimizde projemizin içerisinde yer alan global.asax dosyasının içerisine oluşturuyoruz. Ayrıca bu dosya içerisinde varsayılan olarak işlemlerimizde kullanmak üzere route map yer almaktadır. Şimdi ise route map oluştururken dikkat etmemiz gereken noktalara değinmeye çalışacağız.<br><br> İnternet tarayıcımız üzerinden istekte bulunduğumuzda işlemleri algılaması için gerekli yazım kuralları vardır. İlk olarak bu kurallara göz atalım.<br><br> <strong>Global.asax<br></strong> <table border="0" cellpadding="5" cellspacing="0" width="100%" bgcolor="#FFCC66"> <tr> <td> <font face="Verdana" size="2"> ausing System;<br>using System.Collections.Generic;<br>using System.Linq;<br>using System.Web;<br>using System.Web.Mvc;<br> using System.Web.Routing;<br><br>namespace MvcApplication1<br> {<br>&nbsp;&nbsp;&nbsp;&nbsp; // Note: For instructions on enabling IIS6 or IIS7 classic mode, <br>&nbsp;&nbsp;&nbsp;&nbsp; // visit <a href="http://go.microsoft.com/?LinkId=9394801"> http://go.microsoft.com/?LinkId=9394801</a><br><br>&nbsp;&nbsp;&nbsp; public class MvcApplication : System.Web.HttpApplication<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void RegisterRoutes(RouteCollection routes)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; routes.IgnoreRoute(&quot;{resource}.axd/{*pathInfo}&quot;);<br> <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>routes.MapRoute(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;Urun&quot;,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;Urun/{urunId}&quot;,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new { controller = &quot;Urun&quot;, action = &quot;Detay&quot; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );</strong><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; routes.MapRoute(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;Default&quot;,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Route name<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;{controller}/{action}/{id}&quot;,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // URL with parameters<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new { controller = &quot;Home&quot;, action = &quot;Index&quot;, id = &quot;&quot; }&nbsp;&nbsp;&nbsp; // Parameter defaults<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected void Application_Start()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RegisterRoutes(RouteTable.Routes);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>} </font> </td> </tr> </table><br> Yukarıda verdiğimiz kod bloğu yardımıyla kısıtlarımızı açıklamaya başlayalım. İlk kısıdımız route ismi ile ilgili. Örneğimiz için route ismi Urun ‘dür. Urun ‘u controller sınıfının isminden almaktadır. UrunController isimli controller sınıfının adı olan Urun kullanılmaktadır.<br><br> <strong>Controller\UrunController.cs</strong> <table border="0" cellpadding="5" cellspacing="0" width="100%" bgcolor="#FFCC66"> <tr> <td> <font face="Verdana" size="2"> using System.Web.Mvc;<br><br>namespace MvcApplication1.Controllers<br> {<br>&nbsp;&nbsp;&nbsp; [HandleError]<br>&nbsp;&nbsp;&nbsp; public class HomeController : Controller<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public ActionResult Detay(<strong>int urunId</strong>)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return View();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>}</font></td> </tr> </table><br> Controller sınıfının içerisinde Route ile map edilmesi için hazırlanan metoda dikkat edelim. Bu tür metotların oluştururken dikkat etmemiz gereken en temel koşul route table belirttiğimiz yolların tam olarak eşleşmesidir. Oluşturulan metodun adı ile route map de belirtmiş olduğumuz action ‘nın aynı olması ve action ile belirtilen şu parametre ile gelecek denilen değerinde aynı olması gerekmektedir. Bu tür hazırlanmış örnek yukarıdaki kod parçasında yer almaktadır.<br><br> Bu işlemlerimiz sonucunda internet penceremizin adres çubuğuna;<br><br> &bull; URL/Urun/3<br> &bull; URL/Urun/9<br> &bull; URL/Urun/12121<br><br> Kabul edilirken,<br><br> &bull; URL/Urun/Araba<br> &bull; URL/Urun/10–10–2008<br><br> Kabul görmemektedir. Kabul görmeyen parametrelerden biri ile uygulamamızı denersek aşağıdaki gibi bir sonuç ile karşılaşırız.<br><br> <img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak49_3.gif"><br><br> Hatalı parametre girdiğimiz durumda “girdiğiniz parametreyi dönüştüremiyorum, parametre sonucunda parametrenize boş değer dönüyor” gibi bir mesaj vermektedir. Boş değer girme sorununu parametrenin tipini nullable girerek çözebiliriz. <br><br> <strong>Not:</strong> Yaptığınız işlemler sonucunda hala parametre almıyor ya da sayfa bulunamadı hatası veriyorsa oluşturduğunuz controller sınıfına ilişkin view ‘ı oluştururak sorunu çözebilirsiniz.<br><br> Yazımız boyunca MVC Framework 'te sıklıkla kullanılan Asp.Net Routing yapısını detayları ile incelemeye çalıştık.<br><br> Herkese mutlu günler diliyorum. </font> </div> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35481450-4921145474302345350?l=turhal.blogspot.com'/></div>turhaltemizerhttp://www.blogger.com/profile/14762155033738029313noreply@blogger.com0tag:blogger.com,1999:blog-35481450.post-66194177917248307752009-05-21T14:19:00.000+03:002009-05-21T20:20:21.658+03:00Visual Studio 2010 Beta1 – Kurulum ve Genel Bakış<p align="justify"><font face="verdana">Gün içerisinde çalışmanın dışında bir de Visual Studio 2010 ‘u kurmakla zaman harcadım. Web installer versionu ile kurduğum VS ‘in kurulum ile ilgili ekran görüntülerini size yazının devamında sunuyor olacağım. Bir çok yenilikle bizlere sunulacak olan VS2010 ilk Beta1 sürümü ile karşımızda. F# ‘tan paralel programlamaya ide güncellemesine kadar nice yeni özelliklerle biz yazılımlacıları mutlu etmeye geliyor.</font></p> <p align="justify"><font face="verdana">Kurulum aşaması;</font></p> <p align="justify"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="yeni1" border="0" alt="yeni1" src="http://lh4.ggpht.com/_iDpLJsj9ybc/ShWNQOtiz5I/AAAAAAAAAwI/TMAuolvo33g/yeni1%5B4%5D.gif?imgmax=800" width="536" height="410" /> </p> <p align="justify"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="yeni2" border="0" alt="yeni2" src="http://lh4.ggpht.com/_iDpLJsj9ybc/ShWNRBtimUI/AAAAAAAAAwM/iQ4Spz_bUjo/yeni2%5B4%5D.gif?imgmax=800" width="536" height="410" /> </p> <p align="justify"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="yeni3" border="0" alt="yeni3" src="http://lh5.ggpht.com/_iDpLJsj9ybc/ShWNSJu_6dI/AAAAAAAAAwQ/rJVA_b4XtIk/yeni3%5B4%5D.gif?imgmax=800" width="536" height="410" /> </p> <p align="justify"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="yeni4" border="0" alt="yeni4" src="http://lh4.ggpht.com/_iDpLJsj9ybc/ShWNS1WHX4I/AAAAAAAAAwU/0M5x3pOkKS0/yeni4%5B4%5D.gif?imgmax=800" width="536" height="410" /> </p> <p align="justify"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="yeni5" border="0" alt="yeni5" src="http://lh5.ggpht.com/_iDpLJsj9ybc/ShWNTuXJq4I/AAAAAAAAAwY/nc1KINg6R8I/yeni5%5B4%5D.gif?imgmax=800" width="460" height="350" /> </p> <p align="justify">Yukarıdaki işlemler sonucunda uygumala kurulmuş oluyor. Kurulum sonrası bizi karşılayan ekrandaki değişiklik oldukça köklüdür.</p> <p align="justify"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="yeni6" border="0" alt="yeni6" src="http://lh4.ggpht.com/_iDpLJsj9ybc/ShWNUHGKZAI/AAAAAAAAAwc/jZe4Eqb8fXI/yeni6%5B4%5D.gif?imgmax=800" width="576" height="347" /> </p> <p align="justify"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="yeni7" border="0" alt="yeni7" src="http://lh6.ggpht.com/_iDpLJsj9ybc/ShWNVHigQUI/AAAAAAAAAwg/p9McwhIhhOE/yeni7%5B4%5D.gif?imgmax=800" width="478" height="308" /> </p> <p align="justify">Zaman içerisinde daha detaylı bilgi vereceğim.</p> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35481450-6619417791724830775?l=turhal.blogspot.com'/></div>turhaltemizerhttp://www.blogger.com/profile/14762155033738029313noreply@blogger.com0tag:blogger.com,1999:blog-35481450.post-78759857227354814882009-05-20T23:43:00.001+03:002009-05-20T23:43:32.662+03:00Visual Studio 2010 Beta1 Download<p align="justify"><font size="2" face="Verdana">Visual Studio 2010 ‘nun Beta1 sürümü 8 mayıs itibari ile msdn üyelerine sunulmuştu. Bugün itibari ile de bizlerin indirebilmesi için Microsoft ‘un download bölümüne eklenmiştir. Vereceğimiz link yardımı ile uygulamayı indirdikten sonra bilgisayarınıza kurabilmeniz mümkündür.</font></p> <p align="justify"><a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=75cbcbcd-b0e8-40ea-adae-85714e8984e3" target="_blank"><font size="2" face="Verdana">Visual Studio 2010 Prof. Beta1 Download</font></a></p> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35481450-7875985722735481488?l=turhal.blogspot.com'/></div>turhaltemizerhttp://www.blogger.com/profile/14762155033738029313noreply@blogger.com0tag:blogger.com,1999:blog-35481450.post-29507876228248464952009-05-20T22:41:00.000+03:002009-05-20T23:20:38.289+03:00Microsoft Office 2010 – Technical Preview<p align="justify">Bugün bilgisayarıma Office 2010 ‘un CTP sürümünü kurmaya başladım. Kurulum esnasında Office 2007 ‘i koruyarak kurmasını istediğimde kabul etmemişti fakat yine de office uygulamalarının CTP uygulamalarının bile tam sürümlerine yakın kalitede olmasından ötürü her daim kurmayı tercih ederim. Bu sebepten ötürü de hiç düşünmeden kurmayı tercih ettim. Yazının devamında kurulum aşamalarını ve ürünlerin ekran görüntülerini görüyor olacaksınız.</p> <p align="justify"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="1" border="0" alt="1" src="http://lh5.ggpht.com/_iDpLJsj9ybc/ShRgqzIRkGI/AAAAAAAAAvs/ja9SlRFosHA/14.gif?imgmax=800" width="438" height="357" /> </p> <p align="justify"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="2" border="0" alt="2" src="http://lh6.ggpht.com/_iDpLJsj9ybc/ShRgrpcr0tI/AAAAAAAAAvw/-wcU0VnDUEA/24.gif?imgmax=800" width="438" height="357" /> </p> <p align="justify">Yukarıda gördüğünüz işlemler sonrasında kurulum aşaması gerçekleşmektedir.</p> <p align="justify"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="3" border="0" alt="3" src="http://lh6.ggpht.com/_iDpLJsj9ybc/ShRmBI4lVWI/AAAAAAAAAv0/JPXFQ8R7FXo/3%5B4%5D.gif?imgmax=800" width="438" height="357" /> </p> <p align="justify">Kurulum işlemi tamamlandıktan sonra başlat menüsüne klasik olarak uygulamanın kısa yolları eklenmektedir.</p> <p align="justify"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="7" border="0" alt="7" src="http://lh3.ggpht.com/_iDpLJsj9ybc/ShRmCWXhyvI/AAAAAAAAAv4/GEXsZDfNuNk/7%5B4%5D.gif?imgmax=800" width="406" height="508" /> </p> <p align="justify">Aşağıdaki örneklerden de görebileceğiniz üzere Office 2010' ‘da ürünlerin başlama anındaki ekranları da güncellenmiş.</p> <p align="justify"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="4" border="0" alt="4" src="http://lh4.ggpht.com/_iDpLJsj9ybc/ShRmDDzHSMI/AAAAAAAAAv8/yHLyFrtdBoY/4%5B4%5D.gif?imgmax=800" width="500" height="335" /> </p> <p align="justify">Word 2010 için</p> <p align="justify"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="5" border="0" alt="5" src="http://lh3.ggpht.com/_iDpLJsj9ybc/ShRmEIfGO2I/AAAAAAAAAwA/vvenEmfAT5U/5%5B4%5D.gif?imgmax=800" width="500" height="335" /> </p> <p align="justify">Word 2010 için özellikler menü ekranı</p> <p align="justify"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="6" border="0" alt="6" src="http://lh5.ggpht.com/_iDpLJsj9ybc/ShRmFFZo11I/AAAAAAAAAwE/iM-l5ImkqrQ/6%5B4%5D.gif?imgmax=800" width="644" height="414" /> </p> <p align="justify">Genel olarak ilk görüntülerimiz bu şekildedir. Zaman içerisinde size ekran görüntülerini sunuyor olacağım.</p> <p align="justify">İyi çalışmalar…</p> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35481450-2950787622824846495?l=turhal.blogspot.com'/></div>turhaltemizerhttp://www.blogger.com/profile/14762155033738029313noreply@blogger.com0tag:blogger.com,1999:blog-35481450.post-71249170866236166962009-05-19T19:01:00.000+03:002009-05-20T00:02:18.097+03:00Cloud Computing & Windows Azure - Genel Bilgiler ve Projelerin Yayınlanması<div align="justify"><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Son bir yıldır hem Microsoft tarafından hem de Sun şirketleri tarafından web uygulamalarında yeni bir yaklaşıma gidildiğini ve bu yaklaşımın adını da Cloud mimarisi olduğu söylenmektedir. Peki, internet dünyasında performans ve diğer bazlı faktörler konusunda nasıl bir eksiklik vardı da büyük yazılım şirketleri yeni bir teknoloji arayışı içine girdi. <br /> <br />İnternet kullanım hızlarının artması ile artık internet üzerinden canlı televizyon yayınları, yüksek çözünürlükte resim ve video görüntüleme, boyutu büyük veriler ile çalışan web sayfaları ve daha birçok uygulama bizlerin kullanımına sunuluyor. Peki bu kullanım esnasında tek bir server ihtiyacımızı karşılayabilecek mi? İlk akla gelen cevap “evet, karşılıyor” olur. Fakat web sayfalarının günlük maksimum veri transferi genişliğini aştıklarında işte sorun ile karşı karşıyayız anlamına geliyor. Normalde nasıl bir adım izleriz. İlk olarak, gider daha büyük kapasiteli bir sunucu satın alır ya da kiralar yayınımıza öyle devam ederiz. O da yetmedi ve artık kendi bütçemizin en yüksek kapasitesine de ulaşmış durumdayız. Artık yapmamız gereken birçok sunucuya gelen istekleri yaymak ve yayınımızı ona göre sürdürmek olacaktır. Bu da yüksek bir maliyete sebep olmaktadır. Bir de farklı bir açıdan daha düşünelim. YouTube gibi video büyük video paylaşım sistemlerini örnek alarak bizde böyle bir sistem oluşturmaya karar verdiğimizi düşünelim. İlk olarak ne yaparız. *.wmv uzantılı dosyaları Media Player plug-in ‘ini kullanarak video yayını yaparız. Fakat bu görüntüleme yalnızca Windows işletim sistemi kullanıcıların isteklerini karşılayacak ve diğer işletim sistemi kullanıcıları için video izlenemeyecek. Kullanmamız gerektiğini açıklayan birinci sebep bu. İkincisi ile video yüklenme şekli. Media Player plug-in kullanarak hazırlanmış olan bir video görüntüleyebilmek için geçen yüklenme zamanının yüksekliği. Alternatif çözüm olarak Flash animasyon kullanımını düşünebilir. Fakat o da diğer yöntemimiz gibi yüklenme zamanı zorlukları ve diğer faktörlerden ötürü yavaş çalışan bir sistemdir. ( YouTube gibi sistemlerin Flash animasyon kullanarak video gösterdiğini unutmadık. Fakat bu tür sistemler bu işlemler için bizim ileriki konularda anlatacak olduğumuz yapının benzerini kullanarak görüntülemeyi gerçekleştirmektedirler.) Bir başka alternatif çözümümüz de Microsoft Silverlight ‘tır. Platform bağımsızlığı ve diğer faktörler sebebiyle streaming işlemlerinde oldukça iyi bir çözüm sunmaktadır. Daha fazla ince detaylara girmeden Cloud mantığının ne olduğuna bir göz atalım. <br /> <br /><b><font color="#ff3300"><span class="KucukBaslik">Cloud Computing Nedir?</span></font></b> <br /> <br />Cloud Computing’ i açıklamak gerekirse; bir ağ yapısı kullanılarak, sadece Internet Explorer gibi bir program ile bütün uygulamalarınızı işlemci gerektiren, depolama alanı gerektiren bütün dosyalarınızı ana bir bilgisayarda tutarak, gerçek işinize odaklanmak. Bu işlemleri de yaparken, kullandığınız kaynakların ücretini ödemek, kullanmadığınız kaynaklara boşuna para yatırmamak. <br /> <br />Bu tanımı biraz daha açıklamak gerekirse, standart bir bilgisayar kullanıcısı olduğumuzu bilgisayarı yalnızca internete girmek, müzik dinlemek ve film izlemek için kullandığımızı varsayalım. Bu işlemleri yapmak için çok yüksek kapasiteli bir bilgisayar almanın bir anlamı yoktur. Çok iyi bir grafik tasarım mı yapacağız? Hayır. Oyun mu oynayacağız? Hayır. Bu durumda çok yüksek maliyette bir sistem kurup onu kullanmak bizim için gereksiz bir yatırım olacaktır. Cloud mantığını da bu şekilde düşünmemiz gerekmektedir. İnternet üzerinde sadece 10 mb lik bir alan kullanacaksak çok yüksek kapasiteleri kiralayıp da onu kullanmak tamamen gereksiz olacaktır. Ya da kullanılan bir işletim sistemine virüs girdi. Eğer biz kontrol ediyor olsaydık zaman kaybına sebep olacak bir çok işlem ile uğraşmak zorunda kalacaktık. Fakat diğer durumda yapmamız gereken bize ait olan dosyaları yedekleyip diğer tarafı bize sistemi sağlayanlara bırakmak olacaktır. <br /> <br />Kısaca Cloud mantığının bizlere kattıklarına göz atmak gerekirse; <br /> <br />• Maliyet <br />• Kullanım kolaylığı <br />• Güvenlik <br />• Ölçeklenebilirlik <br />• Sürdürülebilirlik <br /> <br />Şeklinde sıralayabilmemiz mümkündür. <br /> <br />Peki, bu mantığa gelene kadar ne programlama yapıları ile uğraştığımızı kısaca hatırlamak gerekirse; <br /> <br />• Prosedür temelli programlama <br />• Nesne temelli programlama <br />• COM temelli programlama, <br />• Servis temelli programlama <br />• Bulut Temelli Programlama <br />Servis temelli programlama çıktıktan ve Bulut temelli programlamanın temelini oluşturan Software as Service (SaaS) mantığı bizim yazılımlarımızı komple bir paket değil de parçalar olarak kullanabilmemize olanak tanıyan bir yapıdır. <br /> <br /><b><font color="#ff3300"><span class="KucukBaslik">Windows Azure</span></font></b> <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak48_1.gif" /> <br />Azure aslında bir servis platformudur. Azure servis platformu Microsoft ‘un kendi veri merkezlerinde sunulan, internet seviyesinde Cloud Computing uygulamasıdır. Bu ortam Web geliştiricilerine yada başka cihazlar için geliştirme yapanlara gelişmiş bir platform sunar ve hibrid uygulamalar geliştirilmesine izin verir. <br /> <br />Azure ile geliştirilen uygulamalar daha hızlı ve daha az maliyetle geliştirilmesine olanak tanır. Azure ile uygulama geliştirmek istersek her zaman kullandığımız Visual Studio geliştirme ortamımızı ve .Net çekirdeğini kullanmamız yeterli olacaktır. Azure uygulamaları günümüzde gittikçe yaygınlaşan “kullan ve öde” yani kiralama modeline de uyumlu uygulamalar geliştirilmesine olanak tanımaktadır. Azure aynı zamanda açık ve belirli standartları temel alır, http, SOAP, REST ve XML teknolojileri temel olarak desteklenmektedir. <br /> <br />Azure Servis Mimarisi, en temelde Windows Azure ‘un olduğu bir yapıdır. Daha üst katmanlara çıktıkça kullanabileceğiniz servis platformlarının sağladığı <strong>Live Servisler, .Net Servisleri </strong>ve <strong>SQL Servislerini</strong> sunar. En üst katmanda ise daha özel amaçlarda kullanılan <strong>Exchange Servisleri, SharePoint Servisleri, Dynamics </strong>yer alır. <br /> <br /><b><font color="#ff3300"><span class="normal">Windows Azure Nedir?</span></font></b> <br /> <br />Azure’ un, yazılımcılar için geliştirme, servis bulundurma, servis yönetimi gibi ortamlarını oluşturabilmek amacıyla geliştirilmiştir. Visual Studio ile entegre bir biçimde anlık hesaplamaların internet ortamında bulundurulmasına, ölçeklendirilebilmesine ve yönetme bazında kullanılmasına olanak tanır. Windows Azure açık bir sistem olacağından şu anda Visual Studio ile yazılan yönetilebilir kodları (.Net ve CLR kullanan) desteklerken, ileride Microsoft un olmayan dilleri ve geliştirme platformlarını da destekleyecektir. Kısacası Windows Azure, Microsoft un Cloud Computing dünyasını ayakta tutmak için geliştirdiği İşletim sistemidir, şu anda sadece barındırma işlemleri yapabilmek adına geliştirilmektedir. <br /> <br /><strong>Live Servisleri Nedir?</strong> <br /> <br />Azure ‘un servis ortamında kullanıcıların verileri ve uygulama kaynaklarını kullanmaları için geliştirilmiş bir uygulamadır. Live servisleri ile gelişmiş uygulamalar, sosyal ağlar, kullanıcı deneyimleri gibi dijital ortamları kullanmanıza olanak sağlar, Live servisleri genelde web tabanlı uygulama geliştirmeye olanak tanıdığı için Azure ile kullanıldığında çok başarılı çözümler sunabilecektir. <br /> <br /><strong>Microsoft SQL Servisleri Nedir?</strong> <br /> <br />Microsoft SQL Servisleri, Microsoft SQL Server ‘in yeteneklerini ile Web tabalı Cloud Computing işlemlerini yapmamızı sağlayacak ilişkili veri tabanı hizmetidir. Bu servislerle ilişkili olarak sorgular yapmamızı, arama, veri eşleştirmesi yapabilmemizi sağlarken, bu işlemleri hem mobil kullanıcılarında hem de uzak bağlantı yardımıyla şirket ağlarına bağlı olarak çalışanlar için kullanabilmemiz mümkündür. <br /> <br /><strong>Microsoft .Net Servisleri Nedir?</strong> <br /> <br />Microsoft .Net Servisleri, Cloud tabanlı uygulamaları kolayca geliştirebilmemiz mümkündür. Bu servisler yardımıyla güvenli kod yazımı, erişim denetleyicileri kullanmamızı olanak tanımaktadır. Ayrıca bizlerin istediği özel servislerinde Cloud mantığında oluşturabilmemize olanak tanımaktadır. <br /> <br /><strong>SharePoint ve CRM servisleri Nedir?</strong> <br /> <br />Yazılım geliştiriciler, SharePoint ve CRM için kullandıkları ortamda, müşteri bilgisini ortak bir yerde tutup kullanabilmelerine olanak tanınacaktır. Bu esneklik ile Visual Studio kullanarak geliştiriciler tarafından bilinen ve aşina olunan yöntemler yardımıyla hızlıca uygulama geliştirilebilecektir. SharePoint, CRM ve daha sonra çıkacak yazılımların yetenekleri ile yazılımcıların kendi işlemlerine odaklanırken diğer işlemleri bu uygulamaları kullanarak çok daha gelişmiş ve hızlı uygulamaları Azure sisteminde yazabileceklerdir. <br /> <br />Windows Azure ve bu yapı üzerine oluşturulmuş servisleri grafiksel olarak açıklayan güzel bir resmi aşağıda görebilirsiniz. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak48_2.gif" /> <br /><b><font color="#ff3300"><span class="KucukBaslik">Windows Azure ve Cloud Computing ile Uygulama Geliştirme</span></font></b> <br /> <br />Windows Azure ve Cloud Computing ‘i detaylı bir şekilde açıklamaya çalıştık. Şimdi ise Uygulamaları nasıl geliştireceğimize göz atmaya çalışacağız. <br /> <br />Azure ile uygulama geliştirmeyi Visual Studio 2008 + SP1 ve Azure SDK yüklü olan bir bilgisayar üzerinde gerçekleştireceğiz. <br /> <br />Visual Studio 2008 yukarıda belirttiğimiz şartlar doğrultusunda hazırlandıktan sonra artık ilk uygulamamızı geliştirmek için hazır bulunuyoruz. File-&gt; New Project yolundan sonra karşımıza gelen ekrandan <strong>Cloud Service</strong> seçeneğini seçtikten sonra karşımıza gelen şablonlardan <strong>Web Cloud Service </strong>seçeneğini seçerek uygulamamızı oluşturuyoruz. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak48_3.gif" /> <br /> <br />Oluşturulan projenin içerisinde servis rolleri başta olmak üzere bazı klasörler oluşmaktadır. Bunların ne olduğuna göz atmak gerekirse; <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak48_4.gif" /> <br /> <br />Oluşturulan iki projeden birincisi Cloud Servistir. Bu proje üzerinde Web üzerinde uygulanacak olan roller, <strong>*.cscfg</strong> uzantılı <em>Cloud Service Configuration</em> dosyası, <strong>*.csdef</strong> uzantılı <em>Cloud Service Defination</em> dosyası bulunmaktadır. Bir diğer proje ise rol tabanlı olarak çalışan bir web projesidir. <br /> <br />Şimdi Default.aspx dosyasını açarak içerisine bir tane Label kontrolü ekliyoruz. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak48_5.gif" /> <br /> <br />Sonrasında ise Label kontrolünün text özelliğine istediğimiz bir değer atıyoruz. <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana"><strong>Label1.Text = “Hello Windows Azure”;</strong> </font></td> </tr> </tbody></table> <br />Daha sonra projemizin çalıştığı zaman dosya bazlı rollerini belirlemek için <strong>ServiceConfiguration.cscfg </strong>dosyasını açarak Instance yazan satırdaki 1 değerini 2 olarak değiştiriyoruz. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak48_6.gif" /> <br /> <br />Projemizi derledikten sonra debug modda çalıştırdığımızda bize nasıl bir tepki verdiğine göz atalım; <br /> <br />Eğer ki uygulamamız normal bir şekilde derlendiyse bize <strong>Development Storage</strong> ve<strong> Development Fabric</strong> otomatik olarak çalıştırılmaktadır. <br /> <br /><strong>Not: </strong>Eğer ki bilgisayarınızda <strong>development storage</strong> çalışırken hata verdiyse aşağıdaki işlemi uygulayarak çalışır duruma getirebilirsiniz. <br /> <br />Windows Azure Mart SDK ‘sını bilgisayarımıza kurduğumuzda varsayılan sql server olarak <strong>.\SqlExpress</strong> gelmektedir. Eğer ki faklı bir sql instance ‘ı kullanıyorsak ve Development Storage ‘ı kullanmak istediğimizde bizlere “Sql instance ‘ın da bir SQL Server bulamadım.” mesajını verecektir. Bu durumda yapmamız gereken Azure SDK ‘nın kurulu olduğu klasöre giderek DevelopmentStorage ‘ı buluruz. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak48_9.gif" /> <br /> <br />Yukarıdaki ekranı çıkarmak için DevelopmentStorage uygulamasının üzerinde sağa tıklayıp özellikler seçeneğine basarsak elde edebilirsiniz. <br /> <br />Karşımıza çıkan ekranda <strong>DevelopmentStorage.exe</strong> ‘yi çift tıklayarak ister not defterinde ister Visual Studio ‘da isterseniz de başka herhangi bir metin düzenleyici de açabilirsiniz. Düzenlemelerimizi .\SqlExpress yazan yerlerde yapacağız. <br /> <br />Değiştirilecek yerler: <br /> <br /> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">&lt;connectionStrings&gt; <br />&#160;&#160;&#160; &lt;add name=&quot;DevelopmentStorageDbConnectionString&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; connectionString=&quot;Data Source=<strong>.\SqlExpress;</strong>Initial Catalog=DevelopmentStorageDb;Integrated Security=True&quot; providerName=&quot;System.Data.SqlClient&quot; /&gt; <br />&lt;/connectionStrings&gt;</font></td> </tr> </tbody></table> <br /> <table border="0" cellspacing="0" cellpadding="5" width="100%" bgcolor="#ffcc66"><tbody> <tr> <td><font size="2" face="Verdana">&lt;services&gt; <br />&#160;&#160;&#160; &lt;service name=&quot;Blob&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160; url=&quot;http://127.0.0.1:10000/&quot;/&gt; <br />&#160;&#160;&#160; &lt;service name=&quot;Queue&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160; url=&quot;http://127.0.0.1:10001/&quot;/&gt; <br />&#160;&#160;&#160; &lt;service name=&quot;Table&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160; url=&quot;<a href="http://127.0.0.1:10002/">http://127.0.0.1:10002/</a>&quot; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; dbServer=&quot;<strong>localhost\SqlExpress</strong>&quot;/&gt; <br />&lt;/services&gt;</font></td> </tr> </tbody></table> <br />Yukarıda config dosya içersinde yer alan .\SqlExpress ‘leri kendimize uygun bir şekilde değiştirdiğimizde artık uygulamamız çalışır duruma geliyor. Sonrasında da bize aşağıdaki gibi bir ekran sunarak artık servislerimizi yönetebilmemize olanak tanıyacaktır. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak48_10.gif" /> <br /> <br />Development Fabric ‘i incelersek bize rollerimizin başladığını ve servis detaylarımızı göstermektedir. Biz biraz önce config dosyasında yaptığımız değişiklikle iki tane rolün çalışmasını istemiştik. Çalıştırılan rolleri Developemnt Fabric üzerinde görebilmemiz mümkündür. <br /> <br /><strong>Not:</strong> Development Fabric ortalama 30 ile 90 saniye arasında başlamaktadır. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak48_7.gif" /> <br /> <br />CloudService ile imzalı web servis oluşturmaktadır. Bu servisi Service Details seçeneğinde görebilmemiz mümkündür. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak48_8.gif" /> <br /> <br />Rollerimizi Web rol seçeneğine bastığımızda görebilmemiz mümkündür. Ayrıca bu rollerin de çalıştığı gözlemlenmektedir. Eğer ki config dosyasında Instance değerini bir vermiş olsaydık bize gösterilecek olan web rol de bir tane olacaktı. <br /> <br />Son olarak oluşturulan sayfamıza göz atalım; <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak48_11.gif" /> <br /> <br />Her şey sorunsuzca oluşmuş ve ilk Cloud uygulamamızı oluşturmuş bulunuyoruz. Eğer projemize breakpoint koyduğumuz bir bölüm varsa da sorunsuzca debug edebilmemiz mümkündür. <br /> <br />Şimdi yapacağımız işlem ise oluşturulan bir Cloud servisini nasıl web üzerine yayınlayacağımızı adım adım inceleyeceğiz. <br /> <br />İlk olarak yapmamız gereken CloudServis projemizi publish ederek internet üzerine yayınlanabilir bir duruma getiriyoruz. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak48_12.gif" /> <br /> <br />Publish işlemi tamamlandığında bize sıkıştırılmış olarak servisimizi sunar ve bu servisin olduğu klasörü açar. Ayrıca servisimizi yayınlayabilmemiz için gerekli olan web sayfasını da açarak bizim işlemlerimize devam etmemize olanak tanımaktadır. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak48_13.gif" /> <br /> <br />Live ID ‘miz ile açılan sayfaya giriş yaptığımızda aşağıdaki gibi bir ekran bizlere sunulmaktadır. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak48_14.gif" /> <br /> <br />New Project seçeneğine basarak yeni projemizin düzenlemeye başlayabiliriz. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak48_15.gif" /> <br /> <br />Yeni proje seçeneğine tıkladıktan sonra karşımıza gelen ekranda <strong>Hosted Services </strong>seçeneğine basarak projemizi oluşturmaya devam edebiliriz. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak48_16.gif" /> <br /> <br />Karşımıza gelen ekranda bize projemizin başlığını ve açıklamasını girmemiz istenmektedir. Bu işlemleri tamamladıktan sonra bir diğer adıma geçebiliriz. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak48_17.gif" /> <br /> <br />Bu adımda projemizin ismini belirliyoruz. Uygunluğunu kontrol ettirdikten sonra sayfanın en alt kısmında yer alan Create butonu yardımı ile projemizi oluşturuyoruz. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak48_18.gif" /> <br /> <br />Deploy seçeneğini seçerek Publish ettiğimiz projeyi web alanımıza ekleyeceğiz. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak48_19.gif" /> <br /> <br />Gerekli dosyaları bilgisayarımız üzerinden gösterdikten sonra sayfanın alt kısmında yer alan deploy seçeneğine basarak projemizi deploy ediyoruz. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak48_20.gif" /> <br /> <br />Run butonuna basarak projemizin derlenmesinin tamamlanmasına ve production ortamı için bekleme aşamasına geçmektedir. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak48_21.gif" /> <br /> <br />Artık projemizi internet tarayıcılarımızda görür duruma gelmiş bulunuyoruz. Web Site URL yazan yerdeki linki tıkladığımızda kendi bilgisayarımızda geliştirmiş olduğumuz projenin internet ortamına aktarıldığını görmüş oluruz. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak48_22.gif" /> <br /> <br />Projemizin sorunsuz bir biçimde çalıştığını gördüğümüze göre artık eşleştirme işlemi ile production ortamına uygulamamızı taşıyabiliriz. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak48_23.gif" /> <br /> <br />Bu işlem sonucunda artık uygulamamız production ortama geçmiş bulunuyor. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak48_24.gif" /> <br /> <br />Web üzerinde projemizi oluştururken başlarda verdiğimiz web adresi ile artık uygulamamıza girebilir duruma gelmiş bulunuyoruz. Artık <a href="http://turhaltemizer.cloudapp.net/">http://turhaltemizer.cloudapp.net</a> adresine girerek uygulamamızı görebiliyor olacağız. <br /> <br /><img alt="" src="http://www.csharpnedir.com/mimages/TurhalTemizer/mak48_25.gif" /> <br /> <br />Artık uygulamamızı oluşturmuş ve internet üzerinde görebilir duruma gelmiş bulunuyoruz. Daha iyi uygulamalar geliştirmek artık bizlerin hayal gücümüze kalmıştır. <br /> <br />Yazımız boyunca incelediklerimize tekrardan kısaca bir göz atmak gerekirse; ilk olarak Cloud mimarisine göz attık sonrasında Windows Azure ‘un ne olduğunu ve tabanında çalışan servislerin ne olduğunu tanım seviyesinde değinmeye çalıştık. Temel açıklama kısımlarını tamamladıktan sonra Visual Studio ortamında ilk uygulamamızı geliştirip development fabric üzerinde web rolleri ile ilişkili servislerin çalışıp çalışmadığını kontrol ettik, sonrasında ise uygulamamızı publish ederek web ortamında yayınlanır duruma getirdik. Bir sonraki adımımızda ise oluşturduğumuz Cloud servis projesini web üzerinde nasıl yayınlanabilir duruma getireceğimizdi. Bu işlemi de adım adım inceledikten sonra yazımızı tamamlamış ve ilk uygulamamızı da internette görülebilir bir duruma getirdik. <br /> <br />Daha sonraki Azure yazılarında bu teknolojiyi, mimariyi ve servislerini daha detaylı olarak inceliyor olacağız. <br /> <br />Herkese mutlu günler diliyorum. <br /><a href="mailto:info@turhaltemizer.com">info@turhaltemizer.com</a></font></div> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35481450-7124917086623616696?l=turhal.blogspot.com'/></div>turhaltemizerhttp://www.blogger.com/profile/14762155033738029313noreply@blogger.com0tag:blogger.com,1999:blog-35481450.post-39594646816796963602009-05-19T18:42:00.001+03:002009-05-19T18:53:20.848+03:00Microsoft Stratejisi – Yazılım + Servisler<p align="justify">Cloud mantığını uygulamalı olarak bir nevi anlatan videoyu sizlere sunuyorum. Bildiğiniz üzere Cloud mantığı Windows Azure servisleri ile birleşerek yazılımlar ile servislerin komplike bir şekilde çalışabilmesine olanak tanımaktadır. Umarım video hoşunuza gider. <br /><br /><a href="http://www.microsoft.com/softwareplusservices/">Video: Software plus services</a> <br />Umarım video hoşunuza gider.</p> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35481450-3959464681679696360?l=turhal.blogspot.com'/></div>turhaltemizerhttp://www.blogger.com/profile/14762155033738029313noreply@blogger.com0