Global.asax Applicarion_End, Applicarion_Start, Session_End, Session_Start

22 Ağu

Global.asx dosyası içinde oturum açıldığı ve kapandığı sırada ya da uygulama ayağa kalktığında veya sonlandığında gerçekleşen ve açıklanmayı bekleyen bazı olaylar vardır. Bunlardan birkaçını açıklamaya çalışalım.

protected void Application_Start()

{

System.Diagnostics.Debug.WriteLine(“Application_started”);

 

AreaRegistration.RegisterAllAreas();

 

RegisterRoutes(RouteTable.Routes);

}

 

protected void Session_End(object sender, EventArgs e)

{

System.Diagnostics.Debug.WriteLine(“Session_End”);

}

 

protected void Session_Start(object sender, EventArgs e)

{

System.Diagnostics.Debug.WriteLine(“Session_Start”);

}

 

protected void Application_End()

{

System.Diagnostics.Debug.WriteLine(“Application_ended”);

}

 

Application_Start() metodu uygulama ilk çalıştırıldığında tetiklenecektir. Yani uygulamanın ApplicationDomain’i yaratıldığında oluşturulur. Her .Net Process’i default olarak bir tane Application domain’i içerir; bu application domain CLR tarafından işlemin başlatılması ile otomatik olarak yaratılır.

Application_End() metodu uygulama son bulduğunda tetiklenecektir.         Yani uygulamamız ApplicationDomain’den çıkarıldığında çalışacaktır.

Session_Start() metodu uygulamamıza bir istek geldiğinde tetiklenecektir. Daha basit bir anlatımla kullanıcı siteye girdiğinde çalışacaktır.

Session_End() metodunu kullanıcı hareketleriyle yakalamak imkansızdır. Yani kullanıcı siteye girdi ve browser’ı kapattı. Browser kapandığında Session_End metodu çalışmaz. Çünkü browser kapanması sunucuya bir istek göndermeyecek. Dolayısıyla istek olmadığı için cevapta olmayacaktır. Bir session server tarafında varsayılan olarak 20 dakika tutulur. Kullanıcı 20 dakika boyunca hiçbir işlem yapmazssa session otomatik olarak sonlandırılır ve Session_End() metodu çalışır.

Asp.net MVC Handling Unknown Actions

22 Ağu

Bu yazımızda controller sınıfımızdaki action metodları içinde bulunmayan bir action çağrıldığında bu çağrıyı yakalayıp duruma göre kullanıcıya mesaj verme işleminin nasıl yapılacağı konusuna değiniyor olacağız.

Controller sınıfları HandleUnknownAction() adında protected bir metoda sahiptir.

protected virtual void HandleUnknownAction(string actionName);

Bu metod bir action metodu çağrıldığında eğer istenen action bulunamazssa otomatik olarak devreye girer.örneğin browser üzerinden (/Product/olmayanMetod ) şeklinde olmayan bir action çağrıldığında HandleUnknownAction() metodu çalışacaktır.

Normalde olmayanMetod çağrıldığında metod 404 hatası fırlatmalıdır. Ancak biz HandleUnknownAction() metodunu ezerek kullanıcıya düzgün mesaj bildirimleri ile hataları gösterebiliriz. Özel oluşturduğumuz hata sayfasına yönlendirebiliriz.

    [HandleError]

public class HomeController : Controller

{

public ActionResult Index()       {

ViewData[“Message”] = “Welcome to ASP.NET MVC!”;

return View();

}

protected override void HandleUnknownAction(string actionName)

{

ViewData[“actionName”] = actionName;

View(“Unknown”).ExecuteResult(this.ControllerContext);

}

}

 

Asp.net MVC ActionName Attribute

21 Ağu

ActionName attribute bir action metodunun farklı isimlerle adlandırılmasını sağlar. Bu işlem iki farklı yolla yapılır.

Birinci yöntem olarak overload edilmiş, yani aynı isimdeki iki metodu birbirinden ayırmak için kullanabiliriz. Örneğin Product controller Details() adında iki metoda sahip olsun. İlk Details() metodu integer tipinde id parametresi alıyor olsun. İkinci Details() metodu parametre almasın. Bu durumda iki metodu birbirinden ayırmak için ActionName attribute kullanılabilir.

