Sedat Bozdoğan

Yazılım Teknolojileri

Asp.Net Mvc Controller ile Çalışmak

Merhaba Arkadaşlar,

Asp.Net ile yazılım geliştiren arkadaşların yolları genellikle Asp.Net Mvc teknolojisine düşmektedir. Asp.Net Mvc teknolojisi temel olarak Model , bir class' a karşılık gelir, Controller ; kullanıcıdan gelen isteklere cevap bölümdür ve View ise sonucun görüntülendiği ekran olarak görev yapmaktadır.Bu kavramları görsel olarak aşağıdaki şekildeki gibi görüp düşünebiliriz.

 

Bir Asp.Net Mvc Projesinin Anatomisi

Visual studio programı ile bir Asp.Net Mvc projesi oluşturduğumuzda visual studio bizim için Controllers,Models,Views klasörlerini otomatik oluşturur.Controllers klasörü içinde Controller sınıflarımız,Models klasörü içinde model sınıflarımız ve Views klasörü içinde içinde html sayfalarımız yer alıcaktır.Asp.Net 'ten daha önceden tanıdğımız Global.asax ve Web.config dosyalarımızda yine otomatik olarak oluşturulmakta.Aşağıda bahsedilen kavramların projedeki karşılıkları görünmektedir.

App_Start kalsörü içinde RouteConfig adında bir sınıfın olduğunu görmekteyiz.Bu sınıf bizim Routing Engine olarak tanıcağımız url-mapping işlemini yapan sınıftır.

Routing Engine (Yönlendirme Motoru)

Asp.Net Mvc projesi başladığında ilk olarak Global.asax.cs dosyası başlatılır ve  Application_Start() metodu çalıştırılır.

using System.Web.Mvc;
using System.Web.Routing;

namespace Controllers
{
    public class MvcApplication:System.Web..HtppApplication
    {
        protected void Application_Start()
       {
          AreaRegistration.RegisterAllAreas();
          RouteConfig.RegisterRoutes(RouteTable.Routes); /* RouteConfig sınıfının RegisterRoutes static metodu çalıştırılır.*/
       }

    }

}

App_Start klasörü içerisndeki Route Config Sınıfını inceleyelim.

using System.Web.Mvc;
using System.Web.Routing;

namespace Controllers
{
  public class RouteConfig
 { 
     public static void RegisterRoutes(RegisterCollection routes)
     {
          routes.IgnoreRoute("{resource}.axd/{*pathInfo}");// .axd 
 isteklerini engellemek için örneğin:ScriptResource.axd, WebResource.axd gibi.Bu kaynaklar uygulama dosyaları gibi fiziksel değillerdir. 
          routes.MapRoute(
                  name:"Default", //route ismi
                  url: "{controller}/{action}/{id}", //route deseni
                  defaults:new{ controller="Home",action="Index",id=UrlParamater.Optional} //route deseni ile eşleşen gerçek controller ismi,action method adı ve opsiyonel id parametresi
           ); 
     } 
 } 
}

Asp.Net Mvc bize varsayılan olarak yukarıdaki kodları vermektedir.Bu kodlar MapRoute extension method'u bizim için önem arzetmektedir.Aşağıdaki ekran görüntüsünde MapRoute Methodunun çeşitli extension methodlar ile override edilen versiyonları görüntülenmektedir.Bizim kullandığımız route ismi,yönlendirme deseni ve yönlendirme desenine verebildiğimiz varsayılan değerleri kullanan extension method olmaktadır.

Kullanıcıdan gelen Http isteklerini karşılıcak varsayılan desenimiz yönlendirme metodu tarafından karşılanmakta ve  gelen isteğe göre eşleşen Controller ile eşleştirerek gerekli action method nesnesi cevap olarak geri döndürecek şekilde bir veri akışı izlenmektedir.

Küçük Bir Örnek

Uygulamamız çalıştırdığımızda henüz bir controller oluşturmadık ve controller'a bağlı bir view'de oluşturmadık.Karşımızda aşağıdaki gibi bir ekran görüntüsü görüntülenecektir.

Yukarıdaki hatayı incelediğimizde bize Views içerisinde Home ve Shared klasörleri içinde index.aspx, index.ascx,index.cshtml ve index.vbhtml dosyalarını aradığını fakat bulamadığını söylemekdir.

Uygulamayı bu haliyle çalıştırdığımızda yuıkarıdaki gibi bir hata ekranı bizi karşılamaktadır bu hata ekranında bize Home klasörü altında index.aspx ve index.ascx aradığını fakat bulamadığını sonrasında Shared içinde aynı dosyaları aradığı sonra Home klasörü içinde index.cshtml ve index.vbhtml dosyalarını aradığını ve son olarakta shared içinde bu dosyaları aradığını söylemektedir.

Controller Oluşturmak

