Takip Edin

ASP.NET MVC

MVC’de Yönlendirme

asp.net mvc'de yönlendirme - öne çıkan görsel

ASP.NET Web Forms uygulamasında her URL’nin belirli bir .aspx dosyasıyla eşleşmesi gerekir. Örneğin, http: //domain/productsinfo.aspx isimli bir URL, tarayıcıya bir yanıt oluşturmak için kod ve biçimlendirme içeren productsinfo.aspx dosyasıyla eşleşmelidir.

ASP.NET, her URL’yi fiziksel bir dosyayla eşleme ihtiyacını ortadan kaldırmak için yönlendirme(Routing) özelliğini tanıttı. Yönlendirme, istek işleyiciyle eşleşen bir URL modeli tanımlamamızı sağlar. Bu istek işleyicisi bir dosya veya sınıf olabilir. ASP.NET Webform uygulamasında istek işleyicisi, .aspx dosyası; MVC’de ise Controller sınıfı ve Action metodudur. Örneğin, http://domain/products, ASP.NET Webforms’ta http://domain/productsinfo.aspx ile eşleşebilir ve aynı URL, MVC’de Product Controller ve Index action metoduyla eşleşebilir.

İpucu: Yönlendirme, MVC çerçevesine özgü değildir. ASP.NET Webform uygulaması veya MVC uygulaması ile de kullanılabilir.

Yol(Route)

Yol, URL modelini ve işleyici bilgilerini tanımlar. Bir uygulamanın tüm yapılandırılmış yolları, yol tablosunda depolanır ve gelen bir istek için uygun bir işleyici sınıfı ya da dosyasını belirlemek üzere yönlendirme motoru tarafından kullanılır.

Aşağıdaki şekil, yönlendirme sürecini göstermektedir:

asp.net mvc'de routing işlemi
Şekil-1: MVC'de Yönlendirme

Bir Yolu Yapılandırma

Her MVC uygulaması, MVC çerçevesi tarafından varsayılan olarak yapılandırılan en az bir yolu yapılandırmalıdır(kaydetmelidir).  App_Start klasörü altındaki RouteConfig.cs ‘de bulunan RouteConfig sınıfına bir yol kaydedebilirsiniz. Aşağıdaki şekil, RouteConfig sınıfında bir yolun nasıl yapılandırıldığını göstermektedir:

MVC'de yolları yapılandırmak
Şekil-2: MVC'de Yolları Yapılandırma

Yukarıdaki resimde görüldüğü gibi yol, RouteCollection ‘ın MapRoute() ( yol adının “Default”, URL modelinin “{controller}/{action}/{id}” ve controller, action metodu ile id parametresi için varsayılan parametrelerin olduğu yer ) uzantı yöntemini kullanarak yapılandırılır. Eğer gelen URL isteğinde belirtilmemişse defaults, hangi denetleyicinin, action metodunun veya id parametresinin değerinin kullanılması gerektiğini belirtir.

RouteCollection sınıfının MapRoute() yöntemini kullanarak aynı şekilde diğer yolları da yapılandırabilirsiniz. RouteCollection, aslında RouteTable sınıfının bir özelliğidir.

URL Modeli

URL modeli, yalnızca URL’deki alan adı kısmından sonra değerlendirilir. Örneğin,“{controller}/{action}/{id}” URL modeli, localhost:1234/{controller}/{action}/{id} şeklinde görünür. “localhost:1234/” ten sonra gelen herhangi bir şey controller adı olarak düşünülür. Aynı şekilde, controller adından sonra gelen herhangi bir şey action adı, onun ardından gelense id parametresinin değeri olarak değerlendirilir.

asp.net mvc'de url modeli
Şekil-3: URL Modeli

Eğer URL, alan adından sonra herhangi bir şey içermiyorsa varsayılan controller ve action metodu, isteği işleyecektir. Örneğin; http://localhost:1234, varsayılan parametrede yapılandırıldığı gibi HomeController ve Index() metodu tarafından işlenecektir.

Aşağıdaki tablo, farklı URL’leri yukarıdaki varsayılan yol göz önünde bulundurularak hangi controller, action metodu ve id parametresinin işleyeceğini göstermektedir:

