2453

Asp.Net Core 7.0 ile Sıfırdan İleri Seviye Web Geliştirme

Asp.Net Controllers

Bu dersimizde asp.net controller nedir, öğrenelim.

Asp.Net Controller

Boş bir asp.net projesi oluşturduğumuzdan dolayı hangi proje geliştirme desenini kullanacağımızı belirtiyor olmamız gerekiyor. Seçeneklerimiz Asp.net Razor Pages ve Asp.net Mvc desenleridir. Biz mvc desenini kullanacağız. Dolayısıyla Program.cs dosyasında AddControllersWithViews() extension metodu ile mvc desenini kullanacağımızı belirtiyoruz.

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
var app = builder.Build();
app.Run();

Asp.net mvc projelerine gelen ilk talebi karşılayan yapı controller sınıfıdır. İlk olarak projemize HomeController isminde bir controller ekleyelim. Proje ismine sağ tıklayarak "Controllers" isminde yeni bir klasör ekleyiniz. Tüm controller sınıfları bu klasörde olacak. 

asp.net controller

asp.net controller

asp.net controller

asp.net controller

Boş yeni bir asp.net controller eklediğimizde controller sınıfının Controller sınıfından türetildiğini görüyoruz. Yani bir controller olma özelliklerinin hepsi Controller sınıfından türetilen HomeController sınıfına kalıtım yoluyla aktarılmış olur.

 public class HomeController : Controller
 {
      public IActionResult Index()
      {
          return View();
      }
 }

HomeController Index() isminde bir metoda sahip olur. Bu metot action metot olarak isimlendirilir. Uygulamaya gelen her talep ilgili controller tarafından karşılanır ve kendi içerisinde ise talep ilgili action metoduna aktarılır. 

Ancak bu yönlendirmenin yapılabilmesi için projenin geçerli bir routing şemasına sahip olması gerekiyor.

Routing Şeması

Program.cs dosyamızda bir routing şeması ekleyelim.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllersWithViews();

var app = builder.Build();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller}/{action}/{id?}");

app.Run();

MapControllerRoute ile yeni bir routing şemasını ekleyebiliriz. MapControllerRoute() name ve pattern isminde iki parametreye sahip.

name: şemaya bir isim veriyoruz.

pattern: url şemasını temsil eder.

pattern: "{controller}/{action}/{id?}"

Örneğimizde 3 bölümden oluşan bir url şeması ekliyoruz. {controller} ve {action} zorunlu {id?} ise isteğe bağlıdır yani boş geçilebilir. ? işareti ilgili bölümün isteğe bağlı olduğunu belirtiyor.

Bu şemaya karşılık gelebilecek bazı url talepleri şu şekilde olabilir.

Örnek:

http://localhost:5041/home/index     => homecontroller altındaki index action metoduna gider.

http://localhost:5041/home/contact    => homecontroller altındaki contact action metoduna gider.

http://localhost:5041/products/list      => productscontroller altındaki list action metoduna gider.

http://localhost:5041/products/details/5  => productscontroller altındaki details action metoduna gider ve details action metoduna id parametresi olarak 5 değeri gönderilir.

{controller} => url şemasındaki ilk bölüm controller ismine karşılık geliyor. Örneğin; HomeController' a yönlenmek için kullanılması gereken url "http://localhost:5041/home" olacaktır. Yani controller ismi olarak sadece home kısmı alınır.

{action} => url şemasının 2.bölümü controller altındaki action metot ismine karşılık gelir.

{id?} => url şemasının 3.bölümünü oluşturur. ? işaretinden dolayı isteğe bağlıdır. 

Controller' dan Cevap Döndürme

Eklenen controller' da Index() isminde bir action metodu mevcut ve bu metot geriye IActionResult tipinde bir cevap döndürür ancak bu aşamaya geçmeden önce metottan geriye string bir bilgi döndürelim. 

 public class HomeController : Controller
 {
      public string Index()
      {
          return "home/index";
      }

      public string List()
      {
          return "home/list";
      }

      public string Details(int id)
      {
          return "home/details:" + id;
      }
 }

Uygulayı F5 ile çalıştıralım ve ekran görüntülerini kontrol edelim.

asp.net controller

asp.net controller

asp.net controller

Peki buraya kadar güzel ancak uygulamaya "http://localhost:5041" ile bir talep geldiğinde de varsayılan bir controller altındaki action metodu bize cevap göndermiş olsa güzel olur. Dolayısıyla url şemasını aşağıdaki gibi güncelleyelim.

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

{controller=Home} => Eğer controller ismi ProductsController ise bu durumda bu url karşılanır ancak controller ismi yoksa yani url "http://localhost:5041" bu şekilde ise bu durumda HomeController altındaki Index action metodu bize cevap gönderecektir.

{action=Index} => Eğer action ismi belirtilmediyse bu durumda ilgili controller altındaki Index() action metoduna yönlendirilecektir.

asp.net controller

asp.net controller

Bu routing şemasına default routing şema yani varsayılan routing şeması denilir. Peki bir sonraki dersimizde ise controller' dan string bir değer döndürmek yerine bir html sayfasını döndürelim. 

Projeyi indirmek için tıklayınız.