Makale Özeti

Bu yazımızda MVC Framework 'ün temel yapı taşlarından Controller katmanını detaylı bir şekilde incelemeye çalışıyoruz.

Makale

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.

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.

Controller ‘ı Anlamak

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;

http://localhost/Urun/Index/7 başarılı bir gösterim olabilir.

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.

Basit olarak UrunController.cs sınıfına göz atalım;

Controller\UrunController.cs
using System.Web.Mvc;
using System.Web.Mvc.Ajax;

namespace MvcApplication1.Controllers
{
    public class UrunController : Controller
    {
         //
         // GET: /Urun/

         public ActionResult Index()
         {
              // Add action logic here
              return View();
          }

     }
}

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.

Action ‘ı Anlamak

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.

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.

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.

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.

Action Result ‘ı Anlamak

Controller da kullanılan action lar action result ile geri dönüşleri vardır.

1. ViewResult: HTML ve Markup sunar (Represent).
2. EmptyResult: Sunumu sonlandırır.
3. RedirectResult: Sunulan linki yeni bir adrese yönlendirmeye yarar
4. JsonResult: Java Script Object ‘leri Ajax ile birlikte kullanılabilir bir duruma getirir.
5. JavaScriptResult: Java Script leri sayfada kullanılabilir biçimde sunar.
6. ContentResult: Metin içeriği sunar.
7. FileContentResult: İndirilebilir dosyaları sunar (Binary içerik ile).
8. FilePathResult: İndirilebilir dosyaları sunar (Dosya yolu ile).
9. FileStreamResult: İndirilebilir dosyaları sunar (Stream dosyalar için).
View result kullanılarak hazırlanmış bir metoda göz atalım.

Controller\KitapController.cs
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class KitapController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
    }
}

Action sonucunda ViewResult ile HTML view ‘e dönecektir. Index() metodunda view adına göre geri dönüşü yapacaktır.

ViewResult() ve View() metotları Controller sınıfında türetilerek oluşturulmuştur. Controller ‘ın temel sınıfları;

1. View: Action sonucunda ViewResult ‘a yönlendirilir.
2. Redirect: Action sonucunda RedirectResult ‘a yönlendirilir.
3. RedirectToAction: Action sonucundan RedirectToRouteResult ‘a yönlendirilir (action yardımıyla yönlendirilir).
4. RedirectToRoute: Action sonucunda RedirectToRouteResult ‘a yönlendirilir (route yardımıyla yönlendirilir).
5. Json: JsonResult döndürür.
6. JavaScriptResult: JavaScriptResult döndürür.
7. Content: Action işlemi sonucunda ActionResult döndürür.

İ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.

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.

Controller\KullaniciController.cs
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class KullaniciController : Controller
    {
        public ActionResult Details(int? id)
        {
              if (!id.HasValue)
                   return RedirectToAction("Index");
              return View();
        }

        public ActionResult Index()
        {
            return View();
        }
    }
}

Şimdi vereceğimiz örnek ise içeriklerin gösterimi ile ilgili. Index metodunda ContentResult metodunu kullanarak belirtilen içerisi göstermektedir.

Controller\DurumController.cs
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class DurumController : Controller
    {
        public ActionResult Index()
        {
            return Content("Merhaba Dunya!!!");
        }
    }
}

İç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.

Controller\IsController.cs
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class IsController : Controller
    {
        public DateTime Index()
        {
             return DateTime.Now;
        }
    }
}

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.

Herkese mutlu günler diliyorum.

Turhal Temizer
info@turhaltemizer.com
http://turhal.blogspot.com