Controller bölümü kullanıcılardan gelen isteklerin cevaplandığı ilk bölümdür. Öncelikle diğer kısımları görmezden gelip sadece Controller üzerine odaklanacağız. Öncelikle mevcut kodları yorum etiketleri ile kapatalım. Aşağıdaki Index ve Sayfa2 metotlarını ekleyelim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using MVC1.Models; namespace MVC1.Controllers { public class HomeController : Controller { public string Index(){ return "Merhaba My Controller"; } public string Sayfa2(){ return "Sayfa 2 çağrıldı"; } } } |
Şimdi tarayıcımızdan aşağıdaki istekleri yapalım.
- https://localhost:5001/
- https://localhost:5001/Home/
- https://localhost:5001/Home/Index
- https://localhost:5001/Home/Sayfa2
İlk üç çağırma işlemi Index() metodu içinde dönen değeri gösterir. Son istek ise Sayfa2() metodu içinde değeri döndürür.
Bir controller’daki her public metot, bir HTTP isteği olarak çağrılabilir. Yukarıdaki örnekte, her iki yöntem de bir string döndürür. Bu isteklerin hepsi HTTP GET isteğidir.
MVC, gelen her URL bağlı olarak uygun controller’ı çağırır. MVC tarafından kullanılan URL yönlendirme (URL routing) mantığı hangi kodun çağrılacağı belirlemek için aşağıdaki gibi bir format kullanır:
/[Controller]/[ActionName]/[Parameters]
Yönlendirme formatı Startup.cs dosyasındaki Configure metodunda bulunur ve buradan ayarlanabilir.
1 2 3 4 5 6 |
app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); |
Burada, controller default değeri “Home” ve action değeri “Index”tir. “id?” bölümü ise gelecek parametrelere ayrılmıştır. Niye ilk üç URL’nin aynı controller metodunu çalıştırdığı belli olmuştur. Ancak, parametre döndürmesin yapan bir URL’miz yok. Başka bir deyişle,
- https://localhost:5001/Home/ParametreliSayfa?par1=Merhaba&par2=MVC
şeklinde bir isteğe cevap verecek controller yazalım. Controller’ın metot ismi ParametreliSayfa olacak. Aşağıdaki kod ile parametreleri alabiliriz.
1 2 3 4 5 6 7 |
… using System.Text.Encodings.Web; … public string ParametreliSayfa(string par1, string par2="MVC2"){ return HtmlEncoder.Default.Encode($"1: {par1}, 2: {par2}"); } … |
Eğer par2 değişkenine hiç veri gönderilmezse geçerli değer olarak MVC2 string değerini alır. HtmlEncoder.Default.Encode kötü amaçlı girdilerden korunmak içindir (Özellikle Javascript saldırılarından). Bunun için ayrıca using bölümüne yukarıdaki namespace eklenmelidir. PHP’de bir URL’deki etiketleri çekmek için özel metotlar kullanıyorduk. Burada ise map (haritalama) işlemini MVC’nin kendisi yapar. Parametrelerle ilişkiyi kendisi çözer.
MVC’nin C’sini çözdük. Tabii görsel sayfalar yapmak için string kısmını manuel elle HTML yazmamız çok zor olur. Şimdi V’e gelelim.