Contollers klasörüne sağ tıkladığımızda add>controller > Mvc 5 Controller -Empty seçeneğini seçip controller ismine Home diyebilirsiz.

böylece asp.net bizim için bir home controller oluşturacaktır.Bu controller oluşturuluyoren view içerisine yine aynı isimde bir klasör oluşturulduğunuda görebilirsiniz.Bu controller sınıfını inceleyilim

using System.Web.Mvc   //dll referansı

namespace Controllers.Controllers   
{
    public class HomeController:Controller   //Controller sınıfından miras alınan bizim oluşturduğumuz controller sınıfı
    {
        public ActionResult Index()   //Actioon Methodu
        {  
             return View(); //Geriye ViewResult döndüren fonksiyon
        }     
    }

}

Yukarıda bahsettiğim Routing Engine sonu Controller ile biten Controller sınıflarıyla eşleştirme yapar.Bu sayede Http isteğine göre Controller eşlemesi sağlanır.Oluşturduğumuz HomeController sınıfı Controller sınıfından miras almaktadır , bu sayede bizim HomeController sınıfımız ActionResult nesneleri döndürebilmektedir.En temel olarak Http istekleri action methodlar yani ActionResult nesneleri döndüren metodlar tarafından cevaplandırırlar. ActionResult sınıfı abstract bir sınıf olarak oluşturulmuş ve farklı çeşitte ActionResult Nesne tipleri bulunmaktadır.Asp.Net bize sadece ActionResult nesnesi türünden deyil ViewResult,FileResult , JsonResult gibi nesnelerine cevap olarak döndürebilmemizi sağlamaktadır.Bu nesne tipleride yine ActionResult nesnesinden türetilen daha pek çok sınıf ve nesne tipi vardır.ActionResult temel sınıf kabul edebiliriz, keza kendiside bir abstract class'dır.

 İlk olarak action methodlarımızı olurturalım.

using System.Web.Mvc;

namespace Controllers.Controllers
{
    public class HomeController:Controller // Controler sınıfından miras alan HomeControler sınıfımız
    {
          public ActionResult Index() //Action Metodumuz
         {
               return View(); //Geriye Html sonuc döndüren fonksiyonumuz
         }
    }

}

temel örnek bir Asp.Net Mvc projesinde yukarıdaki kodlarla örnek bir sayfa oluşturabilmektedir.Index action metoduna bağlı view ekranında bildiğimiz html kodları yazan bir cshtml  dosyasından ibaret.Çalıştırdığımızda ekran görüntüsü aşağıdaki gibi olucaktır.tabi view ekranına <h2> etiketleri ile İndex Sayfasına hoşgeldiniz yazmakta.

Evet yukarıdaki temiz sayfaya sahip olduk artık biraz daha örneğimizi geliştirebiliriz.Bu arada erişim adresimize bakarsak varsayılan olarak HomeController çalıştırıldığını  ve  varsayılan index action metodunun çağırıldını görebiliriz.Bunu Routing Engine bölümünde bahsetmiştik.

Şimdi örnek olarak bir model oluşturalım ve bu model nesnesi ile sayfımıza bir veri gönderelim.Gönderilen modeli sayfamızda yakalayıp ekranda görüntülenmesini sağlayalım.Daha sonrasındada örnek senaryomuza göre bir resim sınıfı olucak ve bir resim nesnesini sayfa üzerinde görünlenmesini yapacaktır.Resmi indirmek için bir link oluşturup bu linke tıklandığında FileResult tipinden bir nesne döndürerek kullanıcıya resmi indirebilmesini sağlayacağız,daha sonrada erişim yetkisi bulunmayan bir sayfayı ziyaret etmeye çalıştığında özelleştirebiliceğimiz bir Http Hata sayfayı göstereceğiz.Kodlarımızı yazmaya başlayalım.Bu örneklerimiz FileResult,ViewResult,HttpStatusCodeResult tiplerinden yararlanarak action metotolar yazacağız.

public ViewResult ViewResult()
{
    return View();
}

Yeni bir action method yazdığımızda ve View sayfasını oluşturduğumuzda geriye ViewResult olarak action metodumuzu çalıştırıp html çıktı alabildiğimizi görebilmekteyiz.Layout kullanmadık ana noktamızı action metodlara odaklanabilmemiz için.

yukarıdaki örnek çıktılarımızı verdikten sonra 

Şimdi Resim adından bir sınıf oluşturalım ve bu Resim nesnesini bağlı Viewlere bizim belirlediğimiz örnek senaryolara göre sonuçlar döndürelim.Models klasörü altında bulunan Resim class'ımızın class diagramı aşağıdaki gibidir.

public class Resim
{
   public string Name{get;set;} //Resim Adı (örn:Resim1)
   public string FileName{get;set;} //Resim Uzantılı Adı (örn:Resim1.jpg)
   public string FilePath{get;set;} //resim yolu (örn:content/uploads/Resim1.jpg)
   public string ContentType{get;set;} //Resim içerik türü(örn:"image/jpg")
}

 using Controllers.Models bildirimi yaparak Resim nesnemizi bu sınıfta kullanabiliceğimizi belirtiyoruz.

