CheckBoxList: Hepsini Seç/Hepsini Temizle

Microsoft Office OneNote; özellikle iş toplantılarındaki notları saklamak için harika bir uygulama. Toplantı notları dışında uzun zamandır uğraştığım projelerde karşıma çıkan problemleri-çözümleri, ipucu sayılabilecek durumları(tips/tricks diyelim) ve yine yabancı bloglarda gözüme çarpan faydalı olabilecek bazı bilgileri OneNote’da depoluyordum. Bugün baktım yazılacaklar listesi bir hayli birikmiş, o zaman fırsat buldukça bu bilgileri insanlarla paylaşma zamanı gelmiş dedim :)

Buyurun ilk yazıya; aslında pek ASP.NET’lik bir durum yok ama yine de ASP.NET programcılarının işine yarayacak bir kod parçası. Senaryo şu; CheckBoxList ile listelediğimiz birçok kayıt var ve tek hamlede tüm kayıtlar seçilebilsin ya da seçilenler temizlensin istiyoruz. Basit bir JavaScript fonksiyonu ile bu işi rahatlıkla yapabiliriz. Aşağıda JavaScript fonksiyonunu bulabilirsiniz.

<script language="javascript" type="text/javascript">

    function ListeSecim(kontrol, durum) {

        var ctl = document.getElementById(kontrol);

        var inputs = ctl.getElementsByTagName('input'); //CheckBoxList'teki input elementlerini getir

        //CheckBoxList'teki tüm input elementlerinin checked niteliğini

        //durum değişkenindeki değere ata(true/false)

        for (var i = 0; i < inputs.length; i++)

            inputs[i].checked = durum;

    }

</script>

Tabi bir de tüm item’ları seçme ve temizleme işini yapacak linklere ihtiyacımız var. Bu linklerden yukarıdaki fonksiyonu çağıracağız. İki link arasındaki tek farklılık ListeSecim fonksiyonuna gönderilecek ikinci parametrenin değeri olacaktır.

<a href="javascript:ListeSecim('CheckBoxList1', true)">Hepsini Seç</a>&nbsp;

<a href="javascript:ListeSecim('CheckBoxList1', false)">Hepsini Temizle</a>

 

5 Mayıs 2009 Salı 23:23

Yorum - RSSYorumlar (0)

Etiket: ,
Kategori: ASP.NET

facebook'da Paylaş   twitter'da Paylaş   friendfeed'de Paylaş   del.icio.us'da Paylaş   stumpleupon'da Paylaş   Permalink

ASP.NET’te SEO Uyumlu Sayfa Yönlendirme

SEO(Search Engine Optimization) yani arama motoru iyileştirmesi son yıllarda internet dünyasında tanınmak ve para kazanmak isteyen çoğu kişinin ağzından düşürmediği bir kavram. Arama motorlarında üst sıralara çıkmak, adsense reklamlarından iyi gelirler elde etmek başlı başına bir sektör haline bile geldi! Hatta sırf bu işten ayda 1.000$’ın üzerinde gelir elde eden tanıdıklarım bile var(İmreniyorum sizlere arkadaşlar). Geçtiğimiz haftalarda Ineta Next Hit’teki ASP.NET 4.0 sunumuma hazırlanırken sayfa yönlendirme ile ilgili ASP.NET uygulamalarına has güzel bir ipucu keşfettim. Aslında Response.Redirect() metodunun tarayıcılara(web browser) HTTP 302 durum kodunu gönderdiğini ASP.NET’le ilk tanıştığım zamanlarda bile biliyordum, ama bu metotla beraber tarayıcıya nasıl HTTP 301 durum kodu göndeririz ve arama motorları tarafından nasıl daha fazla seviliriz, işte bu idi yeni keşfettiğim nokta:)

Response.Redirect programatik olarak sayfa yönlendirme işlemleri yapmamızı sağlıyor bildiğiniz gibi, ancak ilginç bir ayrıntısı da var, o an talepte bulunan istemciye HTTP 302(yani Temporary Redirect) bilgisini gönderiyor. Tabi ki bu mesajı gören arama motoru boot’ları da; “demek ki bu sayfaya geçici olarak geldim, yakında bu sayfayı belki de bulamayacağım, önemsiz bir sayfa, gerilere at!” der. Halbuki işin aslı bu kalıcı bir sayfa ve arama motorlarının da bunu böyle bilmesi gerekir. Eğer gönderilen cevabın içeriğine HTTP 301(Moved Permanently) bilgisini ekletebilirsek süper olacak. Aşağıda bu işi nasıl yapabileceğimizi görebilirsiniz. Tabi ki Response.Redirect() kullanmadan;


Response.StatusCode = 301;

Response.StatusDescription = "Moved Permanently";

Response.AddHeader("Location", "Default2.aspx");


Yukarıdaki üç satırı beğenmeyen varsa güzel bir haber vereyim; ASP.NET 4.0 ile gelecek olan Response.RedirectPermanent() metodu bu üç satırın işini görecek. Yani bu metot yönlendirmeyi yaparak istemciye HTTP 301 durum kodu gönderecek. Küçük ama hoş bir yenilik olacağa benziyor.

25 Nisan 2009 Cumartesi 20:44

Yorum - RSSYorumlar (10)

Etiket: , ,
Kategori: ASP.NET

facebook'da Paylaş   twitter'da Paylaş   friendfeed'de Paylaş   del.icio.us'da Paylaş   stumpleupon'da Paylaş   Permalink

ASP.NET MVC - Kendi HTML Helper Metotlarımızla Çalışmak

Bu yazımıda kendi özel HTML Helper metotlarımızı nasıl oluşturup-kullanabileceğimize göz atacağız. HTML Helper metotları View nesneleri içerisinden Html adındaki bir nesne üzerinden çağrılabilen metotlardır. Örneğin <%=Html.TextBox("txtIsim", "Adınızı girin...") %> şeklindeki bir metot çağrımı sayfamızda txtIsim adında bir metin kutusu (text input elemanı) oluşturulmasını ve içerisinde Adınızı girin... metninin eklenmesini sağlar. Bu işlemi aslında biz de manuel html elementleri yazarak oluşturabiliriz, ancak bu kontrollerin içeriklerini dinamik şekilde oluşturmak için HTML Helper metotları işlerimizi basitleştirecektir. Bu doğrultuda eğer kendi yardımcı HTML metotlarımızı geliştirecek olursak farklı farklı projelerde kullanma ve geliştirme sürecini kısaltma şansımız da olacaktır.

Aslında burada oluşturacağımız metot neredeyse her projede yazdığımız tarzda sıradan bir metot olacaktır(1-2 ayrıntı dışında). Basit olarak geriye HTML kodları döndüren bir metot oluşturmak, aslında görevimiz bu! Tabi ki WebForm'larda bu tarz ihtiyaçlarımız olmadığı için biraz bu tip metotları yazmaya uzak kaldığımızı söyleyebiliriz. Bir de oluşturulması oldukça karmaşık olan veri kontrollerinin HTML çıktılarını ayarlamak, gerekli iş mantığını bu metotlar içerisinde kodlamak oldukça zahmetli bir işlem olacaktır. Biz yazımızda öncelikli olarak basit bir HTML helper metodunu nasıl oluşturabileceğimizi, ardından da veri saklayan bir nesneyi html table elementi olarak çıktıya nasıl dönüştürebileceğimizi göreceğiz.

