|
QueryString Kavramı |
|
Gönderiliyor lütfen bekleyin... |
|
|
Bilindiği üzere ASP.NET’te verileri saklama veya sayfalar arası taşıma işlemleri, Durum Yönetimi (State Management) adı altında sunulan seçenekler kullanılarak yapılır.
Bu opsiyonlara bakarsak:
Durum Yönetimine Genel Bakış
|
-View State
-Control State
-Hidden Form Fields
-Cookies
-Query String
-Application State
-Session State
|
Şimdi QueryString özelliğini beraber inceleyelim.
QueryString soyut olarak nedir?
Sayfalar arası veri taşıma yollarından en kolayı olan
QueryString yöntemi, URL üzerindeki stringler ile verileri taşımaya yarar. İnternette
gezerken bir çok sitenin url adresleri garip harf ve
sembollerle dolduğu dikkatinizi çekmiştir. İşte bu karakterler sunucu tarafında
adrese eklenip sayfayla birlikte hareket eden QueryString'dir. Yeni sayfada bu
link alınıp içindeki veriler sayfaya yerleştirilir. Fazla değerli verilerin
olmadığı anlarda tercih edilmesi gereken yöntemdir çünkü taşınan veriler
kullanıcının direk gözü önündedir. QueryString'in kullanımı çok kolaydır. Diğer
bir güzel yanı ise URL adresinin içinde bulunmasından dolayı, sayfanın
yerimlerine kaydedilmesi durumunda kendisinin de saklanmasıdır. Böylece yerimine
gidildiğinde, sayfa saklandığı haldeki şekliyle açılır.
QueryString somut olarak nedir?
Öncelikle verilmesi gereken örnek heralde bir QueryString'in
ekran görüntüsüdür.
Buradaki linkte site adındaki ’?’ işaretinden sonra gelen parametreler QueryString vasıtasıyla gelmiştir. Şimdi bu parametrelerin buraya nasıl eklendiğine bir bakalım.
2 dk. öncesi
Yeni açtığımız bir siteye iki adet aspx sayfası ekleyelim ve
ilk sayfaya şu kodu
yazalım:
protected void Page_Load(object sender, EventArgs e)
{ Response.Redirect("default2.aspx?isim=Serkan&soyisim=Yazicioglu");
} |
Bu sayfa çalıştırıldığında default2.aspx sayfası yukarıdaki
resimde görüldüğü gibi belirecektir. QueryString sayfalar arasında veri taşıdığı
için Response.Redirect içinde yer alan URL adresine bu sayfadaki veriler
eklenir. Daha sonra diğer sayfanın Page Event'leri çalıştırıldığında bu veriler
işleme tabi tutulur. Anlaşıldığı üzere QueryString'de iki adet önemli sembol
vardır. Birincisi '?' işaretidir. Bu sembol sayfanın url adresi ile QueryString
verilerini birbirinden ayırır. Bu işaretten sonra ne yazarsak yazalım sayfanın
bulunamaması gibi bir hata oluşmayacaktır. '&' sembolü ise
taşınan verileri birbirinden ayırmaktadır. Birden fazla veri taşınması durumunda
araya hep ampersand koyulmalıdır. Örnek vermek gerekirse sayfamızda 3 adet
TextBox nesnesi oluşturalım ve Text özelliklerini dinamik olarak QueryString'e
ekleyelim:
protected void Button1_Click(object sender, EventArgs e)
{
Response.Redirect("default2.aspx?isim=" + TextBox1.Text + "&soyisim=" +
TextBox2.Text + "&id=" + TextBox3.Text);
} |
Peki QueryString
nereden türemektedir? Buna bakmak için ise 'GoToDefinition' yapalım:
public sealed class HttpRequest
{
...
public NameValueCollection QueryString { get; }
...
} |
Görüldüğü üzere QueryString bir property'dir. HttpRequest
sınıfı, request sırasında kullanıcının gönderdiği HTTP tipindeki verilere
ASP.NET'in ulaşmasını sağlar. NameValueCollection sınıfı ise
(System.Collections.Specialized isimalanı altındadır) string tipinden bir
adet 'Key' ve bir adet 'Value' saklamaktadır.
QueryString'e diğer sayfadan ulaşmak için Request.QueryString
yazılır. QueryString'in içerisindeki
verilere ise indeks veya 'Key' değeri üzerinden şu yöntemler kullanılırarak ulaşılabilir:
//Key değeri üzerinden ulaşmak için:
string str = Request.QueryString["Key"];
//veya
string str = Request.QueryString.Get("Key");
//Indeks üzerinden ulaşmak için:
string str = Request.QueryString[0];
//veya
string str = Request.QueryString.Get(0);
//Tüm verilere ulaşmak için ise for döngüsü kullanmalıyız. Çünkü
QueryString'in 'Request.QueryString.Values' adlı bir property'si bulunmamaktadır.
for (int i = 0; i < Request.QueryString.Count; i++)
{
DropDownList1.Items.Add(Request.QueryString[i]);
} |
QueryString'de 'Key' değerleri farklı olmak zorunda değildir.
'Key' değerlerinin aynı olacağı durumlarda şuna dikkat edilmelidir:
//default.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
Response.Redirect("default2.aspx?1=bir&1=iki&1=üç");
}
//default2.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
for (int i = 0; i < Request.QueryString.Count; i++)
{
DropDownList1.Items.Add(Request.QueryString[i]);
}
}
|
Bu şekilde yazdığımız taktirde karşımıza şu sonuç çıkacaktır:
Burada aynı 'Key' değerine sahip veriler tek bir string olarak
alınmıştır. Bu string değerlerini birbirinden ayırmak için GetValues metodu
kullanılır:
//default2.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
foreach (string str in
Request.QueryString.GetValues("1")) //GetValues
metodu parametre olarak 'Key' veya indeks almaktadır.
{
DropDownList1.Items.Add(str);
}
}
|
Böylelikle QueryString içerisindeki aynı 'Key' değerine sahip
verileri birbirinden ayırmış oluruz:
Response.Redirect yerine Server.Transfer metodunu
kullanmak
Server.Transfer metodu bilindiği üzere tarayıcının bir sayfaya
yönlendirilmesi sırasında tarayıcıdaki URL adresinde bir değişiklik yapmaz.
Dolayısıyla bu metodu kullanmak QueryString'in URL'de görünmemesini sağlar.
Örnek vermek gerekirse 2 adet aspx sayfası açıp, ilkine bir button ikincisine
ise bir Label nesnesi ekleyelim. Code-Behind tarafımız ise şöyle olsun:
//default.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
Server.Transfer("default2.aspx?id=Transfer Metodu", true);
//Buradaki ikinci özellik ise bool bir değer alıp QueryString gibi diğer sayfaya
geçebilecek nesnelerinin gönderilip gönderilmeyeceğini belirtir.
}
//default2.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
Label1.Text = Request.QueryString.Get(0);
}
|
Default.aspx sayfamız çalıştırıldığında tarayıcıdaki görüntü ilk başta şöyledir:
Daha sonrasında Button1'e basıldığında ise 2. sayfamız
tarayıcıya gelmektedir:
Görüldüğü üzere sayfa değişmesine rağmen URL adresi
değişmemiş dolayısıyla da QueryString kullanıcıya gösterilmemiştir.
Server.Transfer metodu ise kullanım açısından Redirect metodu ile aynıdır.
QueryString'e eklenemeyen karakerler
QueryString'e '#', '+', '&' gibi bazı semboller eklenirken
hatalar olmaktadır. Bu hataları önlemek için Server.UrlEncode metodu
kullanılmalıdır.
protected void Button1_Click(object sender, EventArgs e)
{
string encoded =
Server.UrlEncode(TextBox1.Text);
Response.Redirect("default2.aspx?name=" + encoded);
}
|
Bu metod çalıştırıldığında karakterler QueryString vasıtasıyla
taşınabilecektir. Bu özelliğin kötü yanı QueryString'i uzatmasıdır. Ayrıca bazı sorunlar
da çıkarabilir. Örnek vermek gerekirse '&' karakterinden sonra '#' karakteri gelirse bazı
güvenlik önlemlerinden dolayı (cross-site scripting attack gibi) ASP.NET hata
verebilir.
|
URL boyutlarında sınır
Tarayıcılar URL adreslerinin çok şişmesini önlemek için
belirli sınırlar koymuşlardır. Bu sınıra adres ve diğer karakterler de dahildir
ve artan karakterler URL'e eklenmez. Tarayıcılar arasında en düşük sınıra
sahip olanı Internet Explorer'dır ve maksimum 2047 bayt
almaktadır. Dolayısıyla QueryString'lerimizi bu değere yaklaştırmamaya
dikkat etmemiz gerekir.
|
An itibariyle bu makalemizin sonuna gelmiş bulunmaktayız. Artık QueryString nedir, ne değildir onu da
öğrendiğimize göre rahat bir uyku çekebiliriz. Herkese iyi günler.
Serkan Yazıcıoğlu
[email protected]
Makale:
QueryString Kavramı ASP.NET Serkan Yazıcıoğlu
|
|
|
-
-
Eklenen Son 10
-
Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
|
|