16 Ekim 2016 Pazar

MVC - Action ve Model Attributes (Nitelikler)



Action Name (Action İsmi) : Action metodunun, oluşturulduğundan farklı bir isimlede çağrılması gerektiği durumlarda bu özellik ile action metodu parametrelerde tanımlanan isimle çağırabiliriz.

HttpPost (View'den controller'a veri gönderme ) : Tanımlandığı action metodun, view'daki formdan post işlemiyle ulaşılabilmesini sağlayan attribute'tur.

HttpGet (View'den controller'a veri gönderme ) : Tanımlandığı action metodun, view'daki formdan post işlemiyle ulaşılabilmesini sağlayan attribute'tur.
- Parametrede gönderilen  değerler querystring'te (link üzerinde) bulunduğu için get işlemi kullanılır.

Bind (View'dan alınacak verilerilerin kontrolü) : Tanımlandığı model sınıfında view'dan verilerin hangilerinin alınıp alınmayacağı tanımlanır. Parametrede Include kullanırsanız, tanımlanan özelliklerdeki (property) veriler alınırken diğer property'lerdeki veriler alınmaz. Exclude kullanırsanız, tanımlanan özellikerin dışındaki veriler alırnırken, tanımlanan property'lerdi veriler alınmaz.

OutputCache (Önbellekleme) :  

RequireHttps (Https protokolünü zorunlu kılma) :


13 Ekim 2016 Perşembe

MVC - Action ve Action Metodları - Kullanımı



Action Nedir ?

Asp.Net MVC projelerinde, kullanıcı arayüzleri (View'lar) içindeki bilgilerin controller sınıfları içinde yönetildiği  metodlardır. Action metodlaryla View'e veri gönderme, View'ı çalıştırma, View'ın formu içindeki bilgileri alma ve veritabanına kaydetme gibi bir çok işlem gerçekleştirilmektedir.

Action metodların geri döndürebileceği veri türleri.

1.ActionResult :

public class PagesController : Controller
{

  WEBSiteContext DBConnection = new WEBSiteContext();

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

}

2.RedirectResult : Sayfa yönlendirme

public class PagesController : Controller
{

  WEBSiteContext DBConnection = new WEBSiteContext();

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

[HttpPost]
public RedirectResult Ekle (Pages NewData)
{
  DBConnection.Pages.Add(NewData);
  DBConnection.SaveChanges();
  return Redirect("http://www.ahmetcelik.com.tr");
}

}

3.JsonResult : Json sonucu döndürme

public class PagesController : Controller
{

  WEBSiteContext DBConnection = new WEBSiteContext();

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

[HttpPost]
public RedirectResult Ekle (Pages NewData)
{
  DBConnection.Pages.Add(NewData);
  DBConnection.SaveChanges();
  return Redirect("http://www.ahmetcelik.com.tr");
}

[HttpPost]
public JsonResult ListeleJson()
{
 var Pages = DBConnection.Pages.ToList();
 return Json(Pages);
}

}

4. FileResult : Dosya dönderme

Not: En çok kullanılan geri dönüş türleri (Sınıflar) FilePathResult, FileStreamResult


public class PagesController : Controller
{

  WEBSiteContext DBConnection = new WEBSiteContext();

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

[HttpPost]
public RedirectResult Ekle (Pages NewData)
{
  DBConnection.Pages.Add(NewData);
  DBConnection.SaveChanges();
  return Redirect("http://www.ahmetcelik.com.tr");
}

[HttpPost]
public JsonResult ListeleJson()
{
 var Pages = DBConnection.Pages.ToList();
 return Json(Pages);
}

public FileResult PageInfo()
{
 string _MeFilePath =Server.MapPath("/UploadFiles/xxx.pdf");
 string _MeFileType = "application/pdf";
 return new FilePathResult (_MeFilePath, _MeFileType);
}

}


5. RedirectToRouteResult : Farklı bir action metoda yönlendirme

public class PagesController : Controller
{

WEBSiteContext DBConnection = new WEBSiteContext();

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

[HttpPost]
public RedirectResult Ekle (Pages NewData)
{
  DBConnection.Pages.Add(NewData);
  DBConnection.SaveChanges();
  return Redirect("http://www.ahmetcelik.com.tr");
}

[HttpPost]
public JsonResult ListeleJson()
{
 var Pages = DBConnection.Pages.ToList();
 return Json(Pages);
}

public FileResult PageInfo()
{
 string _MeFilePath =Server.MapPath("/UploadFiles/xxx.pdf");
 string _MeFileType = "application/pdf";
 return new FilePathResult (_MeFilePath, _MeFileType);
}

public RedirectToRouteResult MeRedirect(Pages NewData)
{
  DBConnection.Pages.Add(NewData);
  DBConnection.SaveChanges();
  return new RedirectToRouteResult (new RouteValueDictionary(new {action = "PageInfo", controller = "Pages"}));
}

}

6. PartialViewResult : Partial View Döndürme


public class PagesController : Controller
{

WEBSiteContext DBConnection = new WEBSiteContext();

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

[HttpPost]
public RedirectResult Ekle (Pages NewData)
{
  DBConnection.Pages.Add(NewData);
  DBConnection.SaveChanges();
  return Redirect("http://www.ahmetcelik.com.tr");
}

[HttpPost]
public JsonResult ListeleJson()
{
 var Pages = DBConnection.Pages.ToList();
 return Json(Pages);
}

public FileResult PageInfo()
{
 string _MeFilePath =Server.MapPath("/UploadFiles/xxx.pdf");
 string _MeFileType = "application/pdf";
 return new FilePathResult (_MeFilePath, _MeFileType);
}


public RedirectToRouteResult MeRedirect(Pages NewData)
{
DBConnection.Pages.Add(NewData);
DBConnection.SaveChanges();

return new RedirectToRouteResult (new RouteValueDictionary(new {action = "PageInfo", controller = "Pages"}));
}
public PartialViewResult MeContent (int ID)
{
   var _MeContents = (from b in DBConnection.Contents where b.PID == ID select b).ToList();
            
  return PartialView(_MeContents);

}

}

7. JavaScriptResult : Javascript döndürme

MVC-5 Action'dan Farklı İsimde View Çağırma




KURAL : Bir view'ın çalıştırılabilmesi (View'a tarayıcı üzerinden erişilebilmesi ) için View'ın, Controller içersinde Action'nın tanımlanması gerekmektedir. Bu tanımla yapılmadı ise, oluşturacağınız view'ı çalıştıramazsınız.



KURAL : Tarayıcı üzerinden bir link çalıştırıldığında, linki ControllerAdı/ActionAdı  şeklinde yazmanız gerekmektedir. Sunucuya gelen istekler öncelikle Controller'a ulaşacağı için, istemci tarafından (client-tarayıcıdan gelen) isteklerin hangi Controller'a (ControllerAdı) ve Controller içindeki hangi Action metoduna (ActionAdı) gideceği bilgisi, linkten alınmaktadır. Bu sebeple oluşturulan bir view'ı birdan fazla  Action metoduna tanımlayıp taracı üzerinden çalıştırabiliriz.

public class ContentController : Controller
    {
        
        public ActionResult Listele()
        {
            return View(ContentData.Contents);
        }


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

        [HttpPost] //Attribute
        public ActionResult  Ekle(Content NewContent)
        {

            if (ModelState.IsValid)
            {
                ContentData.Contents.Add(NewContent);
                return RedirectToAction("Listele");
            }
            else
            {
                return View();
            }
        }

        public ActionResult Duzenle(int ID)
        {
            var content = ContentData.Contents.Where(o => o.ID == ID).FirstOrDefault();

            return View(content);
        }
        [HttpPost]
        public ActionResult Duzenle(Content content)
        {
            Content EditContent = ContentData.Contents.Where(o => o.ID == content.ID).FirstOrDefault();

            EditContent.CName = content.CName;
            EditContent.CSummary = content.CSummary;
            EditContent.CInfo = content.CInfo;
            EditContent.CDate = content.CDate;
            EditContent.CNumber = content.CNumber;

            return RedirectToAction("Listele");
        }

        public ActionResult Sil(int ID)
        {
            var content = ContentData.Contents.Where(o => o.ID == ID).FirstOrDefault();
            return View(content);
        }

        [HttpPost]
        public ActionResult Sil(Content content)
        {
            Content DeleteContent = ContentData.Contents.Where(o => o.ID == content.ID).FirstOrDefault();
            ContentData.Contents.Remove(DeleteContent);
            return RedirectToAction("Listele");
        }

        public ActionResult Detay(int ID)
        {
            var content = ContentData.Contents.Where(o => o.ID == ID).FirstOrDefault();
            return View(content);
        }

}

10 Ekim 2016 Pazartesi

Entity Framework Nedir, Neye benzer, Ne değildir.

Entity Framework üzerine konuşmaya başlamadan önce ORM (object Relation Mapping) kavramının ne olduğunu bir bakmanızda fayda var.

Entity Framework, Microdoft'un runtime'da sorgu hatalarını en aza indirmeyi planladığı ve birçok noktada kolaylık sağlan LINQ (Entity Framework)

Entity Framework, bir ORM araçıdır. Veritabanındaki tablolara doğrudan TSQL sorgularıyla erişip
işlem yapmak yerine, nesneler üzerinden işlem yapmayı sağlar Bu nesneler Entity Model'lerini oluştururlar.

Entity Framework'te veritabanı işlemlerini yönetecek merkezi bir sınıf oluşturulması gerekmektedir. Bu sınıf sayesinde, oluşturulan veri modelleri üzerinden veritabanı işlemleri gerçekleştirilmektedir.

Oluşturacagımız sınıfın, Entity Framework Data Context işlemlerini yapabilmesi için System.Data.Entity.DbContext sınıfının kalıtımını alması gerekmektedir.




ORM (object Relation Mapping) kavramı üzerine notlar.


ORM (object Relation Mapping) veri tabanında oluşan herbir nesneye (tabloya) karşılık uygulama tarafında bir nesne oluşturma işidir. Bu işlem bazı frameworklerde ara yazılımlar sayesinde (ORM Tools), bazı frameworklerde ise elle gerçekleştirilmektedir.

ORM ile CRUD (create,read,update,delete) işlemleri daha kolay yapılmaktadır. Bu işlemler direk ORM üzerinde gerçekleşmektedir.

ORM araçlarının en önemli faydası, kod yazımını kısaltmak veya kolaylaştırmaktan öte, yazılım bakımını kolaylaştırmasıdır. Veri tabanı temelli uygulamalarda, kodun 1/3´ü veri tabanı erişimine yöneliktir. Veri tabanındaki bir kolonunun tipinin değişmesi, yeni bir kolon eklenmesi gibi değişiklikler, bütün veri erişim kodunu tekrar gözden geçirmeyi gerektirir. ORM ile bu gözden geçirmeden çok yüksek oranda tasarruf edilir. ORM kullanılan yazılımlarda, veri tabanındaki değişikliklerde yapılması gereken sadece nesnelerle tabloların birbirine nasıl eşleştirildiğinin (mapping) gözden geçirilmesidir.


MVC - 5 Action Metod İçinde Custom Model Binder Kullanımı

Kendi oluşturduğumuz custom model binder sınıfını Action içerisinde nasıl kullanacağımızı öğrenelim.

Controller Klasörüne sağ tıklayıp yeni bir controller oluşturalım ve adını MEController  yapalım


oluşan index metoduna sağ tıklayıp Add View seçeneğini tıklayarak, Empety (witout Model) olarak bir view oluşturunuz. Ve içerisine aşağıdaki şekilde düzenleyiniz.


Daha sonra [HttpPost]  olarak yeni bir index Action oluşturunuz. Parametre olarak custom model binder kullanılacağı için  öncelikle hangi model binderin kullanılacağını tanımlamamız gerekmektedir.

Bunun için Model Binder Attribute'unu çağırıyoruz.  Attribute'un parametresinde kullanacağımız model binder'in (MEModelBinder) türünü (Type) gönderiyoruz ve devamında model binder'in geridönderdiği veri  türünden olan değişkeni tanımlıyoruz (bu örnekte int).

Index([ModelBinder(typeof(MEModelBinder))] int ID)



View'i çalıştırıp test edebiliriz.


MVC 5 - Kullanıcı Tanımlı (Custom) Model Binder Oluşturma

Varsayılan model binder yerine kime zaman kendi oluşturacağımız model binder'lar yazılım geliştirme sırasında işinizi kolaylaştırabilir.

Projemize ModelBinders adında yeni klasör ekleyip, içerisinde MEModelBinder isminde bir class oluşturalım.

Not: Bir sınıfı model binder olarak tanımlamanın iki yolu vardır.


  1.  Sınıfa, varsayılan olarak model binder olan DefaultModelBinder sınıfının katılımını verebiliriz.
  2. Sınıfa, IModelBinder interface'i implement edebilirsiniz.
Bu örneğimizde IModelBinder  interface'i üzerinde işlem yapacağız. MEModelBinder sınıfına IModelBinder interface'nin kalıtımını veriniz. ardından interface'in BindModel metodunu oluşturunuz.


throw satırını silip kodlamaya başlayabiliriz.

View üzerindeki verilere erişmek için, View'den gelen HttpRequest nesnesine ulaşmamız gerekmektedir. Bu nesneye controllercontext nesnesinin HttpContext özelliğinin Request özelliği ile ulaşıyoruz.