İkinci yöntem olarak ise farklı isimdeki metodları aynı isimle çağırmak isteyebiliriz. Yani ilk yöntemin tam tersi bir durum olabilir.


[ActionName(“Edit”)]
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Edit_GET(Merchandise merchandiseToEdit)
{
     return View(merchandiseToEdit);
}

// POST: /Merchandise/Edit

[ActionName(“Edit”)]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit_POST(Merchandise merchandiseToEdit)
{
     try {
           return RedirectToAction(“Edit”);
         }
     catch
         {
           return View();
         }
}

Dikkat: Bir sınıf içinde aynı isimde ve aynı parametreyi alan iki metod bulunamaz. Ancak aynı isimde ve aynı parametre alan iki action olabilir.

Örnekte gördüğümüz gibi iki Edit() metodundan biri HTTP GET operasyonu, diğeri ise HTTP POST operasyonu tarafından çağrılıyor.


		

ViewData kavramı ve ViewModel Deseni

19 Ağu

ViewData yardımıyla Controller tarafından View tarafına veri geçirme işlemi

Bu yazımızda mvc ortamında kullanılan ViewModel deseni üzerinde duracağız. View katmanına Controller sınıfından ViewData, TempData, ViewBag gibi nesneler yardımıyla veri geçirebilmekteyiz. Örneğin bir dropdodwnlist bileşeninin içeriğini taşıyan kolleksiyon nesnesi bu yapılar vasıtasıyla View sayfasına taşınabilmektedir. Örneklendirmeyi NerdDinner uygulaması üzerinden yapılmaktadır.

Controller Tarafı:

public ActionResult Edit(int id) {

Dinner dinner = dinnerRepository.GetDinner(id);

ViewData[“Countries”] = new SelectList(PhoneValidator.Countries,

dinner.Country);

return View(dinner);

}

View Tarafı:

Html.DropDownList(“Country”, ViewData[“Countries”] as SelectList)

Yukarıda görüldüğü gibi ViewData nesnesi Country listesini view tarafına taşımaktadır.

ViewModel Deseni

Yukarıda bahsettiğimiz şekilde conroller sınıfından view şablonuna veri geçirmek kısa vadede pratik ve hızlı bir çözümdür. Küçük projelerde kullanılabilecek iyi bir yöntem olarak görülebilir. Fakat bu yöntemin uzun vadede bazı dezavantajları vardır. Bunlardan biri geliştirici string tabanlı bir yazım yöntemi kullandığı için (ViewData[“Countries”]) herhangi bir yazım yanlışında derleme zanında hata yakalanamayacaktır. Bir diğer dezavantaj ise ViewData nesnesinin bir SelectList tipine çevrilrme gereği duyulmasıdır.

Bu dezavantajlara alternatif olarak sunulan bir çözüm ise VievModel deseninin kullanılmasıdır. Yani View şablonunda ihtiyaç duyulacak bileşenlere göre bir sınıf oluşturularak Strongly-typed yöntemi ile View sayfası bu sınıftan üretilir. View sayfasında kullanacağımız dropdown gibi bileşenler için SelectList nesneleri yazdığımız sınıf içine tanımlanır. Controller sınıfı yardımıyla optimize edilmiş ViewModel sınıfı Viewtarafına sunulmuş olur.

public class DinnerFormViewModel {

// Properties

public Dinner Dinner { get; private set; }

public SelectList Countries { get; private set; }

// Constructor

public DinnerFormViewModel(Dinner dinner) {

Dinner = dinner;

Countries = new SelectList(PhoneValidator.Countries,

dinner.Country);

}

}

Yukarıda Nerddinner projesinden bir ViewModel örneği gösterilmiştir. Yani view şablonunda Dinner nesnesi ve country listesini tutacak birde SelectList nesnesi oluşturulmuştur.

Güncelleme işlemi için action metodlarını aşağıdaki gibi tanımlayabiliriz.

[Authorize]

public ActionResult Edit(int id)
{

Dinner dinner = dinnerRepository.GetDinner(id);

return View(new DinnerFormViewModel(dinner));

}

[AcceptVerbs(HttpVerbs.Post)]

