MVC Frameworklerin hepsinde Url Routing işlemini sistemin belkemiği olarak nitelendirebiliriz. Çünkü en başta kullanıcı açısından url adreslerinin temiz ve akılda kalır olması ve ayrıca adreslerin arama motorları tarafından daha rahat indekslenmesi için çok önemlidir. Diğer yandan web geliştirici aklından geçenleri tam olarak siteyi programlarken siteye aktarabilir. Örneğin HomeController Classının içine yazdığı bir methodun ismini özenle seçen bir programcı aynı isimle Views içine bir ASP.NET View dosyası koyar ve daha sonra Url'nin de bu şekilde olacağını ilk anda aklında canlandırdığında daha hızlı kararlar vererek düşündüklerini daha hızlı koda aktarabilir. Tabii ki bunlar tamamen ben MVC ile çalışırken edindiğim kendi izlenimlerim. Bu anlattıklarım normal ASP.NET uygulamaları için geçerli değilmi dir? Çoğu aslında onlar içinde geçerlidir. Fakat MVC yapısındaki Controller Classının methodu Views içinde View'lara denk gelir mantığı normal ASP.NET uygulamalarından çok farklı bir yapıdır. Bu şekilde kodlamasını yapan bir geliştirici dizayn kısmında neler olacağını aynı zamanda tasarlayabilir.
Şimdi neden ilk paragrafta müthiş anlatım tekniğim(!) ile bunlardan bahsettim. Çünkü girilen url adresinin Controllerdaki hangi Action Methoda denk geldiği ve Controller'ın hangi view'u kullanıcıya göndereceği Url Routing ile alakalıdır. Ayrıca Url Routing sayesinde ileride uygulamamızın URL yapısını değiştirdiğimizde bize çok yardımcı olacaktır. Böyle bir işlem yapmamız gerektiğinde Controller Class'ındaki methodlarda değişiklik yapmadan sadece Application seviyesindeki ilgili routing(mapping) kurallarını değiştirmemiz yeterli olur.
ASP.NET MVC ve URL Routing arasında bulunan ilişkiyi anlattıktan sonra ASP.NET MVC ' nin beta düzeyde; fakat RC(Release Candidate - Kararlı Sürüm Olmaya Aday) olduğunu hatırlatmak isterim. Yani çoğu hosting firması belki de şu an karalı sürüm olarak çıkmasını beklediğinden ASP.NET MVC ' ye destek vermemektedir. GoDaddy ' de shared hosting'te bu MVC routing desteği vermeyenlerden biri. Bunu localhost'ta çalışan bir MVC uygulamasını remote hosta atarken farkettim. En başta anasayfa geliyor aslında tabii burada uygulama default.aspx sayfasını IIS Server'a MVC uygulamasını başlatıldığını belirtmek için kullanıyor. Zaten işler bundan sonra ters gidiyor. Çünkü normal olarak URL'de uzantı arayan IIS Server /Home/CreateNew gibi sade MVC URL ' lerini görünce aşağıdaki hatayı verdi.
The system cannot find the file specified.
Yukarıda da belirtildiği gibi ilk olarak default.aspx(application root sayfası) yüklendiğinden ve IIS sorun çıkarmıyor; fakat sayfadaki herhangi bir URL'ye tıklandığında Routing yapılan adreste uzantı olmadığından IIS böyle bir sayfa olmadığını söyleyerek hatayı ekrana basıyor. Peki bu sorun nasıl çözülecek.
Aslında bu sorunun çözülmesi tam anlamıyla MVC olmayan uzantı barındıran URL lere yönlendirme yaparak çözülür. Burada URL routing ayarlamaları karşımıza çıkar. Bu ayarlamalar ise; ASP.NET programcılarının yakından tanıdığı Global.asax dosyasında yapılır. Dosyanın default olarak yapısı şu şekildedir:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace MVCTaskList
{
// Note: For instructions on enabling IIS6 or IIS7 classic mode,
// visit http://go.microsoft.com/?LinkId=9394801
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = "" }
);
}
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}
}
}
Bu dosya normal ASP.NET dosyalarında bütün uygulamayı ilgilendiren işlemleri barındırır.(Uygulama başlarken ya da biterken yapmak istediğimiz işlemler varsa; bu dosyadaki Application_Start ve Application_End eventlerini kullanırız.) Zaten diğer adı da ASP.NET Application File olarak geçer. Bu dosya uygulamanın root dizininde olmalıdır. Bu dosya ASP.NET MVC de ise; daha önemli bir yere sahiptir; çünkü yukarıda anlattığımız çok önemli URL Routing işlemlerini bu dosyayı kullanarak yaparız.
Örneğin yukarıdaki kod parçasında Application_Start event'i ve yardımcı bir method(RegisterRoutes) bulunur. Öncelikle Application_Start event ' i yüklenir ve daha sonra yardımcı method çalışır. Routing işini yapan bu methodtaki routes.MapRoute fonksiyonudur. Bu fonksiyonu kısaca açıklayalım:
- "Default" parametresi Route adıdır ve bu route'u diğer routelardan ayırmaya yarar.
- İkinci parametre URL'nin yapısının nasıl olacağını belirler. Önceklikle Controller adı sonra Controller'da bulunan bir action adı ve daha sonra ise; parametre olarak bir id kullanılr.
- Üçüncü ve son parametrede ise; ikincide belirlenen elemanların default değerleri verilir. Buna göre default Controller "HomeController", bu controller'da bulunan "Index" action methodu default method olur. Default id değeri ise; boştur yani değeri yoktur.
Buradan yola çıkarak /Home/Index, /Home/Create, /Home/Task/1 gibi URLler uygulama içinde var olabilir. Fakat bu tür bir Routing GoDaddy'de şu için çalışmamaktadır. En azından benim sitemi barındırdığım shared hosting hesabımda çalışmıyor. Bunun nedeni de yukarıda belirtildiği gibi IIS ' in URL'de uzantı aramasından kaynaklanır. Eğer Global.asax şu değişikliği yaparsak sorun çözülmüş olur.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace MVCTaskList
{
// Note: For instructions on enabling IIS6 or IIS7 classic mode,
// visit http://go.microsoft.com/?LinkId=9394801
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
// Routing for Godaddy :)
routes.MapRoute(
"Task",
"{controller}.aspx/{action}/{id}",
new { controller = "Home", action = "Index", id = "" }
);
}
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}
}
}
Burada düzeltme ile Routing yapılırken Server Controller'a baktığından ve Controller'da .aspx uzantısı olduğundan sorun çıkarmaz. Daha sonraki yönlendirmede ise; istenen action'a gidilir ve action'a bağlı olan View çağırılır. Tabii ki bu şekilde oluşturulmuş bir URL asıl MVC mantığına uymamaktadır. Şu an sadece uygulamayı çalıştırmak için bu şekilde bir routing ifadesi yazılmalıdır. Örnek olsun diye buradaki TaskList örneğinin C# versiyonunu yaptım ve GoDaddy'de host edilen alanıma yükleim. Uygulamayı buradan deneyebilirsiniz. Burada tek yanlış yapılabilecek durum sayfalaradaki normal linklerin ya da formların action attributelerinin gittiği linklerin yanlış oluşturulabilmesidir. Bu linklerin elle veya Html Helper Methodları kullanarak oluşturmayı sonraki yazılarda göreceğiz. Bu yazının beklediğimden daha uzun olması beni bu yola sevk etti:)
Yukarıda verdiğim bilgiler umarım yine bir GoDaddy kullanan arkadaşa yardımcı olmuştur.