Asp.Net Mvc Routing Mekanizması ve Mvc 5 ile Gelen Yenilikler

Routing

Merhaba Arkadaşlar,

Yukarıdaki resimde, bir ışıklı kavşak görmekteyiz. Işıklar sayesinde araçlar ve yayalar, gidecekleri yere güven içerisinde ulaşabilmektedirler.

Asp.Net Mvc'de Routing yapısını da, aslında bu şekilde değerlendirme imkanına sahibiz. Sitemize giren bir ziyaretçi, talep ettiği sayfaya, bizim kurduğumuz Routing mekanizması ile ulaşabilmektedir.

Asp.Net Web Forms'da bu yapı çok daha zordur. Talep edilen her sayfa, sunucuda fiziksel olarak bulunan bir sayfadır. Biz direkt olarak sayfayı adıyla çağırırız. Bu noktada Seo açısından uyumlu linkler oluşturmamızda oldukça zor olmaktadır. Url Rewrite teknikleri ile bu sorunlar aşılmaya çalışılmaktadır.

Asp.Net Mvc, piyasaya sürüldüğünde, Routing mekanizması çok beğenilmiştir. Asp.Net Mvc'de fiziksel olarak sunucuda barınan sayfalar yoktur. Ziyaretçi bir talepte bulunduğunda, Controller içerisindeki Action'u çağırır. Action istediği sonucu, istediği View parçasını geriye döndürebilir. Bu da bize ekstra güvenlik ve esneklik sağlamaktadır. Biz bunun yanında istersek, bir url'nin istediğimiz bir Action'u çalıştırmasını sağlayabiliriz. Örneğin; haberler/spor şeklinde bir linke talepte bulunulduğunda, NewsController içerisinde bulunan, Sport Action'unu çağırabiliriz. Bu kısımda tamamen özgürüz.

Küçük bir örnek üzerinden gidelim (Önceki derslerimde, yeni proje oluşturma vs. işlemleri çok detaylı, resimli olarak anlatmıştım. İncelemenizde fayda var).;

  • Visual Studio ortamında, yeni bir proje oluşturalım, adına RoutingDeneme diyelim (Mvc 5 Routing yeniliklerini de görebilmek için, Framework'u .Net Framework 4.5.1 olarak seçmemiz daha iyi olur).
  • Şablon seçiminde Mvc'yi seçip, Ok tıklayalım. Windows Azure ile ilgili bir seçenek aktif ise, pasif edelim.
  • Projemiz açıldığında, App_Start>RouteConfig.cs dosyasını açalım. RouteConfig class'ımızın içerisinde RegisterRoutes metodu mevcut.

RouteConfig Class'ı

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

            routes.MapRoute(
                name: "Default", //Yönlendirmenin adı
                url: "{controller}/{action}/{id}", //Talep olarak gelecek url yapısı
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }  //Gelen talebin
                //yönlendirileceği, Controller ve Action, varsa parametreler
            );
        }
    }
  • Yukarıda da görüldüğü üzere, sistem tarafından eklenmiş otomatik olarak gelen url talebindeki, Controller'i ve Action'u çağıran, varsa parametreyi de gönderen bir Route'miz mevcut. Bu yapı, bizim ihtiyaçlarımızı her zaman karşılamayacaktır. Bunun için kendi Route'lerimizi de yazacağız.
  • Models klasörümüze, News adında bir class ekleyelim. içeriğini aşağıdaki gibi dolduralım.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace RoutingDeneme.Models
{
    public class News
    {
        public int Id { get; set; }

        //Haberin başlığı
        public string Title { get; set; }

        //Haberin içeriği
        public string Content { get; set; }

        //Haberin eklenme tarihi
        public DateTime CreatedDate { get; set; }
    }
}
  • Haberlerimizi temsil edecek class'ımızı oluşturduktan sonra, şimdi Controller'imize yeni bir NewsController adında Controller ekleyelim. Şablon olarak Controller – Empty'i seçelim.
  • Veritabanı yerine, veri kaynağı olarak kullanmak amacıyla, haberlerin olduğu bir liste oluşturacağız. Bunun için, NewsController'in içeriğini aşağıdaki gibi hazırlayalım.
