Bu yazımda MVC'de yer alan View ve MasterPage için Codebehind tanımlamayı ve kullanmayı göstermeye çalışacağım. MVC projesi oluşturup, projeye MVC View ve MVC MasterPage eklediğimizde sadece sayfalar eklenir. Asp.net'te olduğu gibi kod sayfası gelmez. Ancak bu yazımda bu kod sayfasını kendimiz oluşturup View'larda ve Masterpage'de yazdığımız classları nasıl kullanacağımızı göstereceğim. Böylece MVC projelerimizde tıpkı Asp.net'te olduğu gibi kod sayfalarını kullanıp kodlamalarımızı yapabileceğiz. Ayrıca kontroller için tüm eventları tanımlayıp kullanabiliyoruz, View (sayfa) için özel fonksiyonlar tanımlayıp kullanabileceğiz. Ancak button_click veya data kontrollerinin eventları gibi işlemleri MVC ile kontrol etmek MVC mantığına ters. Codebehind tanımlama ve kullanma işlemini event yönetimi için kullanmamalıyız. Bu yöntemi veri yükleme ve kodlamalarımızı kod sayafasında yapmak için tercih etmeliyiz.
Öncelikle MVC projesinde View dediğimiz yani oluşturduğumuz bir sayfa için CodeBehind tanımlaya bakalım. View'lar
System.Web.Mvc altında yer alan
ViewPage class'ından türerler. Kendi yazdığımız View'ı kontrol edecek olan class'ta
ViewPage sınıfından inherit (miras) olmalı. View için yazdığımız örnek kodlarımız ve kullanımı şu şekilde olmalı.
// Server taraflı kodlarımız ve tanımladığımız class'ımız
namespace mvc_proje.Models
{
public partial class sayfa : System.Web.Mvc.ViewPage
{
protected void Page_Load(object sender, EventArgs e)
{
Response.Write("View için Page_Load eventı çalıştı.");
}
// Burada tüm eventları tanımlayıp kontrol edebiliriz. (Buttonclick, vb.)
// Ancak MVC mantığına ters.
// Sadece page_load eventı gibi eventları kullanmak
// veya metot tanımlayıp kullanmak mantıklı.
}
}
// View'ın Html bölümünde şu şekilde yazdığımız class'ı bildiriyoruz.
<%@ Page Language="C#" Inherits="mvc_proje.Models.sayfa" %>
Bu şekilde View için yani sayfa için Page_Load eventı gibi eventları (Asp.net sayfasında yer alan tüm eventları) kullanabiliyoruz. Hatta button veya diğer kontrollerin de eventlarını kontrol edebiliyoruz. Ancak bunu MVC ile yapmak MVC mantığına ters. Eğer kontrollerin eventlarını MVC ile kontrol edeceksek Asp.net'te olduğu gibi bu kontrolleri form tagı arasına (runat=server özelliği olan formun arasına) koymalıyız. Bunun yanında eventları kontrol ettiğimiz için ViewState açılmış oluyor. Yani MVC mantığıyla uyuşmayan bir iş yapmış oluyoruz. Bunun için CodeBehind tanımlama ve kullanma işini sadece sayfaların Page_Load eventı veya sayfaya ait özel metotları tanımlayıp kullanmak için tercih etmeliyiz. Buton veya diğer kontrollerin eventlarını MVC'deki Controller ile yönetmeliyiz.
View dışında MasterPage için de CodeBehind tanımlayıp kullanabiliyoruz. MVC'de MasterPage'ler
System.Web.Mvc altında yer alan
ViewMasterPage sınıfından türerler. Bizim MasterPage için yazacağımız class'ta
ViewMasterPage sınıfından inherit (miras) olmalı. Aşağıda MasterPage için yazdığımız class'ı ve bu class'ı kullanmayı görebilirsiniz.
// Server taraflı kodlarımız ve tanımladığımız class'ımız
namespace mvc_proje.Models
{
public partial class master : System.Web.Mvc.ViewMasterPage
{
protected void Page_Load(object sender, EventArgs e)
{
Response.Write("MasterPage için Page_Load eventı çalıştı.");
}
}
}
// MasterPage'in Html bölümünde şu şekilde yazdığımız class'ı bildiriyoruz.
<%@ Master Language="C#" Inherits="mvc_proje.Models.master" %>
Bu şekilde de MasterPage için CodeBehind tanımlayıp kullanabiliyoruz.
MVC ile hazırladığım kendi bloğumda masterpage için kolay kodlama yapabilmek için bu şekilde kendi class'larımı yazdım. View'larda ise sadece sitemap, rss gibi sayfalar için class tanımlayıp kullandım. Bu türlü işlemler için veya Html bölümde server taraflı kodlama yapmayı sevmeyenler için CodeBehind tanımlama ve kullanma yöntemi oldukça güzel bir yöntem. Ancak kontrollerin eventları için CodeBehind kullanmamalıyız. (Kontrollerin eventlarını Controller'de kontrol etmeliyiz.)
Bu şekilde hem View'da hem de MasterPage'de kodlamalar gerçekleştirebiliriz. Daha önce bu konuyla ilgili soru soran arkadaşlara ve MVC ile ilgilenen arkadaşlara faydalı olacağını umut ediyorum.
Önemli Not : MVC projemizde View ve MasterPage için tanımlayıp kullandığımız class'larda Visual Studio'nun bir Bug'ı (hatası) var. Sizler de farkedeceksinizki kendi yazdığımız View veya MasterPage'e yüklediğimiz class'ta sayfada bulunan kontroller Intellisense ile gözükmüyor. Ayrıca kontrol ID'lerini el ile yazıp işlemleri tanımladıktan sonra Build işlemini yapınca Visual Studio hata veriyor. Ancak yaptığımız herşey doğru ve sorunsuzca çalışmakta. Bu Visual Studio'nun bir Bug'ı. Bu problemi sadece MVC projesinde değil Asp.net projesinde de yaşadım. Belki güncelleştirmeler ile bu Bug giderilmiş olabilir. Projemizi hataya rağmen çalıştırdığımızda çalıştığını görebiliriz.
İyi Çalışmalar.