public ActionResult ResimSayfasi()
{
    Resim model=new Resim();  //Resim nesnesinin oluşturulması
    model.Name="Mvc";  //isim değerinin atanması
    model.FileName=model.Name+".png";   //dosya uzantılı adı
    model.FilePath="/Content/Uploads/"+FileName; //resim yolu
    model.ContentType="images/png"; //dosya tipi
    return View(model);  //resim nesnesinin sayfaya gönderilmesi.
}

Yukarıda ResimSayfası action metodunun örnek kodları ve açıklamarı yer almaktadır. ve HomeController sınıfımız içerisinde çalışmaktayız.

Sonrasında ResimSayfasi.cshtml dosyasına giderek gerekli düzenlemeleri yapıyoruz.

@model Controllers.Models.Resim  //Resim modelinin bildirilmesi

<!doctype> //html 5 dosyası
<head>
    <title> Resim Sayfası </title>
</head>
<body>
    <img src="@Model.FilePath" alt="@Model.Name" >
   //@Model.FilePath ile Model nesnesinin dosya uzantısı değerinin html içeriğinde okunması
//@Model.Nameile Model nesnesinin isminizin alt niteliğine atanması
</body>

View dosyasında işimiz vitti sayfamızın ekran görüntüsünü inceleyim.

şimdi bu resmi indirilebilir bir link oluşturup.Bu linke tıklandığında resmimizi indirme olayımızı aktif edelim.Bunu yapmak için action methodlardan FileResult nesnesinden yararlanacağınız.

FileResult Nesnesi ile dosya indirmek

public FileResult ResimIndir()
{
     Resim model=new Resim(); //Resim nesnesimizi oluşturduk
     model.Name="Mvc";
     model.FileName="Mvc.png";
     model.FilePath="/Content/Uploads/"+model.FileName;
     model.ContentType="imaes/png";
     return File(model.FilePath,model.ContentType,model.FileName);
//File fonksiyonununa sırasıylaparametre olarak dosya yolu,içerik tipi ve dosya ismini verdik

}

ResimSayfasi view sayfamızda ek olarak  <a href='/Home/ResimIndir' > Resim İndir </a> olarak düzenlersek linkin ve action metodun çalıştığını görebilmektyiz.

HttpStatusCodeResult nesnesi ile yetki bildirimi

action metodlardan bir diğeride HttpStatusCodeResult nesnesidir.Bu nesne bize sayfada erişim kontrolü yaptıktan sonra kullanıcıya bir Http hata kontrol sayfası göndermemizi sağlamaktadır.

public HttpStatusCodeResult YetkiKontrol()
{
     return new HttpUnautorizedResult("Bu alana erisiminiz bulunmuyor");
}

 

örneğin Resim Sayfamıza zaten yetkisi olan kullanıcıların girmesini istiyoruz ve yetkisi bulunmayanlara bir hata göndermek istiyoruz.ResimSayfasi metodumuzdaki kodlarimizda bir yönlendirme değişikliği yapalım.

public ActionResult ResimSayfasi()
{
     return RedirectToAction("YetkiKontrol");  //YetkiKontrol isminde action metoda yönlendirme işlemi
}

böylece ekran görüntüsüne baktığımızda.

kırmızı harflerle bu alana erisme yetkiniz bulunmuyor uyarısı kullanıcıya gösterilmektedir.

Bir başka örnek senaryo düşünürsek.diyelim ki sayfaya gönderilen kullanıcı isteği ile istenen içerik bulunmuyor,kullanıcıya bildirmek için yine bir hata ekranı gösterilebilir.Yine RedirectToAction( ) fonksiyonundan yararlanarak 

public ActionResult Bulunamadi()
{
   return HttpNotFound("Sonuc Yok") // Bu fonksiyon yardmıyla yine bir hata ekranını yönetebilir bir hata yazısı bildirebilriiz;
}

 

bulunamadı.

Sonuc

Bugün farklı tipte action metotlar olduğunu gördük ve küçük örneklerle incelemeye çalıştık.Kendi Controller sınıfımızı oluşturduk.Routing Engine çalışmasına bir göz attık ve httphata kontrollü mesajlar gönderdik.Bu hata mesajları öğe inceleden bakarsak fiziksel olarak sayfanın olmaması hatasından farklı yönetilebilir ve seo tarafında anlamlı hatalar olduğunu söylemekte yarar var.ViewResult,ActionResult,FileResult ve daha farklı ActionResult temel dosyasından türetilen nesneler sayfalarına gönderilebilmektedir.Bir başka yazımızda görüşmek üzere iyi günler dilerim.

Loading