public ActionResult Edit(int id, FormCollection collection) {

Dinner dinner = dinnerRepository.GetDinner(id);
try {

UpdateModel(dinner, “Dinner”);

dinnerRepository.Save();

return RedirectToAction(“Details”, new { id=dinner.DinnerID });

}

catch {

ModelState.AddModelErrors(dinner.GetRuleViolations());

return View(new DinnerFormViewModel(dinner));

}

}

Dikkat 1

Bu noktada dikkat etmemiz gereken önemli bir nokta: View sayfasının DinnerFormViewModel sınıfından türemiştir.

Dikkat 2

Eğer view sayfası Dinner sınıfından türetilseydi UpdateModel() metodu şu şekilde olacaktı.

UpdateModel(dinner);

Ancak DinnerFormViewModel sınıfından türetildiği için şu şekilde olmuştur.

UpdateModel(dinner, “Dinner”);

İpucu – Web projesini yayınlarken boş dizinleri de dahil etme

5 Ağu

Bugün ASP.NET MVC 3 projemi IIS7 ortamında yayınlamak istedim. Projeya sağ tıklayıp publish seçeneğini seçerek açılan pencerede gerekli alanları doldurdum ve devam ettim. Inetpub – wwwroot içerisinde projem yayınlanmıştı ve kullanıma hazırdı. Ancak projeye kullanıcıların yüklediği dosyaları tutmak için açtığım Uploads dizini wwwroot içersine yüklenmemişti. Deploy aracı boş dizinleri atlamış yayınlamamıştı.

“Bu boş dizinler nasıl yüklenecek?” sorusunu kendi kendime sordum bir süre. Çözüm boş dizinler içersine yeni bir dosya eklemekti.

Yani sunucu ortamınada yayınlamak istediğim Uploads dizininin içine bir index.html yada herhangi bir dosya ekleyip yayınla dediğimde Uploads dizini de wwwroot içine başarılı bir şekilde yayınlanmıştı.

ASP.Net MVC 3 Giriş Projesi

5 Ağu

Giriş

Visual studio development ortamını çalıştırarak işe başlıyoruz. Sürümümüz Web Developer 2010 Express olacak.

Visual studio açıldıktan sonra Start Page sayfasında New Project linkine tıklayarak yeni proje oluşturmaya başlıyoruz. Yeni proje oluşturmak için bir diğer yol ise File > New Project menüsünü tap etmektir.

İlk uygulammız

Uygulamamızı Visual Basic veya C# dillerinden birini seçerek geliştirebiliriz. Biz uygulamamızda C# dilini seçerek geliştiriyor olacağız. Visual C# sekmesini tıklayıp ASP.NET MVC 3 Web Application proje tipini  seçerek devam ediyoruz. Aynı pencere üzerinde Name, Location ve Solution Name alanları isteğe göre doldurulabilir. Proje adını “MvcMovie” olarak düzenliyor ve devam ediyoruz.


OK butonunu tıkladığımızda karşımıza aşağıdaki gibi bir pencere açılacak. New ASP.NET MVC 3 Project penceresinde template olarak Internet Application seçiyoruz, view engine olarak Razor ve Use HTML5 markup kutusunu işaretliyoruz.


OK butonuna bastığımızda Visual Web Developer Asp.net MVC projemizi varsayılan olarak ayarlayıp karşımıza getiriyor. Şu anda çalıştırılmaya hazır bir proje karşımızda duruyor.

Herhangi bir değişiklik yapmadan projeyi çalıştıralım. Debug menüsünden Start Debugging seçimini yapıyoruz. Menüde gördüğünüz gibi klavye kısayolları belirtilmiş. F5 kısayolu Debug > Start Debuging menüsünü işaret ediyor.

Visual Web Developer web tarayıcısını başlatıyor ve uygulamanın giriş sayfası açılıyor. Adres çubuğunda siteadi.com yerine localhost gözüküyor. Localhost kendi bilgisayarınızı işaret etmektedir. Visual Web Developer her çalıştığında web server tarafından rastgele bir post numarası kullanır. Aşağıdaki resimde göründüğü gibi port numarası 43246’dır.

Bu uygulamada varsayılan olarak tanımlanmış iki sayfa ve birde basit login formu mevcuttur. İlerleyen yazılarımızda uygulamanın nasıl çalıştığı konusuna değinmeye çalışacağız.

Kaynak: http://www.asp.net/mvc/tutorials/getting-started-with-mvc3-part1-cs