HTML helper metotlarını doğrudan kendi yazdığımız özel bir sınıf içerisinde oluşturabiliriz. Burada nesneyi örnekleme ihtiyacımız olmayacağı için static bir metot oluşturmak daha doğru bir pratik olacaktır. Aşağıda html span elementi oluşturan bir yardımcı html metodu yer alıyor. Projemize HtmlHelperKutuphanem.cs adında bir class dosyası ekliyoruz.

HtmlHelperKutuphanem.cs

public class HtmlHelperKutuphanem

{

    public static string Metin(string text, string renk)

    {

        return string.Format("<span style=\"color:{0}\">{1}</span>", renk, text);

    }

}

Görüldüğü gibi son derece basit bir metot. Kendisine gönderilen text parametresinin içeriğini, renk parametresinde belirtilen renk kodu ile bir span elementi içerisinde görüntüleyecektir. Metodu View nesnelerimizden çağırma işlemi de aşağıda görüldüğü gibi olacaktır.

Views/Home/Index.aspx

<%=HtmlHelperKutuphanem.Metin("Merhaba Dünya", "#FF0000") %>

Sayfanın çıktısına baktığımızda ise;

<span style="color:#FF0000">Merhaba Dünya</span>

şeklinde olacağını göreceğiz. Bunu zaten bizde normal HTML kodlarını yazarak yapabiliriz dediğinizi duyar gibiyim, ama işin şu kısmını unutmamak lazım; kod içerisinde dinamik işlem yapmak istediğiniz durumlarda for-foreach gibi döngülerin içinde HTML kodunu string olarak yazmaktansa, bir programlama öğesi olan metotları kullanmak daha hızlı, daha basit ve  etkili olacaktır. Dikkat ettiyseniz burada yazdığımız yardımcı HTML metodumuz kendi özel class'ımız içerisinde olduğu için, metodu çağırırken de bu class adını kullanmak zorunda kaldık. Ancak ASP.NET MVC'deki tüm HTML Helper metotlara Html adındaki bir özellik(property) üzerinden erişilebilir. Bu özellik aslında o anki context üzerinden HtmlHelper tipinden bir nesne döndürmektedir.  O zaman yazacağımız özel metotlarımızı HtmlHelper class'ının  bir üyesi olarak getirmek işi standartlaştırmak adına faydalı olacaktır. Aşağıdaki kod parçasında az önce yazdığımız Metin adındaki metodun nasıl HtmlHelper class'ına uzantı bir metot olarak eklendiği görülmektedir. İşte extension metotların kullanımına süper bir örnek :)

HtmlHelperExtensions.cs

using System.Web.Mvc;

 

public static class HtmlHelperExtensions

{

    public static string Metin(this HtmlHelper htmlHelper, string text, string renk)

    {

        return string.Format("<span style=\"color:{0}\">{1}</span>", renk, text);

    }

}

Böylece artık Html özelliği üzerinden Metin adındaki yardımcı HTML metodumuzu çağırabileceğiz.
Basit bir HTML Helper

Bu basit metotla nasıl kendi HTML Helper metotlarımızı oluşturup kullanabileceğimizi gördük. Peki biraz daha karmaşık yapısı olan bir HTML çıktıları nasıl oluşturabiliriz? Aklımız hemen WebForm'lardaki GridView vb. kontrollerde olduğu gibi HTML çıktıları oluşturmaya gidiyor olabilir ama bu o kadar da kolay olmayacaktır. O zaman bizde elimizde bulunan bir liste koleksiyonun içeriğini table elementi olarak oluşturan bir yardımcı metodu nasıl oluşturabileceğimize bakalım. Dilerseniz ilk olarak basit bir table oluşturmayı deneyip, ardından daha karmaşık yapıdaki nesneleri nasıl table içerisinde listeletebiliriz bunun yollarını arayalım. İlk senaryomuz string dizisi içerisinde saklanan bilgileri tek hücreli bir tabloya yazdırmak olsun. Aşağıda bu işlemi gerçekleştiren SimpleTable adındaki extension method'umuz yer almaktadır.

HtmlHelperExtensions.cs

using System.Web.Mvc;

using System.Text;

 

public static class HtmlHelperExtensions

{

    public static string Metin(this HtmlHelper htmlHelper, string text, string renk)

    {

        return string.Format("<span style=\"color:{0}\">{1}</span>", renk, text);

    }

 

    public static string SimpleTable(this HtmlHelper htmlHelper, string[] list)

    {

        StringBuilder tablo = new StringBuilder();

        tablo.AppendLine("<table>");

 

        //Dizi içerisindeki tüm elemanları tek tek okuyarak bir satır ve sütun olarak oluşturuyoruz

        foreach (string item in list)

        {

            tablo.Append("<tr><td>");

            tablo.Append(item);

            tablo.AppendLine("</td></tr>");

        }

        tablo.Append("</table>");

 

        return tablo.ToString();//Oluşan HTML kodları geri döndürüyoruz

    }

}

SimpleTable metodu çok basit bir şekilde kendisine gönderilen list adındaki string dizisi içerisindeki elemanları bir döngü içerisinde tek tek okuyarak tabloya eklenen satır ve hücreler içerisine ekliyor. Oluşan tablonun HTML kodlarını da geriye döndürüyor. İş mantığı normal uygulamalarda yazdığımız gibi, olayın sadeliği ise bu metodu artık Html nesnesi üzerinden tekrar tekrar farklı View nesneleri içerisinde kullanabilmemizden geliyor.

Peki HTML çıktıyı biraz daha karmaşık hale getirelim. Senaryomuz şu olsun; elimizde içerisinde aynı tipten nesneler saklayan generic bir liste koleksiyonumuz olsun, ve biz de bu koleksiyondaki tüm nesnelerin özelliklerini table elementi içerisine birer hücre olarak yazdıralım. Örneğin kendi oluşturduğumuz Product tipindeki nesneleri saklayan generic List koleksiyonumuzun içeriğindeki tüm ürünleri ve ürünlerin detaylarını(yani property değerlerini) tablo içerisinde görüntülemek istiyoruz. Tahmin edeceğiniz üzere oluşturacağımız metot Product gibi bir tipe bağımlı kalmayacak, bazen Customer, bazen Order gibi farklı nesneleri de görüntülemek isteyecektir. Bu doğrultuda metodun içerisinde çalışma zamanında(runtime) liste içerisindeki tipin yapısını çözümlemek ve property değerlerine göre tablo hücrelerini oluşturmamız gerekecektir. Yani burada reflection(yansıma) tiplerine ihtiyaç duyacağız. Geliştireceğimiz metot aşağıdaki gibi olacaktır. Yapılan işlemlerle ilgili kısa açıklamalar kod içerisindeki yorum satırlarında yer alıyor.

HtmlHelperExtensions.cs
using System.Web.Mvc;

using System.Text;

using System.Collections;

using System.Reflection;

 

