mehmetduran.com - Paylaşmak Güzeldir...
Asp.net MVC'de Controller İşlemleri
Bu yazımda MVC'de Controller işlemlerinden bahsetmeye çalışacağım. Model - View - Controller üçlüsünün belki de en önemli noktası diyebiliriz. MVC ile oluşturduğumuz sistemde yapılan herşeyi kontrol ettiğimiz bir merkez olarak düşünebiliriz. Bu yazımda bu merkezde neyi nasıl yapabileceğimizden bahsedeceğim. Özellikle MVC'deki QueryString mantığını, Form işlemlerini nasıl gerçekleştirebileceğimizi ve View yönetimini ele alacağım. Bu yazımdan sonra MVC ile genel işlemleri nasıl yapabileceğimiz hakkında genel bir bilgi edinmiş olacağız. Şimdi sırayla Controller yönetme işlemlerimizi sırayla inceleyelim.

Öncelikle MVC'de sayfa olarak tanımlayabileceğimiz ".aspx" uzantılı olan View'lerin yönetimine bakalım. MVC projemizde View'ları oluşturduktan sonra erişim sağlamak ve bunları görüntüleyebilmek için Controller ile tanımlamamız gerekir. Bu işlem için aşğıdaki kodları inceleyebiliriz.

  public class HomeController : Controller
  {
    public ActionResult Index()
    {
      ViewData["icerik"] = "İlk controller örneğimiz.";
      return View();
    }
 
    public ActionResult Hakkimda()
    {
      ViewData["icerik"] = "Haber içeriği.";
      return View();
    }
  }

Yazmış olduğumuz bu kodlar ile oluşturduğumuz View'ları (sayfaları ) tanımlamış oluyoruz. Yani burada View'lar için yazdığımız metotlara Asp.net'teki Page_Load eventı diyebiliriz. Bu metotlarda işlemler yaparak View'lara veri aktarımı yapabiliriz. Bu konudaki yazımı kısa sürede sizlerle paylaşacağım. Tanımlama işleminden sonra artık View'ları tanımladığımız Routes'lara uygun olarak istekte bulunup görüntüleyebiliriz.

Controller bölümünde View'ları kontrol ederken bazı değerlere ihtiyaç duyabiliriz. Bunlardan en sık kullanılanı ise QueryString yöntemi. MVC ile QuerytString kavramı oldukça kolay ve anlaşılır. Bunun için View'ları kontrol ettiğimiz metotlarda Routes'taki Url yapısına uygun olarak parametre değerleri girmeliyiz. Örnek olarak hemen aşağıdaki kodları inceleyebilirsiniz.

  //Global.asax'ta tanımladığımız Routes'lar
  routes.MapRoute("Default", "{controller}/{action}/{sayfa}", new { controller = "Home", action = "Index", sayfa = "" });
  routes.MapRoute("Default2", "{controller}/{action}/{baslik}/{haber_id}", new { controller = "Home", action = "Index", baslik = "", haber_id = "" });
 
  public class HomeController : Controller
  {
    public ActionResult Index(int? sayfa)
    {
      // url'de sayfa parametresi varsa alınır.
      // sayfa paramtresine göre işlemler yapılır ve sonuçlar üretilir.
      ViewData["icerik"] = "sayfaya göre verileri çektiğimiz içerik.";
      return View();
    }
 
    public ActionResult Haber_Sayfasi(string baslik, int haber_id)
    {
      // url'de baslik ve haber_id değerlerini alıyoruz. Bu değerler url'de olmak zorunda.
      // bu değerlere göre işlemler yapılır. Veritabanından bilgileri almak gibi.
      ViewData["icerik"] = "Haber içeriği.";
      return View();
    }
  }