using RoutingDeneme.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace RoutingDeneme.Controllers
{
    public class NewsController : Controller
    {
        List<News> news;

        public NewsController()
        {
            news = new List<News>();
            news.Add(new News() { Content = "Yapılan seçimlerin sonuçları açıklandı.", CreatedDate = DateTime.Now, Title = "SecimSonuclari", Id = 1 });
            news.Add(new News() { Content = "Hükümetin yaptığı yeni düzenleme, cezalarda artış öngörüyor.", CreatedDate = DateTime.Now, Title = "YeniKanunDuzenlemesi", Id = 2 });
            news.Add(new News() { Content = "Milli takımımızın aldığı bu galibiyette en büyük pay kalecimizin oldu.", CreatedDate = DateTime.Now, Title = "MilliTakimGalip", Id = 3 });
        }
    }
}

Yukarıdaki kod bloğunda, öncelikle tüm metodlardan erişebilmek için List<News> news elemanını global olarak tanımladık. Ardından da, Controller'in initalizer (oluşturucu) metodunda, listemize 3 tane haber ekledik. Böylelikle elimizde bir veri kaynağı olmuş oldu.

  • Şimdi Action'larımızı oluşturmaya başlayalım. Öncelikle listemizdeki tüm haberlerimizin geldiği, GetNews Action'umuzu aşağıdaki gibi ekleyelim.
//Tüm haberleri liste halinde getirir.
        public ActionResult GetNews()
        {
            return View(news);
        }
  • Ardından da, Views>News içerisine GetNews.cshtml adlı View dosyamızı ekleyelim. ActionResult GetNews() üzerine sağ tıklayarak Add View diyelim ve ayarlarını aşağıdaki gibi yapalım.

GetNews View ayarları

  • GetNews sayfasındayken, F5 ile projemizi açtığımızda, aşağıdaki görüntüyle karşılaştık. Bu noktada görsel düzenleme ya da Türkçe'leştirme yapmayacağız. Konumuz Routing, dışına çıkmamaya gayret göstereceğim.

GetNews metodu ekran çıktısı

  • Burada adrese dikkat edecek olursak eğer, News/GetNews şeklinde görünmektedir. Yani Controller'imiz ve Action'umuz direkt adres olarak görüntülenmektedir. Çok daha karışık Action'larımız olacaktır. Bunları direkt adres çubuğunda görüntülemek, güvenlik açığıdır (metodlarımıza direkt erişim mevcut çünkü), Seo'ya uygun değildir (farklı dillerde anlaşılır linkler oluşturmak isteyeceğiz) ya da biz farklı yönlendirmeler yapmak isteyeceğiz. Öncelikle GetNews Action'umuz için bir Route yazalım.

Yeni Route Ekleme

  • App_Start>RouteConfig.cs dosyamızı açalım.
  • Default isimli Route her zaman en altta kalmalıdır. Eğer biz Route'mizi Default isimli Route'mizin altına yazacak olursak, gelen isteği Default direkt karşılayıp yönlendirmesini yapacak ve bizim Route çalışmayacaktır. Route'mizi aşağıdaki gibi Default Route'sinden önce ekleyelim.
routes.MapRoute(
                name: "GetNews",
                url: "haberler/tum-haberler",
                defaults: new { controller = "News", action = "GetNews" }
                );
  • Böylelikle adres çubuğuna, haberler/tum-haberler girildiğinde sistem, GetNews Action'ununa yönlenecektir. Şimdi projemizi çalıştırıp, localhost:…..(bu kısım sizde farklı olabilir)/haberler/tum-haberler adresine girelim. Aşağıdaki görüntüde görülebileceği gibi, haberlerimiz listelendi.

GetNews metodu Route'li ekran çıktısı

Parametreli Route Ekleme

  • Şimdi de, parametreli bir Routing ekleyelim. Verilen Id'ye göre bir haberin görüntülenmesini sağlayalım. Bunun için NewsController'e aşağıdaki Action'u ekleyelim.
//Paramatre olarak gelen id'ye göre haberi getirir.
        public ActionResult GetNew(int id)
        {
            return View(news.Where(i => i.Id == id).SingleOrDefault());
        }
  • Action'umuza aşağıdaki ayarlarla bir View sayfası ekleyelim.