public static class HtmlHelperExtensions

{

    ...

 

    public static string Table(this HtmlHelper htmlHelper, IList list, bool showHeader)

    {

        //Eğer liste boş ise boş bir string döndür

        if (list.Count == 0)

            return string.Empty;

 

        StringBuilder tablo = new StringBuilder();

        tablo.AppendLine("<table>");

        //Tabloda başlık görüntülensin isteniyorsa ilk satırımız property'lerin isimleri olacaktır.

        //Bu doğrultuda koleksiyonun ilk satırındeki nesnenin property bilgilerine bakarak başlık satırı oluşturuluyor

        if (showHeader)

        {

            object firstItem = list[0];

            tablo.Append("<tr>");

            //GetType metodu bir nesnenin type bilgisini getirir.

            //Bu değer üzerinden GetProperties metodu ile nesnenin property listesine erişilebilir

            foreach (PropertyInfo property in firstItem.GetType().GetProperties())

            {

                tablo.Append("<td>");

                tablo.Append(property.Name); //Property'nin adı

                tablo.Append("</td>");

            }

            tablo.AppendLine("</tr>");

        }

 

        foreach (object item in list) //Liste içerisindeki nesnelerin özelliklerini satır satır oluştur

        {

            tablo.Append("<tr>");

            foreach (PropertyInfo property in item.GetType().GetProperties())

            {

                tablo.Append("<td>");

                tablo.Append(property.GetValue(item, null).ToString()); //GetValue metodu property'deki değeri getirir

                tablo.Append("</td>");

            }

            tablo.AppendLine("</tr>");

        }

        tablo.AppendLine("</table>");

 

        return tablo.ToString(); //Oluşan HTML kodları geri döndür

    }

}

Yardımcı HTML metodumuzu oluşturduk. Etkin şekilde kullanımını incelemek için öncelikli olarak kendimize Product adında bir class oluşturup, ardından da bir List koleksiyonu için Index.aspx adındaki View nesnemizden bu metodu çağıralım. Aşağıda Product adındaki class'ımız ve Views/Home/Index.aspx dosyasına eklediğimiz kodlar yer almaktadır.

Product.cs
public class Product

{

    //Burada C# 3.0 ile gelen auto implemented property özelliğini kullanıyoruz.

    //Yani field ve get-set bloklarının gövdelerini oluşturmadan property tanımlıyoruz.

    public int Id

    {

        get; set;

    }

    public string Name

    {

        get; set;

    }

    public double Price

    {

        get; set;

    }

}

 

Views/Home/Index.aspx
<%

    List<Product> urunListe = new List<Product>{

                                new Product { Id=2, Name="Kalem", Price=1.25},

                                new Product { Id=4, Name="Defter", Price=3.49},

                                new Product { Id=5, Name="Çanta", Price=19.25}

                                };

    Response.Write(Html.Table(urunListe,true));

%>

View'ı görüntülediğimizde aşağıdaki gibi bir çıktıyı görebiliriz.

Table çıktısı üreten HTML Helper

Gördüğünüz gibi hazırlayacağımız yardımcı HTML metotlarını Html özelliği içerisinde saklayarak MVC projelerimizde daha kolay HTML çıktılar oluşturabilmekteyiz. Şu an için MVC uygulamalarında kullanabileceğimiz herhangi bir sunucu kontrolü bulunmamaktadır, ancak yakın gelecekte bazı temel kontrollerin bu ortama dahil edilmesi planlanmakta. Bu süreçte MVC uygulamaları için kendi HTML Helper metotlarımızı üreterek sunucu kontrollerinin olmamasından ortaya çıkan dezavantajı giderebiliriz.

23 Nisan 2009 Perşembe 18:41

Yorum - RSSYorumlar (0)

Kategori: ASP.NET

facebook'da Paylaş   twitter'da Paylaş   friendfeed'de Paylaş   del.icio.us'da Paylaş   stumpleupon'da Paylaş   Permalink

Ineta Next Hit ve ASP.NET 4.0 Sunumu Ardından

Hafta sonu Yıldız Teknik Üniversitesi’nde yine güzel bir Ineta etkinliği gerçekleştirdik. Benim sadece ikinci gününe katılabildiğim bu etkinlik sonunda yine her zaman ki gibi katılımcılardan çok olumlu bildirimler, teşekkürler aldık. Umarız bu iki gün katılan herkes için faydalı geçmiştir ve yakın gelecekteki yazılım teknolojileri ile ilgili biraz olsun fikir sahibi olmalarını sağlayabilmişizdir.

Benim de Next Hit’in ikinci gününde yaklaşık 2 saatlik ASP.NET 4.0 oturumum vardı. Oldukça keyifli geçen ve güzel sorularla daha da renklenen bu sunumda henüz 4.0 yeniliklerini test edebileceğimizi bir IDE ortamı olmadığı için(VS 2010 CTP var ama orası pek iş görmüyor şimdilik) daha çok eski sürümlerdeki sorunlardan, gelen yeniliklerin ne gibi sorunları giderdiğinden bahsetme şansımız oldu. Her ne kadar fazla test yapamadık desemde ClientIdMode, URL Routing, AJAX 4.0, Dynamic Data ve ASP.NET MVC ile ilgili demolar yapma şansını bulduk:)

Sunumumda kullandığım yansı dosyasını aşağıdaki linkten indirebilirsiniz. Etkinlikte emeği geçen ve katılan herkese çok teşekkür ediyorum…

ASP.NET 4.0 Sunumu

ineta_next_hit_sonrasi

Gün sonunda çekilen bir hatıra fotoğrafı

13 Nisan 2009 Pazartesi 08:56

Yorum - RSSYorumlar (2)

Etiket: ,
Kategori: ASP.NET | Duyuru-Haber

facebook'da Paylaş   twitter'da Paylaş   friendfeed'de Paylaş   del.icio.us'da Paylaş   stumpleupon'da Paylaş   Permalink

ASP.NET MVC Uygulamalarında HTML Helper Metotlarıyla Çalışmak

WebForm'lardan MVC uygulamalarına geçiş yaptığımızda yaşadığımız sıkıntılardan birisi sunucu kontrollerinin olmamasıdır. Olay tabanlı bir ortamda olmadığımız ve PostBack mekanizmasının işlemediği için zaten ASP.NET MVC uygulamalarında sunucu kontrollerini aynen kullanmak gibi bir beklentimiz de olamaz. Peki sunucu kontrollerindeki boşluğu MVC uygulamalarında nasıl doldurabiliriz? Her ne kadar WebForm'larındaki kadar etkili ve kolay olmasada, HTML Helper(Yardımcı HTML) metotları kullanılarak daha önceden hazırlanmış HTML şablonlarının sayfalarımıza uygulanmasını sağlayabiliriz.