Görüldüğü gibi Index View'ında sayfa adında tanımlanan ve Url'den alınacak değeri belirtiyoruz. Parametre adının Global.asax'ta tanımladığımız Routes'a uygun olması zorunlu. Örnekte sayfa değeri için değişken sonra "?" işareti gelmekte. Bu o değerin olsada olur olmasa da olurluğunu gösteriyor. Yani kendi bloğumdan örnek verecek olursam sayfalama yaptığım bölümlerde ilk sayfalarda sayfa parametre değeri olmaz. İlk sayfada sayfa parametresinin olmamasını da kontrol ediyorum ve bu değer yoksa sayfa parametre değerini 1 yapıyorum.

Diğer Controllerda ise yani "Haber_Sayfasi" View'ını kontrol eden metotta alınması gereken 2 adet QueryString değeri bulunmakta ve bu değerler Url'de mutlaka olmak zorunda. Parametre isimlerini Global.asax dosyamızda tanımladığımız Routes'a uygun olarak veriyoruz. Bu şekilde QueryString mantığını MVC ile gerçekleştirebiliyoruz. QueryString ile aldığımız verilere göre işlemlerimizi yapıp sonuçlar elde edebiliriz ve bunları kullanıcıya sunabiliriz.

Controller bölümünde kontrol ettiğimiz en önemli işlemler Form işlemleri ve Formların sunucuya iletildiğinde yapılması gereken işlemler. MVC'de form yapısı Php'de ve klasik Asp'de olduğu gibi. Form'da bulunan textbox, textarea gibi değerleri alıp, işlem yapabilmek için aşağıda bulunan kodlardaki gibi kontroller yapabiliriz. Ayrıca Formların sunucuya iletilmesinde kullanılan method yöntemlerini de ayrı ayrı kontrol edebilmekteyiz. Aşağıdaki kodlarda örneği görebilirsiniz.

  public class HomeController : Controller
  {
    public ActionResult Iletisim()
    {
      return View();
    }
 
    [AcceptVerbs(HttpVerbs.Post)]
    [ValidateInput(true)]
    public ActionResult Iletisim(string ad_soyad, string mesaj)
    {
      // bu metoda Post edilen her istekte sayfada bulunan id'si ad_soyad ve mesaj olan
      // // elementlerin(input, textarea, vb..) değerleri alınır. Bu şekilde veri gönderimi yapabiliriz.
      // // Veritabanına veri ekleme işlemlerinde veya güncelleme işlemlerinde bu yöntem kullanılır.
      // [ValidateInput(true)] özelliği ile sayfadan post edilen verilerde html değer olamaz.
      // Asp.net'teki ValidateRequest olayının aynısıdır. False yaparsak html veri gönderilebilir.
      return View();
    }
 
    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult Deneme(string deger)
    {
      // Get metodu ile bu metoda istekte bulunabiliriz.
      // Get ile yapılan işlemlerde değerleri url'de görebiliriz.
      // deger isimli değişken değerini url'den görebilir ve bu şekilde değişken değerini alabiliriz.
      return View();
    }
 
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Arama(string aranan)
    {
      // sayfada yer alan aranan id'li elementin değeri Post işlemi ile alınıyor.
      // Alınan değer başka bir View'a veya metoda yönlendiriliyor.
      return RedirectToAction("Arama_Sonuclari/Aranan/" + aranan, "Home");
      // sonuçta gidilen adres "http://.... /Home/Arama_Sonuclari/Aranan/Aranan_Kelime" oluyor.
      // "Arama_Sonuclari" adında tanımlayacağımız Controller metodu ile arana değeri alır ve işlemleri yaparak
      // sonuçları kullanıcılara sunabiliriz.
    }
  }

Örnekte İletişim sayfasını ele aldım. Bu sayfada genelde iletişim formu kullanılır ve kullanıcılar bir takım değerler girerek karşı tarafa iletir. MVC ile bu olayı nasıl yapacağımızı anlatmak için bu örneği hazırladım. Sayfadaki herhangi bir kontrolün (textbox, textarea, vb.) değerini ise QueryString yönteminde olduğu gibi alabiliyoruz.