GetNew View ekleme

  • Eklenen View sayfamızın içeriği aşağıdaki gibi görünmektedir.
@model RoutingDeneme.Models.News

@{
    ViewBag.Title = "GetNew";
}

<h2>GetNew</h2>

<div>
    <h4>News</h4>
    <hr />
    <dl class="dl-horizontal">
        <dt>
            @Html.DisplayNameFor(model => model.Title)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Title)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.Content)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.Content)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.CreatedDate)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.CreatedDate)
        </dd>

    </dl>
</div>
<p>
    @Html.ActionLink("Edit", "Edit", new { /* id = Model.PrimaryKey */ }) |
    @Html.ActionLink("Back to List", "Index")
</p>
  • Şimdi projemizi çalıştırıp, http://localhost:….(burası size göre farklıdır)/News/GetNew/1 şeklinde adrese gitmek istediğimizde, 1 numaralı Id'ye sahip olan haberin detayları ekrana gelecektir.

GetNew metod çıktısı

  • Şimdi bu metodumuza da bir Route yazıp, adresi anlamlı hale getirelim. App_Start>RouteConfig.cs dosyamızı açalım ve içeriğine, aşağıdaki Route metodunu ekleyelim (metodumuzu Default isimli metoddan önce eklemeyi unutmayalım).
 routes.MapRoute(
                name: "GetNew",
                url: "haberler/haber-detay/{id}",
                defaults: new { controller = "News", action = "GetNew", id = "" }
                );
  • Şimdi projemizi çalıştırıp, adres çubuğuna http://localhost:….(burası size göre farklıdır)/haberler/haber-detay/1 yazıp girdiğimizde, 1 numaralı id'ye sahip haber ekrana gelecektir.

GetNew metodu Route'li ekran çıktısı

Bu noktada parametreler ile çeşitli kombinasyonlar yapabiliriz. Örneğin {kategori}/{alt-kategori}/{id} gibi tanımlamalar yaparak, çok esnek Route'ler tanımlayabiliriz. Bu kısım tamamen ihtiyaçlarımıza göre şekillenecektir.

ROUTE'LERDE KISITLAMALAR

Regular Expressions (Düzenli İfadeler) ile Kısıtlama

Güvenlik ve doğru Route eşleşmeleri tanımlayabilmek için, Route'lerimize kısıtlamalar, filtreler tanımlayabiliriz. Böylelikle tam bir eşleşme sağlayarak, ayrıca güvenlik katmanımızın da daha sağlam olmasını sağlayabiliriz.

  • Title formatında özel bir eşleşme isteğimiz olduğunu varsayarak, NewsController'imize bir Action yazalım. 
//Parametre olarak gelen id değerine göre haberi getirir.
        public ActionResult GetNewByTitle(string id)
        {
            return View(news.Where(i => i.Title == id).SingleOrDefault());
        }

Burada gelen parametreye göre Title ile eşleşen haber ekran getirilecektir. 

Not : Parametre ismine title yerine id vermemizin sebebi, sistemde tanımlı halde gelen Default Route'sinde id parametresi tanımlı durumdadır. Buradan, Route tanımlamamız gerekliliği de, açıkça ortaya çıkmaktadır. Biz bu parametreyi Route tanımlayarak daha mantıklı hale getireceğiz.

  • Şimdi GetViewByTitle View sayfamızı da, aşağıdaki ayarlarla oluşturalım.

GetNewByTitle View sayfası ekleme

  • Şimdi ise, projemizi çalıştırarak denemelerimizi yapmaya başlayalım. Projemiz çalıştığında, adres çubuğuna  http://localhost:….(burası size göre farklıdır)/News/GetNewByTitle/MilliTakimGalip yazalım. Çıktı olarak aşağıdaki görüntüyü alacağız.

GetNewByTitle metodu ekran çıktısı

  • Buraya kadar sorun yok. Ancak bir de adres çubuğunda http://localhost:….(burası size göre farklıdır)/News/GetNewByTitle/5 yazalım. Aşağıdaki görüntüyü alacağız.

GetNewByTitle metodu rakamsal ekran çıktısı

Şimdi burada biraz düşünelim. Az evvel tam olarak ne oldu? 