HTML Helper'lar aslında Html adındaki bir nesne üzerinden eriştiğimiz metotlardan başka birşey değildir. Bu metotların temel görevi belirli HTML kodlarının üretilmesini sağlamaktır. Yani sizin normalde <a href="Urun/3">3 nolun ürün</a> şeklinde yazacağınız bir HTML kodunu Html.ActionLink("3 numaralı ürün", "Details/3", "Urun") şeklinde yazabilmenizi sağlar. Buradaki örneği gördüğünüzde "ben bu işlemi <a....> elementi ile daha kolay yapabiliyorum, neden uzun uzun yazayım?" gibi bir düşünce gelecektir, ancak Html.ActionLink metodunun sunucu tarafında çalışan, foreach vb. yapılar içerisinde kolayca kullanılabileceğinden bahsedecek olursak daha etkin bir yöntem olacağı anlaşılacaktır. Dilerseniz hali hazırda gelen HTML Helper metotlarına bir göz atalım.

Html.ActionLink: <a> elementi oluşturarak bir action metoduna link verilmesini sağlar.
Html.BeginForm: <form> elementini oluşturur.
Html.CheckBox: Checkbox; yani <input type="checkbox"...> elementi oluşturur.
Html.DropDownList: <select..><option>..</option>.....</select> elementlerini(WebForm'lardan tanıdığımız DropDownList'in çıktısı) oluşturur.
Html.Hidden: HTML içerisinde gizli alan; yani <input type="hidden"...> elementi oluşturur.
Html.ListBox: <select multiple="multiple"..><option>..</option>.....</select> elementlerini(WebForm'lardan ListBox'ın çıktısını) oluşturur.
Html.Password: Şifre için metin kutusu oluşturur(<input type="password"...>)
Html.RadioButton: <input type="radio"....> elementi oluşturur.
Html.TextArea: Birden fazla satırı olan bir metin kutusu oluşturur(<textarea....> elementi).
Html.TextBox: Metin kutusu oluşturur(<input type="text"....> elementi).

Yukarıda görülen tüm metotlar MVC uygulamalarında kullanabildiğimiz Html adındaki bir nesne üzerinden erişilen metotlarıdır. Html, View nesnelerinden erişilebilen System.Web.Mvc isimalanı altındaki HtmlHelper tipinden oluşan bir nesnedir. Aslında yukarıdaki metotlarla ilgili önemli bir ayrıntıya değinmeden geçemeyeceğim; bu metotların tamamı Extension Method'tur, yani HtmlHelper tipine sonradan eklenen metotlardır. Bu bizim için oldukça önemli bir nokta, zira bizlerde kendi özel Html Helper metotlarımızı oluşturarak HtmlHelper class'ını genişletebiliriz.

Biraz da pratik. Bu metotları MVC uygulamalarında nasıl kullanabileceğiz? Aslında herbirinin farklı parametre yapısı olduğu için farklı şekillerde kullanımları bulunmaktadır. Hatta her metodun kendi içerisinde birçok aşırı yüklenmiş versiyonu dahi bulunmaktadır. Bu yazımızda temel olarak bu Helper metotlarından birkaçının kullanımını incelemeye çalışacağım.

Öncelikli olarak bir ASP.NET MVC Web Application projesi açarak örneğe başlıyoruz. Uygulamamın Controllers kısmındaki HomeController class'ına Kayit adında bir action metodu ekliyor ve metodun içerisinde iken fareye sağ tıklayarak Add View diyoruz. Açılan pencereden herhangi bir değişiklik yapmadan Kayit.aspx adında bir View nesnemizi Home view'ı altına ekliyoruz. Kayit.aspx sayfasına BeginForm, EndForm, ActionLink, RadioButton yardımcı metotlarını kullanarak basit bir form hazırlıyoruz. Akla nereden Submit butonumuz sorusu gelebilir, yukarıdaki listeden de görüldüğü gibi Submit işlemi yapan bir yardımcı Html metodu maalesef yok. Bunun yerine <input type="submit"...> şeklinde butonumuzu kendimiz oluşturacağız.

Controllers/HomeController.cs
[HandleError]

public class HomeController : Controller

{

    public ActionResult Kayit()

    {

        return View();

    }

   ...

}

 

Views/Home/Kayit.aspx

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>

 

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">

    Kayit

</asp:Content>

 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

    <h2>Kayit</h2>

 

    <% Html.BeginForm(); %>

    İsminiz: <%=Html.TextBox("txtIsim", "Adınızı girin...") %>

    <br />

    Şu an neredesiniz:  <%=Html.RadioButton("is", 0) %>İş yerinde

                        <%=Html.RadioButton("ev", 1) %>Evde

    <br /><input id="btnGonder" type="submit" value="Gönder" />

    <% Html.EndForm(); %>

</asp:Content>

Uygulamayı çalıştırıp adres satırının sonuna Home/Kayit yazıp sayfanın çıktısına bakalım.

 
Resim: Sayfanın çıktısı

<h2>Kayit</h2>

 

<form action="/Home/Kayit" method="post">

İsminiz: <input id="txtIsim" name="txtIsim" type="text" value="Adınızı girin..." />

<br />

Şu an neredesiniz:  <input id="is" name="is" type="radio" value="0" />İş yerinde

                    <input id="ev" name="ev" type="radio" value="1" />Evde

<br /><input id="btnGonder" type="submit" value="Gönder" />

</form>

Görüldüğü gibi BeginForm ve EndForm <form> elementini açılığ kapatılmasını, Textbox <input type="text"...> elementini, RadioButton ise <input type="radio"...> elementinin oluşmasını sağlamış. Html.TextBox() metodunu ele alacak olursak ilk parametre oluşturulacak elementin id'sini, ikinci değer ise içerisine yazılacak value bilgisini belirler. Html.RadioButton içinde aynı durum geçerlidir. Diğer yardımcı Html metotları içinde benzer kullanım şekilleri geçerlidir. Yalnız DropDownList ve ListBox gibi metotlar liste nesneleriyle çalışabilmektedir. ASP.NET Web Form'lardaki isimlerinden de hatırladığımız gibi bu kontrolleri DataTable veya DataSource nesnelerine bağlayabiliyorduk. Buradaki liste metotlarımızda benzer şekilde koleksiyon nesneleriyle çalıştırılabilmekte ve liste içerisindeki tüm değerlerin Html kodlarına dönüştürülmesi sağlanabilmektedir.

Yukarıda hazırladığımız sayfaya son olarak içerisinde şehirleri saklayan bir DropDownList ekleyelim. Aşağıda sayfaya eklediğimiz kodlar, sayfanın görünümü ve Html çıktısı görülmektedir.

Views/Home/Kayit.aspx dosyasına eklenen kodlar:
Yaşadığınız şehir: <%

           Dictionary<string, string> sehirler = new Dictionary<string, string>();

           sehirler.Add("-1", "Şehir seçin");

           sehirler.Add("6", "Ankara");

           sehirler.Add("16", "Bursa");

           sehirler.Add("34", "İstanbul");

 

           SelectList list = new SelectList(sehirler, "key", "value");

           Response.Write(Html.DropDownList("ddlSehir", list));

         %>

Kodları inceleyecek olursak; DropDownList metodu string bir name değeri ile IEnumerable<SelectListItem> tipinden selectList adında bir liste nesnesi alır. name değeri oluşacak <select> elementinin id'sini, selectList ise DropDownList'in item'larını belirler. SelectList tipinden oluşturacağımız bir koleksiyona List<T> veya Dictionary<T,K> tipinden başka bir koleksiyonun değerlerini aktarabiliyoruz. Zaten SelectList nesnesi de DropDownList metoduna ikinci parametre olarak gidecek ve böylece oluşturulan 4 tane sehir seçeneği Html çıktıda görüntülenebilecektir.