URLControllerActionId
http://localhost/homeHomeControllerIndexnull
http://localhost/home/index/123HomeControllerIndex123
http://localhost/home/aboutHomeControllerAboutnull
http://localhost/home/contactHomeControllerContactnull
http://localhost/productProductControllerIndexnull
http://localhost/product/edit/123ProductControllerEdit123

Birden Fazla Yol

MapRoute uzantı metodunu kullanarak özel bir yol yapılandırabilirsiniz. MapRoute’ta yol adı ve URL modeli olan en az iki parametre bulundurmanız gerekmektedir. Defaults parametresi isteğe bağlıdır.

Farklı isimlerle birden çok özel yol kaydedebilirsiniz. Aşağıda, “Product” yolunu kaydettiğimiz yerde bulunan örneği ele alalım:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Product",
            url: "products/{id}",
            defaults: new { controller = "Product", action = "Index"}
        );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
} 

Yukarıdaki kodda gösterildiği gibi, Product yolu için URL modeli, alanadı/products ile başlayan tüm URL’lerin ProductController tarafından işlenmesi gerektiğini belirten products/{id} şeklindedir. products ile başlayan her URL’nin daima ProductController sınıfının Index() action’ını kullanmasını istediğimizden URL modelinde {action} ‘ı belirtmediğimize dikkat edin. Burada, alanadı/products ‘tan başlayan herhangi bir URL isteğini işlemek için varsayılan controller ve action’ı belirttik.

MVC çerçevesi, her yolu sırayla değerlendirir. İlk yapılandırılmış yolla başlar ve gelen URL, yolun URL modelini karşılamıyorsa, ikinci yolu değerlendirir ve bu böyle devam eder. Yukarıdaki örnekte, yönlendirme motoru ilk olarak Product yolunu değerlendirecek ve gelen URL, /products ile başlamadığı takdirde varsayılan yol olan ikinci yolu dikkate alacaktır.

Aşağıdaki tablo, farklı URL’lerin Product yoluna nasıl eşleneceğini göstermektedir:

URLControllerActionId
http://localhost/product/123ProductControllerIndex123
http://localhost/product/index/123ProductControllerIndex123
http://localhost/product?Id=123ProductControllerIndex123

Yol Kısıtlamaları

Yol kısıtlamalarını yapılandırarak parametre değeri üzerinde sınırlamalar uygulayabilirsiniz. Örneğin; aşağıdaki yol, id değerinin sayısal olması gerektiğine dair id parametresi üzerinde bir sınırlama uygular.

routes.MapRoute(
        name: "Product",
        url: "product/{id}/{name}/{standardId}",
        defaults: new { controller = "Product", action = "Index", id = UrlParameter.Optional, name = UrlParameter.Optional, standardId = UrlParameter.Optional },
        constraints: new { id = @"\d+" }
    );

Yukarıda belirtilen yolun id parametresi için sayısal olmayan bir değer verirseniz istek, başka bir yol tarafından işlenecek, eşleşen bir yol olmadığı takdirde de “The resource could not be found” hatası döndürülecektir.

Yolları Kaydetme

Şimdi, tüm yolları RouteConfig sınıfında yapılandırdıktan sonra, tüm yollarınızı RouteTable’a dahil etmesi için Global.asax içindeki Application_Start() olayına RouteConfig’i kaydetmeniz gerekir.

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        RouteConfig.RegisterRoutes(RouteTable.Routes);
    }
}

Aşağıdaki şekil, yol kayıt sürecini göstermektedir:

asp.net mvc'de yol(route) kaydetme süreci
Şekil-4: Yolu Kaydetme

Sonuç olarak yönlendirme, MVC çerçevesinde önemli bir rol oynar.

Hatırlanması Gereken Noktalar
1. Yönlendirme(routing), MVC çerçevesinde önemli bir rol oynar. Yönlendirme, URL’yi fiziksel bir dosya ya da sınıfla(MVC’de controller sınıfı) eşler.
2. Yol(route), URL modeli ve işleyici bilgisini içerir. URL modeli, alan adından sonra başlar.
3. Yollar, RouteConfig sınıfında yapılandırılabilir. Birden çok özel yol da yapılandırılabilir.
4. Yol kısıtlamaları, parametrelerin değeri üzerinde sınırlamalar uygular.
5. Yol, Global.asax.cs dosyasındaki Application_Start olayına kaydedilmelidir.

Devamını oku

Popüler

error: Content is protected !!