Controller bölümünde herhangi bir metoda yapılan istek sonrasında başka bir View'a veya metoda yönledirme yapmak için de örnek bir kod yazdım. RedirectToAction yöntemi ile MVC'de yönlendirme işlemi yapabiliyoruz. Bunu açıklamak için de arama mantığını örnek olarak verdim.

Ayrıca Controller bölümünde Formlardan gelen verileri kontrol de edebiliyoruz. Bu konuda ilerde yazı yazmaya çalışacağım. Ancak şimdi çok ihtiyaç duyulabilecek bir özelliği paylaşıyorum. Eğer formlardan gelen verilerde Html değer varsa ve html değerin olmasını veya olmamasını istiyorsak ValidateInput özelliğini kullanıyoruz. Bu Asp.net'teki ValidateRequest özelliği ile aynı.

Son olarak Ajax işlemleri için de Controller'da tanımlamalar yapabiliyoruz. Ancak bu tanımlamalar Form işlemlerini kontrol ettiğimiz metotlar ile aynı. Buradaki gibi yazımda Ajax işlemleri için yazabileceğimiz Controller örneklerini görebilirsiniz.

Controller konusunda oldukça detaylı bir yazı oldu. Ancak MVC konusunda birçok kolaylık, ip ucu içerdiğini düşünüyorum. Umarım ilgilinenlere faydası olur.