Asp.Net MVC Tarihi Gelişimi

5 Ağu

Bu yazıda Asp.net MVC’nin gelişimi sürecine değinmeye çalışacağız. Zamanla değişen ve gelişen özelliklerine versiyonlar halinde değiniyor olacağız.

Asp.net MVC resmi olarak 3 ana versiyon ve  1 update tool halinde yayınlanmıştır.

Asp.Net MVC 1.0

MVC’nin ilk resmi yayın tarihi 2009 yılı olmuştur. Bünyesinde barındırdığı ve günümüze kadar gelen en temel özellikleriyle piyasaya sürülmüştür. Bu özellikler aşağıdaki gibi sıralayabiliriz.

  • Mvc  yapısı, kendine özgü bir yaşam döngüsü, gelen isteklerin(request) cevaplanması (Controller katmanı) ve sonucun çıktı halinde kullanıcıya sunulması(View katmanı).
  • Routing kavramı.
  • HTML etiketlerini oluşturmayı sağlayan helper kavramı.
  • Ajax tabanlı linkler ve formlar.
  • Post edilen formların bilgilerini otomatik olarak .Net nesnelerine bağlayan Model Binder ve modele ait doğrulamaları yapan Model Validation kavramı.

Bu web alanında atılan büyük bir adımdı. Fakat kurumsal ve büyük çaplı projeler için altyapının biraz daha geliştirilmesi gerekiyordu. Neyse ki Asp.net MVC Microsoft cephesinin ilk genişletilebilir ürünüydü. Çoğu temel bileşen genişletilebilir hatta tamamen kendi oluşturacağınız yapılarla değiştirilebilir esnekliğe sahiptir. Örneğin DefaultModelBinder yeterli esnekliğe sahip değilse kendi özel Model Binder sınıfımızı geliştirebiliriz.

Asp.net MVC 2.0

2010 yılında yeni sürüm olan 2.0 sürümü yayınlandı. Bu sürümde verimliliği arttırmak ve büyük uygulamalarda bakımı ve gliştirilebilirliği kolaylaştırmak amaçlanıyordu. Yeni eklenen özellikler:

  • Server ve client tarafında attribute tabanlı Model validation.
  • Büyük uygulamara için uygulama içinde başka bir uygulama  tanımlayabilen Area kavramı.
  • Model ve attribute tabanlı olacak şekilde form ve view sayfalarını otomatik oluşturulabilen Html Templated Helpers.
  • Asenkron Controller.
  • Lambda tabanlı Html Helper.

Bu versiyonda birkaç özellik önceki versiyondaki mevcut olanlara ek olarak tanıtıldı. Bunlar:

  • Model Metadata Provider ve  Model Validation Provider.
  • Validation Attribute ve validation mantığı.
  • Custom teplates.

Asp.net MVC 3.0

2011 yılında yayınlanan bu sürümde framework üzerinde köklü bir değişkliğer gidilmedi. Sadece süsleme tarzında kullanım kolylıkları sunan birtakım düzenlemeler yapıldı. MVC3 yenilikleri şu şekilde sıralayabiliriz.

  • Visual Studio içersine dahil edilen MvcScaffolding sayesinde CRUD(Create Read Updare Delete) işlemlerini yapacak Controller ve bu metodları kullanacak View sayfaları model bazlı olarak otomatik oluşturulabiliyor.
  • JQuery, JQuery UI gibi javascript kütüphaneleri projelere otomatik dahil ediliyor ve NuGet paketleri sayesinde anında güncellenebiliyor.
  • Entity Framework Code First varsayılan data access kütüphanesi olarak sunuluyor.
  • HTML 5 desteği.
  • Razor view engine.

Tahmin

Bundan sonraki sürümde tahminimce HTML5 destekli view engine geliştirmesi yapılacak. Entity Framework code first yaklaşımı ile aktif hale gelen MvcScaffolding motoru şu anda CRUD işlemlerini direk Controller içerisinde yapıyor. Bu yüzden Repository patterne uyumsuzluk söz konusu. Bunun düzeltilerek repository patterne uyumlu hale getirileceği yine tahminlerim arasında.

 

Kaynak: http://codeclimber.net.nz/archive/2011/06/29/The-history-of-ASP-NET-MVC-so-far.aspx