Resim: Sayfanın yeni görünümü

Html.DropDownList'in oluşturduğu kodlar:
Yaşadığınız şehir: <select id="ddlSehir" name="ddlSehir"><option value="-1">Şehir seçin</option>

    <option value="6">Ankara</option>

    <option value="16">Bursa</option>

    <option value="34">İstanbul</option>

</select>

ListBox'ta DropDownList ile aynı mantıkta çalışmaktadır. Böylece basit şekilde oluşturulabilen TextBox, RadioButton gibi Html Helper metotlarının yanında DropDownList'i de incelemiş olduk.

8 Nisan 2009 Çarşamba 08:47

Yorum - RSSYorumlar (0)

Kategori: ASP.NET

facebook'da Paylaş   twitter'da Paylaş   friendfeed'de Paylaş   del.icio.us'da Paylaş   stumpleupon'da Paylaş   Permalink

ASP.NET MVC Framework – İlk Projemiz

Önceki yazımda ASP.NET MVC Framework’ü genel hatlarıyla incelemiştik. Bu yazımızda da bir MVC uygulamasını geliştirmeye çalışacağız. Öncelikli olarak Visual Studio 2008'de File > New Project linkini, açılan pencereden kullanacağımız dilin altında yer alan proje türlerinden Web'i seçiyor ve buradan da ASP.NET MVC Web Application proje şablonunu seçerek yeni bir proje oluşturuyoruz.

create_aspnet_mvc_project
Resim: ASP.NET MVC projesinin oluşturulması

Proje oluşturulurken Visual Studio, MVC uygulaması ile birlikte bir de test projesi oluşturmak için onay penceresi çıkaracaktır. Bu test projesi, MVC uygulamamızdaki action metotlarını test edebilmemiz, yani unit test'ler yapabilmemiz için kullanılabilir. Eğer test işlemleri de yapacaksanız karşınıza çıkan bu pencereden Yes... ile başlayan seçeneği kullanabilirsiniz. Burada MVC Framework ile gelen standart Visual Studio Unit Test framework'ü kullanılabileceği gibi üçüncü parti test framework'leri de kullanılabilir. Biz şimdilik test projesi kullanmayacağımız için No... ile başlayan seçeneği seçiyor ve OK butonuna tıklıyoruz.

create_unit_test
Resim: Unit Test Projesi seçenekleri

ASP.NET MVC Web uygulamamız oluşturuldu. İlk olarak Solution Explorer'a bakıyor ve bize biraz yabancı gelebilecek dizin yapısını inceliyoruz. Aşağıdaki resimde projemizin Solution Explorer'daki görüntüsü bulunmaktadır.

aspnet_mvc_solution_explorer
Resim: ASP.NET MVC projemizin dosya ve klasör yapısı

Resim üzerinde klasörlerle ilgili kısa açıklamaları bulabilirsiniz. Bizim için burada önemli olan dizinler Controllers, Models ve Views olacaktır. Herbirinin adından da anlaşılacağı üzere Model View Controller deseninin dosya olarak uygulanışı bu dizinler içerisinde olacaktır. Bunun dışında Content css, resim gibi dosyaları, Scripts ise JavaScript kod kütüphanalerini içermesi için özel ayrılmış dizinlerdir. Scripts klasöründe AJAX, MVC için AJAX ve jQuery kütüphanelerini otomatik olarak geldiği de görülmektedir. Controllers klasöründe AccountController ve HomeController adında iki Controller class'ı bulunmaktadır. Bu iki class URL içerisinde controller değeri Home ve Account olan talepleri karşılayacaktır. View klasöründe ise Account, Home ve Shared klasörleri yer almaktadır. Shared tüm View nesnelerinde ortak kullanılabilecek master sayfa, user control gibi dosyalar içindir. Diğer iki klasöre baktığımızda ise isim olarak Controller sınıflarımızla benzerlik göstermektedir. HomeController'a karşılık gelen Home, AccountController'a karşılık gelen Account adında bir dizin ve bu dizinler altında da kullanıcıların görebileceği aspx dosyaları yer alır. Aslında buradaki isimlendirmeler tesadüf olarak Controller sınıflarına benzemiyor, MVC uygulamasındaki isimlendirme standartına göre HomeController gibi bir controller sınıfına gelen talepler Views altında Home dizini altında yer alan dosyalara iletilecektir. Eğer kendi özel iş mantığımıza göre nesnelerinizi oluşturmak istersek; örneğin veritabanındaki ürünlerimizle ilgili sayfalar oluşturmak için Controllers dizinine UrunController adında bir controller sınıfı ve Views dizini altında da Urun adında bir dizin oluşturmanız gerekecektir.

ASP.NET MVC uygulamalarında URL'deki dizime göre taleplerin işlendiğinden bahsetmiştik. Global.asax dosyası içerisinde uygulamanın başlangıcında(Application_Start metodunda) URL formatlamasının nasıl yapılacağı belirlenmektedir. System.Web.Routing isimalanı altında yer alan RouteTable sınıfının Routes koleksiyonu uygulama genelinde geçerli olacak URL Routing ayarlarını saklamaktadır. Bu koleksiyona eklenecek her URL formatı MVC projesine gelen URL taleplerinde değerlendirilecektir. Aşağıda ASP.NET MVC uygulamalarının varsayılan URL Routing ayarı görülmektedir.

Global.asax
publicue;">class MvcApplication : System.Web.HttpApplication