Adres çubuğunda Title kısmına rakamsal bir giriş yapıldı. Metod çalıştı ve veri kaynağımızda Title=5 eşleşmesini araştırdı. Bulamadı ve ekrana veri boş geldi.

Oysa ki biz, sadece metinsel giriş yapılmasını istiyor olabiliriz. Böylelikle hatalı girişleri daha önceden engelleme imkanına sahip oluruz. Ayrıca her girilen veri, veritabanında sorgulanmayacağı için hem performans, hem de güvenlik avantajını filtreleme sayesinde sağlayacağız. Regular Expression (Düzenli İfadeler), bu konuda bizim en büyük yardımcımız olacaktır.

  • Hemen Route'mizi yazmaya başlayalım. App_Start>RouteConfig.cs dosyamızı açalım. İçerisine Default Route'sinden önce aşağıdaki Route'yi ekleyelim.
 routes.MapRoute(
                name: "GetNewByTitle",
                url: "haberler/haber-detay-baslik/{title}",
                defaults: new { controller = "News", action = "GetNewByTitle", title = "" },
                constraints: new { title = @"[a-zA-Z]+" } //Burada yönlendirmenin yapılabilmesi için
                                                  //title verisinin yalnızca metinsel olmasını şart koştuk.
                );
  • Route'mizi ekledikten sonra, GetNewByTitle Action'umuzu aşağıdaki gibi güncelleyelim.
//Parametre olarak gelen title değerine göre haberi getirir.
        public ActionResult GetNewByTitle(string title)
        {
            return View(news.Where(i => i.Title == title).SingleOrDefault());
        }
  • Şimdi hemen testlerimizi yapalım. Projeyi çalıştırıp, http://localhost:….(burası size göre farklıdır)/haberler/haber-detay-baslik/MilliTakimGalip adresine gittiğimizde aşağıdaki ekranı alacağız.

GetNewByTitle metodu Route'li ekran çıktısı

Bu ve buna benzer şekilde, çeşitli Regular Expressions'lar vasıtasıyla çok kullanışlı filtreler tanımlayabiliriz. Regular Expressions ile ilgili internette pek çok hazır kalıplar, eğitimler mevcut.

Http Metodu ile Kısıtlama

Gelen sayfa taleplerinin, Get, Post vs. olduğunda eşleşmesini sağlamak için, Http metodunu kullanabiliriz.

  • Controllers>NewsController.cs içerisine aşağıdaki Action'u ekleyelim.
//Burada listeye bir kayıt yapılmakta.
        public ActionResult SaveNew()
        {
            //id olarak listemizdeki en son eklenen id'nin sayısı bir arttırlıp kayıt yapılmaktadır.
            int id = (news.OrderByDescending(i => i.Id).SingleOrDefault().Id+1);
            news.Add(new News()
            {
                Content = "Hava olaylarındaki anormallikler dikkat çekici olmaya başladı",
                CreatedDate = DateTime.Now,
                Title = "Hava Olaylarındaki Anormallikler",
                Id = id
            });
            return View();
        }
  • Şimdi de aşağıdaki ayarlarla View'imizi ekleyelim.

SaveNew View ayarları

  • Son olarak App_Start>RouteConfig.cs dosyamıza aşağıdaki Route'yi Default isimli Route'den önce ekleyelim.
routes.MapRoute(
                name: "SaveNew",
                url: "haberler/yeni-haber",
                defaults: new { controller = "News", action = "SaveNew" },
                constraints: new { method = new HttpMethodConstraint("POST") }
                //Yalnızca Post taleplerinde eşleşecek
                );

Böylelikle gelen isteklerin yalnızca Post olaması durumunda eşleşmeyi sağlamış olduk. Bu noktada Action metodunun üzerine [HttpPost], [HttpGet] vs. Attribute'ler ekleyerek de daha kolay bir şekilde bu kısıtlamayı sağlayabiliriz. Aşağıdaki gibi;

 [HttpPost]
        //Burada listeye bir kayıt yapılmakta.
        public ActionResult SaveNew()
        {
            //id olarak listemizdeki en son eklenen id'nin sayısı bir arttırlıp kayıt yapılmaktadır.
            int id = (news.OrderByDescending(i => i.Id).SingleOrDefault().Id+1);
            news.Add(new News()
            {
                Content = "Hava olaylarındaki anormallikler dikkat çekici olmaya başladı",
                CreatedDate = DateTime.Now,
                Title = "Hava Olaylarındaki Anormallikler",
                Id = id
            });
            return View();
        }

