Route dediğimiz olay; hazırladığınız web alt yapısının internet ortamından bulunmasını sağlar. Sizin web altyapınız ne kadar özgün ise diğer kullanıcıların sizi bulması kadar kolay olacaktır. Bu bulmayı kolaylaştıran yapı da Route yapısıdır.
Klasik ASP.NET ortamındaki işleyiş şekildeki gibidir. Yani sayfa isteğiniz ASP.NET sunucusuna gidr ve size sayfa sunulur.
Oysa MVC 5 yapısında site ismi yazdığınızda route tarafından bilgiler değerlendirilerek uygun action metodunun çıktısı size iletilir. Bu da muazzam bir hız farkı doğurur.
ASp.Net MVC yapısından bir talepte bulunduğumuz zaman Controller içindeki Action çağrılır ve Action istediği sonucu istediği View parçasını geri döndürebilir. Sunucu da fiziksel olarak bir sayfa yapısı olmadı içinde esnekliğin yanı sıra güvenlik de sağlar.
Ayrıca bir Controller’ın varsayılan action’ı yerine istediğimiz bir action’ı istediğimiz bir isimle çağırabiliriz.
Varsayılan olarak RouteConfig içinde aşağıdaki ifade vardır. Bunun anlamı Home kontrolü içindeki Index action’ı yükler.
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new {
controller = "Home", action = "Index", id = UrlParameter.Optional }
Ancak biz istersek aşağıdaki gibi değiştirebiliriz. Bunun anlamı yuksel1 yazdığımız zaman(http://localhost ifadesinden sonra) direk olarak oku içindeki Index sayfasını karşımıza getirecektir.
routes.MapRoute(
name: "Default",
url: "yuksel1",
defaults: new { controller = "oku", action = "Index"}
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "User", action = "Index", id = UrlParameter.Optional }
);
}
}
MVC içinde bu zamana kadar Route özeliği varsayılan olarak "{controller}/{action}/{id}" şeklinde çalışmaktadır. Yani sayfa isteğinde bulunduğumuzda kontroller tarafından yapılacak iş en kısa yoldan yönlendirilmektedir.
Aynı olay MVC5’de de devam etmektedir. Bu yapıyı istediğimiz gibi düzenleyebilir ve çoğaltabiliriz.
MVC 5’de gelen yenilik ise bunu Action’a göre tanımlayabiliyoruz. Yani her Action için ayrı bir Route yapısı tanımlamak mümkündür. Yani Home klasörü altında bulunan bir sayfaya yüksel yazarak ulaşabilirim. Veya Home/Adres klasörü yerine Kavun/Karpuz yazarak da ulaşabiliriz. Bir nevi gerçek yolu da gizlemiş oluyoruz.
72) Bir önceki uygulamamızdan devam ediyoruz. RouteCongif.cs dosyasına aşağıda büyük harfle yazılmış ifadeyi ekliyoruz .Bu ifade; map yapmak için gerekli bir yapıdır.
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes(); //Bu eklendi
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "User", action = "Index", id = UrlParameter.Optional }
);
}
73) HomeController.cs dosyasını açarak Welcome ve zaman actionlarının başında Route ifadesini aşağıdaki gibi ekliyoruz.
[Route("kavun")]
public ActionResult Welcome()
{
ViewBag.Message = "Merhaba Dünyalı Hoş Geldin";
return View();
}
[Route("karpuz")]
public ActionResult zaman()
{
ViewBag.Message = "Zaman zaman o zaman";
return View();
}
74) Sayfayı yükleyip bu projemize geçip kavun ve karpuz yazarak olayları gözlemleyebiliriz.
Aynı zamanda linkten seçtiğimi de de gerçek yolu yerine kavun veya karpuz yazacaktır.
75) Peki bunu Home için nasıl yapacağız. Erik yazınca bu sayfa gelsin.
76) Bunun için Index Action yapısını aşağıdaki gibi yapılandırırız.
[Route("erik")]
public ActionResult Index()
{
return View();
}
77) Eğer baştan beri aynı proje içinde iseniz o zaman index.aspx sayfasında en son HyperText’in özelliklerinden Url kısmındaki home ifadesini erik ile değiştiririz.
78) Ben parametreyi RouteConfig içinden yollamayacağım. Bunun yerine daha kullanışlı bir yapı oluşturacağım. Bunun için eğer veri tabanlı bir projede çalışmıyorsanız ilk yaptığımız User yapısındaki projenizi açınız. Ardından Controllers klasörü içindeki UsersController.cs dosyasını açarak hemen başa aşağıdaki ifadeyi ekleyiniz.
namespace ders0.Controllers
{
public class UserController : Controller
{
private UserDbContext db = new UserDbContext();
public ActionResult kaynoyaz(int id)
{
return View(db.Users.Where(i => i.ID == id).SingleOrDefault());
}
…….
Yukarıda i değişkeni tanımlıyor ve bu yapıda sütun adlarını => işaretinden sonra kullanıyoruz.
Single : Tek bir eleman döndürdüğünden emin olduğunuz sorgular için kullanın,
eğer sorgu birden fazla eleman döndürecek olursa hata oluşacaktır.
SingleOrDefault : Hiç eleman dönmez ise tipin varsayılan
değerini ya da nothing değeri dönecektir. Yine birden fazla değer varsa hata
verir.
First : Dönen sorgu sonucunun ilk elemanını döndürecektir.
FirstOrDefault : Hiç eleman dönmez ise tipin varsayılan değerini ya da nothing değeri dönecektir.
79) Ardından Users klasörü üzerinde sağ tuşa basarak Add View seçeneğine tıklayalım. Ve aşağıdaki gibi yapılandırarak ekleyelim.
80) Oluşan yeni View içindeki kodlar şekildeki gibidir.
81) Projeyi yükleyerek http://localhost:numaraneyse/users/kaynoyaz/2 dediğimiz zaman 2 numaralı kayıt karşımıza gelecektir.
82) Yalnız olmayan bir numara girince sayfa çakılacaktır. Bunu önlemek için kaynoyaz.html sayfasının sonunu aşağıdaki gibi değiştirelim.
<p>
@try
{
@Html.ActionLink("Edit", "Edit", new { id = Model.ID })
}
catch
{
}
@Html.ActionLink("Back to List", "Index")
</p>
Yukarıda isterseniz bir hata sayfası oluşturarak için istediğinizi yazabilirsiniz ve hata durumunda bu sayfaya yönlendirirsiniz.
83) Daha kullanışlı bir hale getirmek için index.aspx sayfamıza bir TextBox koyarak AutoPostBack özelliğini True yapalım ve şekildeki gibi yapılandıralım.
84) TextBox1_TextChanged olayına aşağıdaki kodları yazarak çalıştıralım.
protected void TextBox1_TextChanged(object sender, EventArgs e)
{
Response.Redirect(String.Format("~\\Users\\kaynoyaz\\{0}",TextBox1.Text));
}
Eğer olmayan bir kayıt numarası girdiğiniz zaman yukardaki değerler boş gelecektir.
85) Şimdi başka bir özel sorgulama yapalım ancak başlamadan önce yukardaki örnekle bağlantılı bir şey yapalım. Dedik ki birden fazla route ve bir isim vererek hem yol gizlenebilir hem de esneklik sağlanabilir. Bunu görmek için RouteConfig.cs dosyası içinde varsayılan Route tanımlamasının üstüne aşağıdaki ifadeyi ilave edelim.(ALTINA OLMAZ!)
routes.MapRoute(
name: "y1",
url: "yuksel1",
defaults: new { controller = "User", action = "kaynoyaz",id=2 }
);
Yani son görüntü şekildeki gibi olmalı.
86) Uygulamayı çalıştırıp http://localhost:numara/yuksel1 yazdığımız zaman 2 numaralı kayıt karşımıza gelecektir.
87) Aşağıdaki yazılımları kullanarak bir URL sayfasına link verebiliriz._HomeLayout sayfasına ilave edebiliriz.
<li><a href="http://microsoft.com">Microsoft Sayfası</a></li>
Veya
<li><input id="Button1" type="button" value="Microsoft" onclick="hh()" /></li>
Ancak ikinci satırı kullanacaksak; hh scriptini aşağıdaki gibi tanımlamamız gerekir.
<script type="text/javascript">
function hh()
{
window.open("http://microsoft.com");
}
</script>
Çalıştırdığımızda görüntü şekildeki gibi olacaktır.
Bir önceki genel uygulamamızda değindiğimiz veri tabanı yapısını şimdi daha detaylı ve tane tane imceleyelim. Burada yapacağımız uygulama ile Model ve Controller yapısının işleyeni daha iyi anlayacağınızı umuyorum.
1) ders4 adı ile yeni bir Empty MVC 5 uygulaması oluşturalım.
2) Model klasörü içinde eleman isimli bir class oluşturalım.
3) İçindeki kodlar aşağıdaki gibi olsun.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace ders3.Models
{
public class eleman
{
public string Ad { get; set; }
public string Soyad { get; set; }
public int Maas { get; set; }
}
}
4) Controller klasörü içinde elemanlarController isimli boş bir kontrol oluşturalım.
5) İçinde ViewGetir isimli Action’ı aşağıdaki gibi oluşturalım.
En üste modelimi belirtmek için aşağıdaki using ifadesini koyuyoruz.
using ders4.Models; //Bunu ekledik
public ActionResult ViewGetir()
{
eleman ele = new eleman();
ele.Ad = "Alex";
ele.Soyad = "DE Souza";
ele.Maas = 20000;
ViewBag.eleman = ele;
return View("BenimView");
}
6) Blok içinde sağ tuşa basarak BenimView isimli bir View oluşturalım.
7) Bunun sonucunda BenimView şeklideki gibi oluşacaktır.
İçini aşağıdaki gibi yapılandıralım.
@{
ViewBag.Title = "BenimView";
}
<h2>BenimView</h2>
<html>
<body>
<div>
@{
ders4.Models.eleman ele = (ders4.Models.eleman)
ViewBag.eleman;
}
<b>Personel Bilgileri</b><br />
Eleman Adı : @ele.Ad @ele.Soyad <br />
Eleman Ücreti: @ele.Maas.ToString("C")
</div>
</body>
</html>
8) RouteConfig dosyasını aşağıdaki gibi yapılandıralım ve sayfayı yükleyelim.
defaults: new { controller = "elemanlar", action = "ViewGetir", id = UrlParameter.Optional }
Sayfayı yüklediğimizde görüntü şekildeki gibi olacaktır.
9) Eğer kuruş hanesi istemiyorsanız ve $ işareti çıkmasını istiyorsanız BenimView.cshtm dosyasında fiyat satırını aşağıdaki gibi değiştirmeniz gerekir.
Eleman Ücreti: @ele.Maas.ToString("N0") $
Bu uygulamada ViewBag kullanarak Model içindeki bilgileri View içine yolladık.
10) Şimdi koşul koyalım. Eğer Maaş 15000 den büyükse zemin rengi sarı değilse yeşil olsun. Bunun için BenimView.cshtm dosyasında aşağıdaki satırı iptal ediyoruz.
Eleman Ücreti: @ele.Maas.ToString("N0") $
Onun yerine aşağıdaki satırları koyuyoruz.
@if(ele.Maas>15000)
{
<span style="background-color:yellow">
Eleman Ücreti: @ele.Maas.ToString("N0") $
</span>
}
else
{
<span style="background-color:green">
Eleman Ücreti: @ele.Maas.ToString("N0") $
</span>
}
11) Çalıştırarak sonucu görelim.
12) Birde 10000 yaparak deneyelim.
Esasında bu yapıyı önceki uygulamalarımızda yaptık. Code ile veri tabanını tanımladık. Daha sonra Context yardımı ile ilişkiye geçtik ve veri alışverişi sağladık. Şimdi grafiksel olarak daha kısa yoldan aynı işlemi yapmaya çalışacağız.
Ben ders4 uygulamasından devam ediyorum, isterseniz yeni bir uygulama açabilirsiniz.
13) Model üzerinde sağ tuşa basarak ADO.NET Entity Data Model seçimini yapalım.
14) İsmine s diyelim.
15) Empty Code First model seçimi yapalım.
16) En alta inerek aşağıdaki kodları yazalım.
public class Personel
{
public int Id { get; set; }
public string Ad { get; set; }
public int Yas { get; set; }
}
Projemizi derleyelim….
17) Controller üzerinde sağ tuşa barak Add /Controller seçimi yapalım. Ardından şekildeki seçimi yapalım.
18) Üst kısımdan Modelimizi seçelim. Şekildeki gibi yapılandıralım. Dikkat edin bir Context yazmadık.
Bu işlem sonucunda PersonelsController ve bununla ilişkili View’lar otomatik oluşacaktır.
19) RouteConfig.cs dosyamızı aşağıdaki gibi değiştirelim.
20) Çalıştırdığımızda şekildeki gibi ilk ekran gelecektir. Şimdi kayıt girebiliriz.
21) Web.config dosyasına da veri tabanı ile ilgili kodu otomatik olarak yazmıştır.
<connectionStrings>
<add name="s" connectionString="data source=(LocalDb)\v11.0;initial catalog=ders4.Models.s;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
</connectionStrings>
22) Daha önceki yazdıklarımızda olsun bu örneğimizde olsun başlıkları istediğimiz gibi değiştirmek içim model dosyamızı açarak aşağıdaki gibi yapılandıralım.
İlk olarak en üste aşağıdaki namespace yapısını ilave edelim;
using System.ComponentModel.DataAnnotations; //Ekledik
public class Personel
{
public int Id { get; set; }
[Display(Name = "Personel Adı")]
public string Ad { get; set; }
[Display(Name = "Personel Yaşı")]
public int Yas { get; set; }
}
23) Çalıştırdığımızda görüntü şekildeki gibi olacaktır.
Tabii bu özellik her yere yansıyacaktır;
24) Bu tanımladığımız tablo içeriği otomatik olarak oluşmuştur ve karekter değerlerini de nvarchar(MAX) oalrak algılamıştır. Bu ilerde göreceğimiz validatorlar için sorun çıkartabilir. Şimdi oluşturacağımız model de veri tipini belirleyelim.
25) s2.cs isimli Class dosyamızı ADO.NET Entity Data Model seçimi yaparak oluşturalım.
26) İçini aşağıdaki yapılandıralım. Dikkat ederseniz sütunların veri tiplerini de belirliyoruz.
En üste aşağıdaki namespace yapılarını ekleyelim;
using System.ComponentModel.DataAnnotations; //Başlıklar için
using System.ComponentModel.DataAnnotations.Schema; //Veri tipleri için
İstersek classın hemen üstüne aşağıdaki ifadeyi ekleyerek tablonun sahipliğini de belirleyebiliriz.
[Table("Personel2", Schema = "dbo")]
public class Personel2
{
public int Id { get; set; }
[Column("Ad", TypeName = "varchar")]
[StringLength(50, MinimumLength = 3)]
[Display(Name = "Personel Adı")]
public string Ad { get; set; }
[Column("Yas", TypeName = "int")]
[Display(Name = "Personel Yaşı")]
public int Yas { get; set; }
[Required]
[Column("Cins", TypeName = "char")]
[Display(Name = "Personel Cinsiyeti")]
[StringLength(8, MinimumLength = 3)]
public string Cins { get; set; }
}
27) Projemizi derledikten sonra, bu modeli kullanarak bir Personel2sController’ı oluşturalım.
28) RouteConfig.cs dosyasını aşağıdaki gibi yapılandıralım.
29) Artık projemizi çalıştırarak test edebiliriz.
30) Kayıt girelim.
31) Kurala uymayan kayıt girelim.
32) Eğer buradaki mesajları Türkçeleştirmek isterseniz kodları aşağıdaki gibi değiştirmeniz gerekir.
public class Personel2
{
public int Id { get; set; }
[Column("Ad", TypeName = "varchar")]
[StringLength(50, MinimumLength = 3,ErrorMessage = "Maksimum 50 Minumum 3 karekter girebilirsiniz.")]
[Display(Name = "Personel Adı")]
public string Ad { get; set; }
[Column("Yas", TypeName = "int")]
[Display(Name = "Personel Yaşı")]
public int Yas { get; set; }
[Required(ErrorMessage = "Boş Geçemezsiniz")]
[Column("Cins", TypeName = "char")]
[Display(Name = "Personel Cinsiyeti")]
[StringLength(8, MinimumLength = 3,ErrorMessage = "Maksimum 8 Minumum 3 karekter girebilirsiniz.")]
public string Cins { get; set; }
}
33) Çalıştırıp test ettiğinizde görüntü şekildeki gibi olacaktır.
34) Tabloyu incelediğinizde MAX ifadesi yerine sayısal uzunluk değerlerinin geldiğini göreceksiniz.
Şimdi ise oluşturulmuş bir veri tabanı ile ilişkiye geçeceğiz. Bunun için ilk oalrak bir veri tabanı oluşturalım. Yine bir önceki uygulamamdan devam ediyorum ancak isterseniz yeni bir uygulama açabilirsiniz.
35) App_Data üzerinde sağ tuşa basarak Add/New Item seçimi yapalım.
36) SQL Server Database seçimi yaparak ismine ankara.mdf diyerek onaylayalım.
37) App_Data altındaki ankara.mdf dosyasının üstüne iki kez tıkladığımızda Server Explorer penceresi açılacak ve görüntü şekildeki gibi olacaktır. Burada Tables klasörü üzerinde sağ tuşa basarak Add New Tables seçimi yapalım.
38) İlk iş olarak alt kısımda görülen ID tanımlamasına bir identity ilave ediyorum. Bunun anlamı Id numarasını otomatik oalrak kendi üretiecek.1’den başlayacak 1’er 1’er artacak.
39) Tablomu şekildeki gibi yapılandırıyorum. Alttaki T-SQL kısmında ismini Sicil yapıyorum.
40) Update ve UpdateDatabase butonu ile tablomu oluşturuyorum.
Girmek zorunda olmamama rağmen aşağıdaki örnek kayıtları giriyorum.
41) Model klasörü üzerinde sağ tuşa basarak Add/ADO.NET Entity Data Model seçimi yapıyoruz.
42) İsmine Persicil diyoruz.
43) Code First from Database seçimi yapıyoruz.
44) Next butonuna bastıktan sonra Listeden ankara.mdf seçimi yapıyoruz. Dikkat ederseniz web.config içine yazılacak ifadeler de otomatik olarak aşağı kısımda göründü. Tekrar Next butonuna basıyoruz.
45) Tablomuzu seçerek Finish ile sonlandırıyoruz.
46) Projemizi derledikten sonra, bu modeli kullanarak PersicilsController oluşturalım.
47) RouteConfig.cs dosyasında controller kısmını Sicils olarak değiştirelim.
48) Projemizi çalıştırdığımızda ilk gelen ekranda girmiş olduğumuz kayıtlar şekildeki gibi listelenecektir. Bizde yeni kayıtlar girebilir değişiklik silme yapabiliriz.