İyi Çalışmalar.
Bookmark and Share
Bu Yazıyı Değerlendirin.
Konuyla İlgili Olabilecek Diğer Yazılar Visual Studio 2008'de Copy Source as HTML Kullanma Asp.net MVC Projesini Yayınlama (Publish Etmek) Asp.net MVC'de Özel ActionResult Oluşturma jQuery Ajax ile Arama Merkezi (Uygulamam) Kullandığım Email Sınıfı (Çoklu Mail ve Dosya Gönderimi)
Yorumlar
Yorum Yaz
RSS Yorum Takibi
Mazhar Kayaoğlu 20 Temmuz Pazartesi 2009 00:37 #1
Arkdaşım beni hatırladın mı bilmiyorum ama senin sayende bu işleri baya ilerlettik.Mvc de data compenentlerine veriyi nasıl bağlıyoruz sıkıntı yaşadığım yer burası.Yardımların için gerçekten teşekkürler.Daha önceden söylediğim gibi birgün görüşmek üzere iyi çalışmalar.
Mehmet Duran 20 Temmuz Pazartesi 2009 00:43 #2
Merhaba. Maillerime bakarak hatırlayabildim. :D Bu yazının hemen ardından MVC`de Veri Taşıma Yöntemleri diye yazımı yazmayı planlıyordum. Ancak yetiştiremedim. Stajım da başlayacak. Ancak en kısa sürede bu yazımı ve MVC ile ilgili belirlediğim yazıları yazacağım. Umarım birgün mutlaka görüşürüz.
Ali Turhan 20 Temmuz Pazartesi 2009 14:41 #3
senin sitendeki url`lerde aralara tireler geliyor.Bunu mvc yapısı mı oluşturuyor.
Mehmet Duran 21 Temmuz Salı 2009 00:38 #4
Merhaba. Sitemde belirlediğim Url yapısına göre yazı başlıklarını veya belli bir stringi Url`de gösteriyorum. Ancak bu string içindeki karakterlerde - gelmesinin MVC ile iligisi yok. Sadece Url'de Türkçe karakter veya olmaması tercih edilen karakterleri yazdığım bir metot ile değiştiriyorum. Url rewrite kullanılan tüm sitelerde bu işlem gerçekleştirilir.
huseyin 13 Ocak Çarşamba 2010 13:24 #5
Merhaba.Bir view içerisinde iki textbox ve bir buton olsun.Diyelim ki biz bunları veritabanına kaydedeceğiz. Controller kısmında tam olarak ne yapmalıyız.Yani view daki textbox içerisindeki verileri nasıl controller a tasıyacagız?Kucuk bir method da olsa yeterli olur..Yoksa burda klasik asp.net deki gibi butonclick eventına mı yazmamız gerekiyor?
huseyin 13 Ocak Çarşamba 2010 13:33 #6
Bir de veritabanı bağlantısı yaparken sqlconnection gibi işlemleri actionresult altına mı yazmamız uygun olur.Yani yazınca sorunsuz çalışıyor ama mimari olark uygun mu?Yoksa bağlantı için o controller altında bağlantı sınıfı gibi bir şey mi yapılmalı?Yani siz nasıl kodluyorsunuz?Mvc nin mantığını daha iyi kavramak açısından??
Mehmet Duran 13 Ocak Çarşamba 2010 14:43 #7
Bunun için birçok yöntem mevcut. Ancak MVC normal webform mantığından biraz farklı. Burada bu şekildeki işlemler için formlar tanımlamalı ve bu formları Controller bölümünde tanımladığın action'lara göndermelisin. Controller bölümünde tanımlanan HttpPost veya HttpGet özelliği olan actionresult'lar ile view'daki kontrollerin değerlerine ulaşabilir ve bunları veritabanına veya diğer kayıt elemanlarına aktarabilirsin. Actionresult metodunda değerlere ise Request nesnesi ile, eğer bir class'ın özellikleri ise class olarak veya direk olarak metoda parametre olarak atayarak erişebilirsin.
Mehmet Duran 13 Ocak Çarşamba 2010 14:48 #8
İkinci olarak MVC (Model-View-Controller) yönteminde bu tür tanımlamaları Model kısmında yaparsan iyi olur. Linq to Sql mantığıyla çalışırsan Action metotlarında gereksiz kod yazmana gerek kalmadan Model olarak tanımladığın nesneleri ve metotları kullanarak istediğin veriyi alabilir, istediğin veriyi ekleyebilirsin. Ayrıca sadece action metotlarda değil Model'leri direk olarak View içerisinde de kullanabilirsin.
huseyin 13 Ocak Çarşamba 2010 17:26 #9
Cevap için tesekkurler.Ama tam olarak anlayamadım. Yani textbox içindeki veriyi nasıl actionresult metoduna ya da model içerisindeki bir sınıfa gönderebilirim?Soyle dusunelim metodun icerisinde string deneme diye bir degiskenimiz var Biz bunu normal aspnet ile deneme=txtAd.text diyerek yazabiliyoruz.Ama mvc ile nasıl actin result içerisindeki bir değişkene ya da model içerisindeki bir class içerisindeki değişkene bu textin degerini gönderebilirz?Kucuk bir ornek bile yeterli olur?Tesekkur..
Mehmet Duran 13 Ocak Çarşamba 2010 17:37 #10
Örnek olarak burada vermiş olduğum mail gönderme işlemini kontrol edebilirsin. Orada Mail adıyla tanımlamış olduğum action'a parametre ile sayfadaki bir takım değerleri gönderiyorum (Parametredeki isimleri textbox isimleri ile aynı). Bu kodların çalışması için form tagı altında textbox'ları koymalı ve formun action değerine yazmış olduğun action metot adını (yolunu) vermelisin.
İsim :
Site :
Yorum :

Buradan bu yazıya ait yorumları RSS olarak takip edebilirsiniz.

Bu servis ile yazılara eklenen yorumları RSS ile takip ederek konu ile ilgili başkaları tarafından yapılan yorumları veya konuyla ilgili sorduğunuz sorulara verilen cevapları görebilirsiniz.
Ne edersen kendine, edersin kendi kendine.
Bölümler
Yazılar
Arşiv
Arama
Linkler
Site İçi Arama
Son Zamanlarda Ne Yapıyorum ?
İstatistikler - Araçlar - Reklam
İstatistikler
Sayaç
Mehmet Duran | mehmetduran.com | Copyright © 2009