Gelişmiş Kısıtlamalar 

Çok daha gelişmiş sınamalar yapabilmek için kullanabileceğimiz IRouteConstraint Interface'si mevcuttur. Bu Interface'den alacağımız Implementation ile bir Class yazıp, gelişkin sınamalar yapabiliriz.

Hemen inceleyelim.

  • Ana dizine RouteConstraint isimli bir klasör ekleyelim. İçerisine de TestConstraint isimli bir Class ekleyelim. Bu Class'ın içeriğini aşağıdaki gibi dolduralım.
using System.Web;
using System.Web.Routing;

namespace RoutingDeneme.RouteConstraint
{
    public class TestConstraint : IRouteConstraint //Burada IRouteConstraint'ten Implemantation alıyoruz.
    {
        //Match metodu, istediğimiz şekilde doğrulamalrı yapıp, geriye True ya da False döndürüyor,
        //dönen sonuca göre Url eşleşmesi sağlanıyor, ya da sağlanmıyor.
        public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
        {
            //Örneğimizde, kullanıcının oturum açıp, açmadığını kontrol edeceğiz.
            if (httpContext.Request.IsAuthenticated)
            {
                return true;
            }
            else
            {
                return false;
            }

        }
    }
}
  • Controllers>NewsController.cs içerisine aşağıdaki Action'umuzu ekleyelim.
//Bu alana yalnızca üyelerin girmesini istiyoruz.
        public ActionResult MemberArea()
        {
            return View();
        }
  • Yukarıda oluşturduğumuz kısıtlama kontrolünü, Route'ye ekleyeceğiz. App_Start>RouteConfig.cs dosyamıza aşağıdaki Route'yi ekleyelim.
  routes.MapRoute(
              name: "MemberArea",
              url: "uyelik",
              defaults: new { controller = "News", action = "MemberArea" },
              constraints: new { test = new TestConstraint() }
              //Test Constraint'ten yeni bir örnek çağırıp, bağlıyoruz.
              );

http://localhost:…(burası sizde farklıdır)/uyelik adresine gitmek istediğimizde, eşleşme olmayacaktır. Ancak oturum açtıysak, eşleşme olacaktır.

404 Sayfa Bulunamadı Oluşturmak

Route'lerimizde (*) parametresini kullanarak, her türlü eşleşmeyi sağlayabilmekteyiz. (*)'ın yerine ne gelirse gelsin, eşleşme sağlanacaktır. 

Şimdi bir 404 sayfası oluşturulım.

  • Controllers>NewController.cs içerisine aşağıdaki Action'u ekleyelim.
//Eğer eşleşme olmazsa bu Action çalışacaktır.
        public ActionResult NotFound()
        {
            return View();
        }
  • Ardından da AddView diyerek View sayfamızı aşağıdaki ayarlarla ekleyelim.

NotFound View ekleme

  • Sayfa içeriğini aşağıdaki gibi düzenleyelim.
@{
    ViewBag.Title = "NotFound";
}

<h2>Sayfa Bulunamadı</h2>
  • RouteConstraint klasörünün içerisine NotFoundConstraint isimli aşağıdaki Class'ı ekleyeceğiz. Bu Class'ı ekleme amacımız, eğer açılan sayfa ana sayfaysa bu eşleşmeyi pas geçip, ana sayfanın açılmasını sağlamak.
using System.Web;
using System.Web.Routing;

namespace RoutingDeneme.RouteConstraint
{
    public class NotFoundConstraint : IRouteConstraint
    {
        public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
        {
            if (httpContext.Request.RawUrl == "/")
            {
                return false;
            }
            else
            {
                return true;
            }
        }
    }
}
  • Şimdi de App_Start>RouteConfig.cs içerisine aşağıdaki Route'yi Default Route'sinden önce ekleyelim.
 routes.MapRoute(
              name: "NotFound",
              url: "{*.}",//Yıldız her ne olursa anlamına geliyor.
                //Yukarıdaki eşleşmeleri deneyip, olmadığını gördükten sonra, NotFound'a yönelecektir.
              defaults: new { controller = "News", action = "NotFound" },
              constraints: new { notFound = new NotFoundConstraint() }
              );

