Ana Sayfa
Forumlar
Hakkımızda
Yükleniyor. Lütfen bekleyin ...
Kategoriler
ASP.NET
C# & VB.Net
Visual Studio ve Araçlar
Sharepoint
.NET Framework
SQL Server
Mobil Teknolojileri
Dynamics
Silverlight
İş Zekası
Windows Embedded Sistemler
Yazılım Mimarisi
Yazgeliştir
Yazar olmak ister misiniz?
Forumlar
Kitap Önerileri
Haberler
Yazarlar
İpuçları
Görüşleriniz
Hakkımızda
İstatistikler
En son kayıt olan üye:
bahattin
Şuanki online üyeler (
0
) :
ASP.NET Kategorisi
»
ASP.NET 4.0 ile URL Routing
ASP.NET 4.0 ile URL Routing
Print Versiyonu
Yazar:
Sem Göksu
Tarih:11.09.2009
Puan:
4,31
(Oy Kullanan:
13
)
Okuma Sayısı:
2428
Makaleyi İşaretle
Makale Özeti
Merhaba arkadaşlar, bu makalemizde ASP.NET 4.0 Yeniliklerinden URL Routing’i (Url Yönlendirme) ve URL Routing için kullanacağımız Route, RouteTable ve PageRouteHanlder gibi kavramları inceleyeceğiz.
Paylaşım
Makale
Web uygulamarında kullanıcıların yapmış olduğu işlemlerde parametre aktarımı bazı durumlarda QueryString ile (URL’den) yapılmaktadır. Bu durumda adres çubuğunda oluşan link çok uzun ve okunamaz hale geliyor. Bu kullanıcı açısından görüntü kirliliği yaratıyor, arama motorları tarafından indexlenme ihtimalini azaltıyor ve geliştirici açısından parametrelerin okunması ve takip edilmesi zorlaştırıyor. Örneğin;
http://semgoksu.com/search.aspx?Kategori=ASP.NET&Tarih=15122009&Baslik=URLRouting
ASP.NET 4.0 ile birlikte URL Routing’i kullanarak bu sorunu ortadan kaldırabiliyoruz. Bu sayede hem oluşan link daha kısa ve anlamlı oluyor, hemde URL içerisindeki klasör yapısına sayfa ile ilgili keywordleri koyarak arama motorlarının daha kolay indexlemesini ve bu sayede sayfalarımızın daha üst sıralarda çıkması sağlayarak büyük bir avantaj sağlamış oluyoruz. Yukarıda vermiş örneği ASP.NET 4.0 URL Routing’i kullanarak aşağıdaki gibi yapabiliriz.
http://semgoksu.com/Arama/ASP.NET/15122009/URLRouting
URL Routing ilk olarak MVC ile birlikte geldi ve artık ASP.NET 4.0 ile birlikte URL Yönlendirme işlemi yapabilmemiz için her şey hazır durumda. Visual Studio 2010’u kullanarak yeni bir ASP.NET uygulaması oluşturalım ve konuyu örneklendirelim. Uygulamayı oluşturduktan sonra web uygulamamıza yeni bir Global.asax dosyası ekleyelim.
Globax.asax dosyası içerisinde bulunan
Application_Start
methodu içerisinde URL yönlendirme işlemini yapacağız. Bunun için ihtiyacımız olan ilk şey
RouteTable
.
Bu sınıf farklı formatlardaki url yönlendirmelerini(Route’ları) saklayacak olan Route koleksiyonudur. İki parametre alır; Route’un adı ve Route nesnesi.
Route
nesnesi de URL’in gösterileceği formatı belirtmek için kullanılır. Uygulamaya gelen istekler Route’un formatına uygunsa PageRouteHandler’ın belirttiği path’e yönlenir.
PageRouteHandler
sınıfı yönlendirilecek olan fiziksel dosyayı Constructor’da(Yapıcı metot) parametre olarak alır.
Sonuç olarak sayfaya yapılan request’lar RouteTable’daki Route’lardan birine uygun formattaysa PageRouteHandler’in işaret ettiği sayfaya yönlenir. URL bizim belirttiğimiz formatta görüntülenirken arka tarafta ilgili fiziksel dosya üzerinde işlem yapılır.
İlk olarak ana sayfamızdan(Default.aspx) detay sayfaya (detay.aspx) sayfasına bir yönlendirme işlemi yapalım. Detay sayfasına bir de parametre gönderelim ve bu parametreyi detay sayfada yakalayarak ekran da görüntüleyelim.
[Global.asax]
<%
@
Application
Language
="C#"
%>
<%
@
Import
Namespace
="System.Web.Routing"
%>
<
script
runat
="server">
void Application_Start(object sender, EventArgs e)
{
RouteTable.Routes.Add("Detay", new Route("Detay/{Parametre}", new PageRouteHandler("~/Detay.aspx")));
}
</
script
>
Appplication_Start metodu içerisinde sayfamıza gelecek olan url formatını
Klasor/{Parametre}
şeklinde belirttik. ({Parametre} yerine istediğimiz bir değeri gönderebileceğiz) Bu formatta gelen bütün istekler detay.aspx sayfasını gösterecek.
[Default.aspx]
<
asp
:
HyperLink
ID
="link"
runat
="server"
NavigateUrl
='
<%
$
RouteUrl:RouteName=Detay, Parametre=Sayfa1
%>
'>Detaya Git</
asp
:
HyperLink
>
Ana sayfaya bir HyperLink nesnesi ekledik. HyperLink içerisinde ilk olarak sayfamızın gideceği Route’u ve o Route’a göndereceğimiz Parametreyi bildirdik. Oluşacak olan format şu şekilde olacak. NavigatetUrl içerisinde kullanılan RouteUrl’i kod tarafında kullanamıyoruz.
http://localhost:50751/Detay/Sayfa1
Şimdi Detay.aspx sayfaya gidelim ve gönderdiğimiz parametreyi yakalayalım. Route içerisinde gönderdiğimiz bütün parametreler
RouteData
içerisinde yer alır. Göndermiş olduğumuz parametreye erişmek için
RouteData.Values[“Parametre”]
yada
RouteData:Name
şeklinde kullanırız.
[Detay.aspx.cs]
protected
void
Page_Load(
object
sender,
EventArgs
e)
{
if
(RouteData.Values[
"Parametre"
]!=
null
)
{
Response.Write(RouteData.Values[
"Parametre"
].ToString());
}
}
Sayfayı çalıştırdığımız da URL istediğimiz şekilde gitmiş ve Detay.aspx sayfasına göndermiş olduğumuz parametreyi’de ekranda görüntüledik.
Şimdi farklı bir örnek yapalım ve birden fazla parametreyi nasıl göndeririz ona bakalım. Bu örnekte SQL Server 2005’te yer alan örnek veritabanlarından AdventureWorks’u kullanarak Kategorileri ilk ekran da listeyelim. Kullanıcı ilgili kategoriye tıkladığında farklı bir sayfa da ilgili ürünler listelensin. Sayfaya göndereceğimiz URL formatını da istediğimiz gibi değiştirelim. Bunun için global.asax dosyamızı düzenleyelim. Route içerisinde format istediğimiz gibi düzenleyebiliriz. KategoriID ve KategoriAdi parametrelerini istediğimiz değerleri verebileceğiz.
[Global.asax]
<%
@
Application
Language
="C#"
%>
<%
@
Import
Namespace
="System.Web.Routing"
%>
<
script
runat
="server">
void
Application_Start(
object
sender,
EventArgs
e)
{
RouteTable
.Routes.Add(
"Kategoriler"
,
new
Route
(
"Kategoriler/{KategoriAdi}/{KategoriID}"
,
new
PageRouteHandler
(
"~/Detay.aspx"
)));
}
</
script
>
Sayfamıza bir Repeater ekleyelim. Burada Kategorileri listeleyeceğiz. Veritabanındaki verilere erişmek için projemize bir adet
LINQ to SQL Classes
Dosyası ekleyelim. İsim olarak AdventureWorks diyelim.
Kullanacağımız ProductSubCategory ve Product tablolarını’da dosyamıza alalım. Şimdi kategorilerimizi listeleyek olan HTML kodunu yazalım. Sayfaya Repeater, içerisinede bir HyperLink ekliyoruz.
[Default.aspx]
<
asp
:
Repeater
ID
="rptKategoriler"
runat
="server"
OnItemDataBound
="rptKategoriler_ItemDataBound">
<
ItemTemplate
>
<
asp
:
HyperLink
ID
="hlKategori"
runat
="server">
</
asp
:
HyperLink
><
br
/>
</
ItemTemplate
>
</
asp
:
Repeater
>
Şimdide veritabanından verileri LINQ to SQL ile çekelim ve Repeater’a bağlayalım. ItemDataBound eventin’de HyperLink nesnesini yakalayıp kontrolün Text ve NavigateUrl özelliğini datadan gelen değer ile dolduracağız.
[Default.aspx.cs]
AdventureWorksDataContext
db =
new
AdventureWorksDataContext
();
protected
void
Page_Load(
object
sender,
EventArgs
e)
{
rptKategoriler.DataSource = (
from
k
in
db.ProductSubcategories
select
k).Take(10);
// 10 kayıt alalım
rptKategoriler.DataBind();
}
protected
void
rptKategoriler_ItemDataBound(
object
sender,
RepeaterItemEventArgs
e)
{
if
(e.Item.ItemType ==
ListItemType
.Item|| e.Item.ItemType ==
ListItemType
.AlternatingItem )
{
HyperLink
hl = e.Item.FindControl(
"hlKategori"
)
as
HyperLink
;
hl.Text =
DataBinder
.Eval(e.Item.DataItem,
"Name"
).ToString();
RouteValueDictionary
parameters =
new
RouteValueDictionary
()
{
{
"KategoriID"
,
DataBinder
.Eval(e.Item.DataItem,
"ProductSubCategoryID"
).ToString() },
{
"KategoriAdi"
,
DataBinder
.Eval(e.Item.DataItem,
"Name"
).ToString() }
};
// Route’un alacağı parametreler’i dinamik olarak dolduruyoruz
VirtualPathData
path =
RouteTable
.Routes.GetVirtualPath(
null
,
"Kategoriler"
, parameters);
hl.NavigateUrl = path.VirtualPath;
// Oluşan Route’un pathini hyperlinke atadık.
}
}
Kategorilerin listeleneceği sayfayı hazırladık. Şimdi de gidip detay sayfada görüntülenecek olan ürünler için gerekli sayfayı hazırlayalım. İlk olarak HTML’e bir Repeater ekleyelim ve içine bir label atalım. Text özelliğinde de ürün’ün adını görüntüleyelim.
[Detay.aspx]
<
asp
:
Repeater
ID
="rptUrunler"
runat
="server">
<
ItemTemplate
>
<
asp
:
Label
ID
="lblUrunAdi"
runat
="server"
Text
=
<%
#
Eval("Name")
%>
>
</
asp
:
Label
><
br
/>
</
ItemTemplate
>
</
asp
:
Repeater
>
Veriyi LINQ to SQL ile çekerek Repeater’a bağlayalım. Diğer sayfadan gelen KategoriID parametresinide almayı unutmuyoruz. Ürünler gelen KategoriID parametresine göre listelenecek.
[Detay.aspx.cs]
AdventureWorksDataContext
db =
new
AdventureWorksDataContext
();
protected
void
Page_Load(
object
sender,
EventArgs
e)
{
if
(RouteData.Values[
"KategoriID"
]!=
null
)
{
int
UrunID =
Convert
.ToInt32(RouteData.Values[
"KategoriID"
]);
UrunleriGetir(UrunID);
}
}
private
void
UrunleriGetir(
int
KategoriID)
{
rptUrunler.DataSource =
from
u
in
db.Products
where
u.ProductSubcategoryID == KategoriID
select
u;
rptUrunler.DataBind();
}
Şimdi sayfayı çalıştıralım ve sonuca bakalım,
Kategorilerden birine tıklayalım.
İşte bu kadar
J
Bu makalenin de sonuna geldik başka bir makale de görüşmek üzere. ASP.NET ile kalın ;)
Sem GÖKSU
www.semgoksu.com
|
www.yazilimgunlugu.com
sem.goksu@yazilimgunlugu.com
Kaynaklar
msdn.com
Makaleyi nasıl buldunuz?
Makaleye puan vermek için üye girişi yapmanız gerekmektedir.
v2.4
Geri Bildirim (Feedback)
Site içerisinde yazılan tüm makalelerin yazım ve yayınlama hakkı aksi belirtilmediği sürece sadece yazarlara aittir.
Yazgelistir.Com Ekibi - 2006 -
Yazgelistir.com