{

    public static void RegisterRoutes(RouteCollection routes)

    {

        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

 

        routes.MapRoute(

            "Default",                                              // Route name

            "{controller}/{action}/{id}",                           // URL with parameters

            new { controller = "Home", action = "Index", id = ""// Parameter defaults

        );

    }

 

    protected void Application_Start()

    {

        RegisterRoutes(RouteTable.Routes);

    }

}

 

Routes koleksiyonunun MapRoute metoduna bakacak olursak; ilk parametrenin route ismini, ikinci parametrenin URL formatını, üçüncü parametrenin ise bu Route ayarının varsayılan değerlerini belirlediğini görürüz. Bu tanımlama sayesinde uygulamaya;

site.com/Products/Edit/3
şeklinde bir URL talebi gelirse
- controller: ProductsController (Controllers klasörü altındaki sınıf)
- action: Edit (ProductsController sınıfı içerisindeki Edit metodu)
- id: 3 (Edit metoduna gönderilecek parametre)

olacaktır. Eğer site.com şeklinde bir talep gelseydi controller HomeControler(URL'de controller değeri belirtilmediği için HomeController'a gidilir), action ise Index olacaktı. Çünkü bu değerlerin boş bırakılması durumunda varsayılan değerlerinin ne olacağı yukarıdaki MapRoute metodunun son parametresinde bu şekilde belirtilmişti. Özel bir not; MapRoute metodundaki son parametre C# 3.0 ile gelen anonim tip(anonymous type) özelliği kullanılarak yazılmıştır.Controller kendisine gelen talebi View'a iletir demiştik. Eğer talep esnasında veriye erişmek gerekiyorsa action metodu içerisinden(yani Controller katmanından) Model bileşenlerine erişilir. Controller Model katmanından çektiği veriyi View'a iletir ve View'da HTML çıktıyı oluşturarak istemciye iletir. Bu arada View içerisinden de doğrudan Model nesnelerine erişilebileceğini, ancak Model içerisinden View'a erişilemeyeceğini de belirtmekte fayda var.

 

Açtığımız projeyi çalıştırarak MVC'nin temel anlamda işleyişini incelemeye çalışalım. Bu işlemin öncesinde HomeController sınıfındaki About metodunun ilk satırına bir break-point ekleyerek debug modda bu sayfaya yapılan bir talebin bu nasıl işleneceğini izleyelim. F5 tuşuna basarak projenin ana sayfasına gidiyor ve sağ üstteki About linkine tıklıyoruz.

 mvc_action_debug
Resim: Home/About şeklindeki URL'e gelen talebin işleyişi

Görüleceği gibi About sayfasında, yani Home/About şeklinde gelen URL talebinde HomeController sınıfının About adındaki action metodu çağrıldı ve bu metottan Views klasörünün altındaki Home/About.aspx adındaki View nesnesi görüntülendi. Anlaşıldığı gibi HomeController nesnesine gelen bir talepte Views dizinindeki Home dizini altında yer alan aspx dosyaları kullanıcıya gönderiliyor. Dosya adının belirlenmesinde de action metodunun isminin etkili olduğu görünmekte. ASP.NET MVC uygulamalarında View nesnelerinin isimlendirme standartı ve Controller nesnesi ile arasındaki ilişki bu şekildedir.

Bu örnekte dikkat çeken bir diğer noktada URL'nin yazılış şeklidir. Bildiğiniz gibi klasik ASP.NET uygulamalarında bu URL aslında bir klasörü simgeler. Klasik ASP.NET uygulamalarında sayfalara yapılan her talebin sonunda sayfanın uzantısı, yani .aspx olmalıdır. Ancak burada adresin sonunda herhangi bir uzantı olmadığı dikkat çekmektedir. Hatta projemizin dizin yapısına baktığımızda root dizinimizde Home adında bir klasör olmadığını da görürüz. MVC uygulamaları URL Routing ile çalıştığı için bu şekilde gelen URL'ler arka planda uygun View nesnesi üzerinden cevaba dönüştürülür. Bu şekilde yazılan URL'ler hem kullanıcılar için daha okunaklı olacak hem de arama motorlarının sayfamızı daha iyi analiz etmesini sağlayacaktır.

Dilerseniz projemize bir de LINQ to SQL sınıfı; yani bir Model nesnesi ekleyerek Controller'ın veriyi nasıl View'a taşıdığını inceleyelim. Models klasörünün üzerine sağ tıklayarak Add > New Item diyoruz ve LINQ to SQL Classes'ı seçerek adı Northwind.dbml olan yeni bir dosya ekliyoruz. Northwind veritabanındaki Products tablosunu entity olarak bu dosya içerisinde ekliyoruz. Artık projemizde Product adında bir Model nesnemiz var. Sıra geldi gerekli Controller ve View nesnelerini oluşturmaya. Controllers klasörüne sağ tıklayarak Add > Controller seçeneğine tıklıyoruz. Karşımızda çıkan pencereden Controller nesnemize UrunController adını veriyoruz. Dikkat edeceğiniz üzere bu penceredeki seçim kutusu ile otomatik olarak belirli metotların otomatik tanımlanmasını sağlayabiliriz.

mvc_add_controller
Resim: UrunController dosyasının projemize eklenmesi

UrunController sınıfı System.Web.Mvc isimalanı altında yer alan Controller adındaki bir sınıftan kalıtılmaktadır. İçerisindeki Index adındaki metodu ben Detay olarak değiştiriyorum ve metoda id adında Int32 tipinden bir de parametre ekliyorum. Gelelim Model nesnesine nasıl erişeceğimize; aslında bildiğimiz klasik kodlama işleminden başka birşey yapmayacağız. Detay metodu içerisinde bir context nesnesi oluşturarak gerekli LINQ sorgusu ile id bilgisi verilen ürünün bilgilerini getireceğiz. Metodumuzun son hali aşağıdaki gibidir.

Controllers/UrunController.cs
...
using
AspnetMvcGiris.Models;

 

namespace AspnetMvcGiris.Controllers

{

    public class UrunController : Controller

    {

        public ActionResult Detay(int id)

        {

            NorthwindDataContext ctx = new NorthwindDataContext();

            Product urun = (from u in ctx.Products

                         where u.ProductID == id

                         select u).FirstOrDefault();

            return View(urun);

        }

    }

}

LINQ sorgusu sonucunda getirilen ürün bilgisi return View(urun) ile View sayfasına gönderilmektedir. Buradaki View metodu, şu an içerisinde bulunduğumuz action'ın View dosyasını çağıracaktır. Bu dosyaya da Model adındaki bir nesne içerisinde ürünün bilgilerini taşıyacaktır. MVC uygulamalarındaki sıkıntılarımızdan birisi ASP.NET sunucu kontrollerini kullanamıyor olmamızdı. Bu ilk aşamada View içerisindeki sayfalarımızı tasarlamakta bize zorluk çıkaracak gibi görünse de Visual Studio üzerindeki ASP.NET MVC için gelen özel menüler ve araçlar sayesinde yine daha az kod yazarak arayüzler oluşturabiliyoruz. Yukarıda gördüğümüz Detay adındaki metodun içerisinde herhangi bir yere sağ tıklayarak açılan menüden Add View seçeneğine tıklayalım. Açılan pencere Controller nesnemizden ve action metodumuzdan yola çıkarak bize bir View nesnesi oluşturacaktır. Pencereden eğer Create a strongly-typed view seçeneğini seçersek, aktifleşen kısımlarda oluşan View nesnesinde hangi Model tipine ait bilgilerin görüntüleneceğini(View data class) ve sayfa içeriğinin(View content); yani sayfa detay bilgisi mi gösterecek yoksa güncelleme işlemi mi yapacak, bu bilgileri belirleyebiliyoruz. Add butonuna tıkladığımızda ise Visual Studio'nun ihtiyacımız olan View nesnesini otomatik olarak oluşturacağını göreceğiz. (Views klasörü altına Urun, bu klasörün altına da Detay.aspx adında bir dosya eklenir)

mvc_add_view
Resim: Hazırladığımız action metodu üzerinden gerekli olan View nesnesini kolay şekilde oluşturabiliriz

Detay.aspx sayfasını incelediğimizde Product nesnesine göre özel bir arayüz hazırlandığını ve ürünün bilgilerinin de Model adındaki nesne üzerinden taşındığını görebiliriz. Uygulamayı çalıştırıp Urun/Detay/3 şeklindeki bir URL'yi talep edersek aşağıdaki gibi bir çıktı alırız.

mvc_urun_detay
Resim: Urun/Detay/3 şeklindeki bir URL talebinde karşılaştığımız sayfa

URL'deki id değerine göre ürün bilgilerini sayfamızda görebildik. Eğer sayfanın görünümünü değiştirmek istersek Views/Urun/Detay.aspx sayfası içerisinde gerekli değişiklikleri yapabiliriz.

Böylece genel hatlarıyla bir ASP.NET MVC projesini, bu projeye Controller, Model ve View nesnelerini nasıl ekleyebileceğimizi gördük.

29 Mart 2009 Pazar 13:29

Yorum - RSSYorumlar (2)

Etiket:
Kategori: ASP.NET

facebook'da Paylaş   twitter'da Paylaş   friendfeed'de Paylaş   del.icio.us'da Paylaş   stumpleupon'da Paylaş   Permalink

ASP.NET MVC Framework’e Genel Bakış

Model View Controller tasarım deseni(design pattern) bir uygulamanın model, view ve controller adında üç temel parça içerisinde geliştirilmesi esasına dayanmaktadır. Projenin bu şekilde üç parçaya ayrılmasının temel sebebi katmanlı mimari uygulamalarında da benimsediğimiz, proje bileşenlerinin birbirinden ayrıştırılabilecek katmanlarda, birbirlerinden bağımsız şekilde geliştirilebilmesini sağlamaktır(Seperation of Concerns). Bu esneklik projenin kolayca genişletilebilmesi, yazılan kodların kolayca güncellenebilmesini ve test işlemlerinin kolayca yapılabilmesini de beraberinde getirmektedir. Aslında burada bahsettiğimiz unsurlar büyük çaplı birçok projede ihtiyaç olan konulardır. Bu tarz ihtiyaçları gidermek için günümüzde çoğu uygulama platformunda farklı teknikler kullanarak, tasarım desenleri uygulanarak geliştirilen projenin çok sağlam temeller üzerine inşa edilmesi sağlanmaktadır. Web uygulamalarına baktığımız zaman özellikle son yıllarda MVC deseninin oldukça benimsendiği, başta Ruby ve Java gibi çoğu platformda kullanıldığı görülmektedir. Artan bu talep üzerine Microsoft'ta ASP.NET MVC Framework'ü geliştirerek artık web uygulamalarında ASP.NET Web Form'larından sonra ikinci bir uygulama geliştirme modeli sunmuştur. Aslında ASP.NET MVC'nin temelleri 2007 yılının ikinci yarısına dayanmaktadır. Microsoft yaklaşık 1.5 yıllık süreçte Preview, CTP ve Beta sürümleriyle çıkardığı bu ürünü yaklaşık 10 farklı sürümle geliştirmiş ve nihayi olarak Mart 2009 içerisinde resmi olarak piyasaya sürmüştür.

MVC desenin temel kullanım amaçlarından ve piyasadaki yerinden bahsettikten sonra dilerseniz ASP.NET uygulamalarına nasıl farklı bir tarz getirdiğine bakalım. ASP.NET MVC uygulamalarını vadettiği en önemli noktalar; test edilebilir, kolay genişletilebilir, Routing ile daha okunabilir URL adreslerine sahip, daha sade HTML çıktıya sahip uygulamalar tasarlanabilmesidir. Yine MVC uygulamalarının WebForm’lara naziren daha hızlı çalışacağını söylemekte pek yanlış olmayacaktır.

Öncelikli olarak MVC Framework'ü ilk kez inceleyecek olanları belki de çok şaşırtacak birkaç durumdan bahsetmekte fayda var. Zira ASP.NET MVC web uygulamalarında çok farklı bir geliştirme tekniği kullanılmakta ve klasik ASP.NET uygulamalarının belki de en sevilen bazı özelliklerinden burada mahrum kalınmaktadır. ASP.NET MVC uygulamalarında PostBack ve Olay(Event) tabanlı geliştirme mekanizması yoktur, sunucu kontrolleri(GridView, Calendar, FileUpload... vb) kullanılamaz ve ViewState nesnesi yoktur! İlk kez duyanlar için oldukça şaşırtıcı olsa gerek. Akla gelen ilk soru belki de şu olacaktır; sunucu kontrolleri ve olay tabanlı geliştirme yoksa ben nasıl uygulama geliştireceğim, yoksa ASP.NET öncesinde kullanılan ASP'ye mi dönüş yapıyoruz? Tabi ki hayır, ama kodlama mantığına baktığımız zaman büyük benzerliklerin olacağını da göreceğiz. Yine MVC Framework'ün gelişim sürecinde ASP.NET ekibi Visual Studio'ya eklediği birçok araç sayesinde kod yazımını oldukça azaltarak WebForm'lardakine benzer kolaylıkları programcılara sağlamakta. Burada vurgulanması gereken en önemli noktalardan birisi de şu olacaktır; ASP.NET MVC uygulamalarında yukarıda bahsettiğimiz özellikleri kullanamıyoruz, ancak uygulama tamamen ASP.NET Runtime'ı üzerinde çalışıyor. Yani siz uygulamayı geliştirirken arka planda .NET Framework'ün geriye kalan tüm nimetlerini kullanabiliyorsunuz. İşin .NET tarafında bu durumlar söz konusu. İyi ama nedir bu Model View Controller, herbir parçanın görevi nedir diye soracak olursanız, gelin bu kısmı ayrı bir paragrafta ele alalım. Öncelikle bu üç bileşene kısaca göz atalım:

- Controller: Uygulamaya gelen talepleri yöneten katmandır. Controller nesneleri içerisinde action adı verilen metotlar bulunur ve bu metotların görevleri gelen talepleri uygun View ve Model nesneleri üzerinden değerlendirmektir. Gelen sayfa talepleri URL bazlı olarak çözümleyerek ilgili action metoduna iletir. Controller içerisinde yer alan action metotları projenin View ve Model bileşenleriyle doğrudan iletişime geçebilir.
- Model: Uygulamanın veriye erişim ve iş mantığını gerçekleştiren nesnelerini saklayan kısmıdır. LINQ to SQL(.dbml) ile Entity Framework(.edmx) dosyaları veya DataTable, DataSet, DataReader gibi nesnelerle veri taşıyan tiplerimiz bu katmanda yer almaktadır. Veriye erişim gerektiğinde Controller ve View bu kısımda yer alan nesnelerle iletişime geçebilir.
- View: Projenin UI dosyaları burada yer almaktadır. Master sayfalar, .aspx sayfalar, user control'ler, yani kullanıcının göreceği dosyalar projenin bu kısmında yer alacaktır.

İstemciden gelen talepler Controller içerisinde yer alan nesneler tarafından yakalanır. İlgili Controller gelen URL'i çözümleyerek kendi içerisindeki uygun action metodunu çağırır. Eğer ilgili action'da veri ile ilgili işlemler yapılacaksa Model kısmındaki nesnelere erişilir, getirilen veriler ilgili View nesnesine gönderilir. Eğer veri ile ilgili işlemler yoksa talep doğrudan yine View nesnesine gönderilebilir. View ise sayfa içeriğini render ederek HTML çıktıyı oluşturur ve çıktı istemciye gönderilir. Aslında genel işleyişe baktığımızda standart ASP.NET uygulamalarından çok farklı olduğu dikkatimizi çekiyor. MVC uygulamalarında talep doğrudan .aspx sayfalarına iletilmez, Controller içerisinde yer alan action metotları ilgili sayfaya gidilmesini ve üretilen HTML çıktının istemciye iletilmesini sağlar. Dolayısıyla burada istemci doğrudan sayfalarla iletişime geçmez, ancak yazılarn farklı URL'ler ile sayfalara gidebilir. Aşağıdaki şekilde istemciden gelen bir talebin sunucu tarafında nasıl ele alınacağı görülmektedir.

ASP.NET MVC Uygulamasında Bir Talebin İşleyişi 
Resim: İstemciden gelen bir sayfa talebinin sunucuda işleniş yolu

ASP.NET MVC uygulamaları URL'in uygun formatta çözümlenmesiyle çalışmaktadır. Burada URL Routing adını verdiğimiz bir kavramla karşılaşıyoruz aslında. ASP.NET MVC'de standart olarak controller/action/id şeklindeki dizilimle URL'lere gelen talepler değerlendirilir. Bunun dışında farklı URL formatları da belirlenebilir, kendi özel URL formatlarınızı belirleyebilir, hatta URL içerisine yazılacak değerlere kısıtlamalar(constraints) dahi getirebilirsiniz. (URL Routing ile ilgili eğer fırsatım olursa ayrıca detaylı bir makale yazmayı planlıyorum) Products/Edit/3 şeklindeki bir URL'de Products controller'ı, Edit action'ı ve 3 ise id'yi simgeler. Aşağıda bazı URL formatları ve taleplerin izleyecekleri yollar listelenmiştir.

URL İzlenecek yol
site.com/Products/ ProductsController içerisinde yer alan Index action metodu çağrılır. Eğer adreste bir action belirtilmemişse varsayılan action Index olur.
site.com/Products/List ProductsController içerisinde yer alan List action metodu çağrılır.
site.com/Products/Edit/3 ProductsController içerisinde yer alan Edit action metodu çağrılır. Bu metoda 3 değeri id parametresi olarak gönderilir.
site.com/Categories/Details/4 CategoriesController içerisinde yer alan Details action metodu çağrılır. Bu metoda 4 değeri parametre olarak gönderilir.
site.com/Categories/Edit/4 CategoriesController içerisinde yer alan Edit action metodu çağrılır. Bu metoda 4 değeri parametre olarak gönderilir.

Aslında buraya kadar ASP.NET MVC'nin genel yapısından ve WebForm'lar üzerinde uygulama geliştiren programcılara yabancı gelebilecek özelliklerinden bahsettik. Bir sonraki yazımda örnek bir uygulama üzerinde de konuşuyor olacağız. http://www.microsoft.com/downloads/details.aspx?FamilyID=53289097-73ce-43bf-b6a6-35e00103cb4b&displaylang=en adresinden ASP.NET MVC için gerekli dosyayı bilgisayarınıza yükleyip kurabilirsiniz. Kurulum için .NET Framework 3.5 SP1 ve Visual Studio 2008 SP1'in bilgisayarınızda önceden kurulu olması gerekir. ASP.NET versiyonlamasıyla ilgili olarakta önemli bir noktayı belirtmekte fayda var; ASP.NET MVC Framework ASP.NET 4.0 ile mimariyle bütünleşik hale gelecek.

27 Mart 2009 Cuma 08:34

Yorum - RSSYorumlar (1)

Etiket:

facebook'da Paylaş   twitter'da Paylaş   friendfeed'de Paylaş   del.icio.us'da Paylaş   stumpleupon'da Paylaş   Permalink

ASP.NET Development Server’ın Çalışma Portunu Sabitlemek

ASP.NET Development Server Visual Studio 2005’ten beri kullanabildiğimiz ve IIS’e bağımlı kalmaksınız web projelerimizi çalıştırabilmemizi sağlayan bir sunucu uygulaması. Her proje için dinamik olarak oluşturulan bir port numarası üzerinde projemizi çalıştıran bu küçük uygulama gerçekten geliştirme aşamasında işimizi oldukça kolaylaştırıyor. Ancak File System üzerinde geliştirilen bu web projelerini farklı bilgisayara taşıdığımızda port numarası değişeceği için sorunlar çıkabilir. Özellikle bir proje içerisinde birden fazla Web Site ve Web Service projeleriniz varsa ve bu uygulamalar birbirleriyle konuşuyorsa projenin başka bir makinaya taşınması durumunda farklılaşacak port numaraları nedeniyle projenizde konfigürasyon değişiklikleri yapmanız gerekebilir. Yine Visual Studio’da File System modunda oluşturulan bir projeyi test etmek için IIS’e taşıdığımız zaman da port numaraları önem taşıyabilir. Neyse sıkıntımız belli, çokta uzatmadan port numarasını nasıl sabitleriz, bir bakalım.

Öncelikle projeyi normal şekilde başlatalım.

Görüldüğü gibi Development Server belirlediği bir port numarası üzerinden çalışmaya başladı. İşte bu noktada bu adresi başka bir uygulama içerisinde saklarsam(ki bir Web Service’in adresini sıklıkla biryerlerde saklarız) projeyi farklı bir yere taşıdığımda sıkıntılar çıkabilir.  

Aslında yapılacak işlem çok kolay olmasına rağmen biraz gizli bir yolu vardır diyebiliriz. Nasıl mı gizli? Akla ilk gelen adım projemizin üzerine sağ tıklayıp özelliklerine gitmek olacaktır, ama orada bulamayacaksınız. Biraz yaklaştık ama bulamadık:) Solution Explorer’da projemizi seçtikten sonra Properties penceresini açarsak(sağ tıkladığımızda gelen pencere değil) buradaki iki seçenek işimizi görecek. Bu pencereye, projemizi seçtikten sonra F4 tuşuna basarakta ulaşabilirsiniz.
 

Properties penceresinden ilk olarak Use dynamic ports değerini False, ardından Port number değerine de istediğimiz sabit port numarasının değerini girmemiz yeterli olacaktır. Projeyi bundan sonra çalıştırdığımızda Development Server hep seçilen port numarasını kullanacaktır.

21 Mart 2009 Cumartesi 00:27

Yorum - RSSYorumlar (7)

Kategori: ASP.NET | Visual Studio

facebook'da Paylaş   twitter'da Paylaş   friendfeed'de Paylaş   del.icio.us'da Paylaş   stumpleupon'da Paylaş   Permalink

Bağlantılar



Takip Et

RSS Feed twitter friendfeed

Seminer/Webiner Programım

  • Seminer-WebinerASP.NET 4.0 WebForms Yenilikleri (Microsoft İstanbul Ofisi)
    29 Mayıs 2010

  • Seminer-WebinerVisual Studio 2010 Yenilikleri (Osmangazi Üniversitesi)
    15 Mayıs 2010

  • Seminer-WebinerASP.NET AJAX ile Zengin Internet Uygulamaları Geliştirme (Microsoft İstanbul Ofisi)
    3 Mayıs 2010

>> Etkinlik Takvimi