Route Pas Geçme

Bazı statik dosyalarımıza talep geldiğinde, bu talebin Controller – Action bazlı karşılanmasını istemeyebiliriz. Böylelikle direkt dosyaya ulaşım sağlanacaktır. Bunun için IgnoreRoute metodu kullanılmaktadır.

  • Sistemde arama motorlarının okuması için, robots.txt dosyası oluşturacağız. Bu dosya arama motorunun nasıl indeksleme yapacağını bildiren bilgilere sahiptir. Projemizin ana dizinine robots isminde bir metin belgesi (txt) ekleyelim. Bunun için, projemizin üzerine sağ tıklayıp Add>New Item diyelim. Çıkan ekranda sağ üst kısımdaki alana text yazıp, aratalım. Çıkan sonuçlarda aşağıdaki gibi Text File'yi seçelim. Dosya içeriğini doldurmamıza gerek yok.

Metin belgesi ekleme

  • Şimdi de App_Start>RouteConfig.cs dosyasını açıp aşağıdaki satırdan,

    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    hemen sonra aşağıdaki metodumuzu ekleyelim.

     routes.IgnoreRoute("robots.txt");

Artık, sitemize robots.txt talebi geldiğinde, direkt dosyamıza erişim sağlanabilecektir.

AREA'LAR İÇİN ROUTE

Sitemizde, eğer Area sistemini kullanıp parçalara ayırıyorsak, her eklediğimiz Area için …(area adı)AreaRegistration şeklinde dosya otomatik olarak oluşturulmaktadır. Biz her Area için bu dosyalara metodlar ekleme şansına sahibiz. En sonunda tüm eklediğimiz metodlar, Global.asax dosyasında çağırılan, AreaRegistration.RegisterAllAreas() metodu ile birleştirilerek, sistemde aktif hale getirilmektedir.

ASP.NET MVC 5 ROUTE YENİLİKLERİ

Asp.Net Mvc5 ile gelen bir takım yeniliklerin yanında, Route konumuza uygun olarak işleyeceğimiz, Route yeniliğine bakalım. Normalde her Action için Route yazıp, RouteConfig dosyasına ekliyoruz. Mvc 5 ile bu işlem daha da kolaylaştı ve kullanışlılığı arttırıldı.

Bundan sonra artık direkt olarak Action'un üzerine yazacağımız bir Attribute ile Route yapabiliyoruz. Bu sistemi aktif etmek için öncelikle,

  • App_Start>RouteConfig.cs dosyasının içerisine,
 //Asp.Net Mvc5 Route sistemini aktif ediyoruz.
            routes.MapMvcAttributeRoutes();

satırını ekliyoruz.

  • Projemizi derleyelim.
  • Şimdi NewController'imizin içerisine aşağıdaki Action'u ekleyelim.
public ActionResult Mvc5()
        {
            return View();
        }
  • Hemen Mvc5 isimli View sayfamızı da ekleyelim. İçeriğini aşağıdaki gibi dolduralım.

@{
    ViewBag.Title = "Mvc5";
}

<h2>Mvc5</h2>

<h3>Burada Mvc5 Yeniliklerini Test Ettik</h3>
  • Buraya kadar herşey normal. Şimdi ise Route'mizi ekleyeceğiz. Az evvel eklediğimiz Action'unun üzerine Route Attribute'mizi ekleyeceğiz. Action'umuz aşağıdaki gibi olacak.
[Route("mvc5-test")]
        public ActionResult Mvc5()
        {
            return View();
        }
  • Görüldüğü üzere çok basit bir şekilde Route tanımladık. Şimdi projeyi çalıştırıp, localhost:…..(bu kısım sizde farklı olabilir)/mvc5-test adresine gidelim. Görüldüğü üzere aşağıdaki ekran geldi.

Mvc5 yenilik ekran çıktısı

Böylelikle çok detaylı bir şekilde, Asp.Net Mvc konusunda Route'yi inceledik.

Proje dosyasını buradan indirebilirsiniz.

Hepinize kolaylıklar diliyoruz.