Professional Documents
Culture Documents
Ders (ASP Net)
Ders (ASP Net)
ASP.NET, .NET çatısın bir parçası olduğundan. NET’ in yüklendiği her sunucuda
bulunur. ASP.NET önceden belirlenmiş çok özel görevleri yerine getiren sınıf ve nesneleri
ortaya çıkaran bir şekilde uygulanmıştır.
ASP.NET uygulamaları, istemci taleplerine dinamik olarak yanıt veren bir ya da daha
fazla sayıda Web sunucusu üzerinde barındırılan merkezi uygulamalardır. Yanıtlar dinamiktir,
çünkü ASP.NET çok özel uzantıları olan dosyalarla ilgili talepleri yakalayarak, bunları anında
yanıt oluşturulabilen tam zamanında (just-in-time--JIT) derlenmiş kod dosyaları iletir.
Statik ve dinamik talepler arsındaki temel fark, tipik bir Web talebinin statik bir
dosyaya referansta bulunmasıdır. Sunucu dosyayı okur ve istenen dosyanın içeriği ile yanıt
verir. ASP.NET' ta böyle bir sınırlandırma yoktur. Mevcut bir dosya ile cevap vermek zorunda
değilsiniz. Yanıtlarınız arasında dinamik olarak oluşturulmuş HTML kodu, XML, GRAFİK,
ham metin, ikili veri yani her şey olabilir. CGI programları, JavaServer Pages sayfaları, klasik
asp sayfaları, ColdFusion ve NetObjects Fusion sayfaları oluşturmakta bu türdendi. Tüm bu
teknolojiler http talebine dinamik olarak yanıt vermemizi sağlar. Aralarındaki farklılıklar
şunlardır:
1
nin temel işlevselliğini genişletebilmekteyiz. ASP.NET in başka bir rakibi olan ColdFusion ise
MarkupLanguage(CFML) imlerini kullanmaktadır. Bu imler güçlü ama sınırlı yetenek
sunmaktadır. Ancak CFML' Nil yeteneklerini C++ ya da Java’ da kendi programlarınızı yazarak
geliştirebilirsiniz.
1.1.1 Klasik ASP ile ASP.NET in Karşılaştırılması
ASP ASP.NET
Klasik ASP sunucusu. asp uzantılı dosyalarla ASP.NET sunucusu .asp, ascx ve .asmx
ilgili taleplere cevap vermektedir. uzantılarını kullandığı için tüm bu dosyaları
aynı sunucu üzerinden çalıştırmamız
mümkündür.
Az sayıda dil seçeneğinden birini kullanarak Sunucu taraflı kodlar herhangi bir .NET
sunucu taraflı script yazılabilir ve çalışma dilinde yazılabilir. Bu diller yorumlanmaz
anında yorumlanır. derlenir.
Asp script’lerinin işlevselliği COM .NET System sınıflarından herhangi biri
nesneleriyle genişletilebilir. kullanılabilir, mevcut COM nesneleri de
çağrılabilir.
Kod ve HTML genellikle sayfa içinde yerel ASP.NET sayfasında yerel kod da kullanılır
olarak karışmıştır. fakat genelde code-behind sınıflarında HTML
den ayrı yer alır.
Gönderilen HTML form alanlarını işler Gönderilen form alanlarını geçerlilik
denetimini yapar ve işler
Ayarlar, özel olaylarla ilgili kodu çalıştıran Ayarlar, XML formatındaki dosyalarda
özel ASP dosyasında tutulur. tutulur.
2
WEB SİTESİNİN OLUŞTURULMASI
Burada bir metin kutusuna giriş yapmamızı sağlayan bir web formu oluşturacağız.
Girdiğiniz metni sunucuya göndermek için bir submit düğmesine tıklayacağız. Sunucu, metin
kutusuna yazdığınız metni içeren ve o onda oluşturduğu bir GIF resmi ile bize yanıt verecektir.
Şimdi projeyi adım adım oluşturalım.
Projenin Oluşturulması
VS.NET i açalım. File/New-Web Site komutunu verelim. Karşımıza çıkan New Web
Site iletişim kutusunun sol panosunda yer alan ASP.Net Web Site simgesi tıklayın.
3
C# Web uygulama projenize otomatik olarak WebSite adını verir ve ardına bir sayı
yerleştirir. Biz bunu Projem olarak değiştirdik. Location alanını kontrol edelim; bu uygulamayı
barındıracağımız Web sunucusunun adı burada yazılı olmalıdır. Tipik olarak burada
http://localhost yazacaktır. Girdiğimiz bilgilerin doğru olduğunu kontrol ettikten sonra OK
tuşuna basalım böylece proje oluşacaktır.
Sayfa Mizanpajı
Default.aspx dosyasının üzerinde herhangi bir noktayı sağ fare tuşu ile tıklayarak
bağlam menüsünden Properties’ i seçelim. Sayfa ilgili tüm ayarlamalar nurada yapılmaktadır.
4
Style kısmı ile sayfa boşluk ayarları, arkaplan rengi yazı fontu gibi temel özellikler
belirlenebilir.
ASP.NET ile geliştirilen uygulamaların; Internet, Extranet veya Intranet üzerinde çalışabilmesi
için Web Sunucularına ihtiyaç duyulur. IIS (Internet Information Services) Windows işletim
sistemleri için geliştirilmiş web sunucusudur.
IIS Nedir?
5
IIS(Internet Information Services) Kurulması
Uygulama Yayınlamak
<html>
<head>
<title>HTMLPage1</title>
</head>
<body>
<p>Hoş Geldiniz.</p>
</body>
6
</html>
7
ASP.NET ile uygulama geliştirirken kullanılan temel bileşenler Web Formlar ve Web
kontrolleridir. Web Form, IIS tarafından çalıştırılan HTML kod ve kontrollerin birleşiminden
oluşur. Bu formlara eklenen kontroller, sunucu veya istemci taraflı çalışabilirler.
Web Form, ASP.NET uygulamalarının yapı taşıdır. Visual Studio .NET ortamı aracılığı ile
eklenen kontrollerin ve C# kodlarının birleşimi Web Formu oluşturur. Web formlar, .aspx
uzantılı arayüz dosyası ve. aspx.cs uzantılı kod dosyalarından oluşur.
Web Formları Visual Studio ile iki farklı şekilde tasarlanabilir. Design sekmesi, web
kontrollerinin görsel olarak düzenlenmesini sağlar. HTML sekmesi ise, kontrollerin HTML
kodlar ile eklenmesini sağlar.
8
Web Formların genel özellikleri aşağıdaki gibidir.
• @Page Özelliği
• Form Özelliği
PAGE ÖZELLİĞİ
Tüm sayfa içinde tanımlanacak fonksiyonların değerlerini içerir. <@Page> etiketi ile gösterilir
ve her .aspx uzantılı dosyada bulunması gerekir.
<@Page> etiketinde, sayfanın yapısı ile ilgili özellikler bulunur.
Language
Sayfa içinde kullanılacak dil seçeneğini bildirilir. ASP.NET uygulamalarında genellikle VB ve
C# dilleri tercih edilir.
CodeBehind
Web formların, Visual Basic .NET veya C# uzantılı kod dosyasını belirtir.
9
SmartNavigation
SmartNavigation özelliğine True değeri ayarlanırsa, sayfa yeniden yüklendiği zaman, kaydırma
çubuklarının sayfa içerisindeki yeri korunur. Böylece sayfa ilk konumunda kalır. Bu özellik
Internet Explorer 5.5 ve üstü tarayıcılar tarafından desteklenir.
ViewState
ASP.NET teknolojisi ile gelen yeniliklerden biridir. EnableViewState özelliği ile objenin
içerisine girilen bilgi ne olursa olsun, sunucu bunu bir değişkende tutup tekrar kullanıcıya geri
döndürür. Bu durum sunucuya gönderilen veriler üzerinde hata oluşması durumunda, billgilerin
kaybolmamasını sağlar. Bu özelliğin tüm kontrolleri içermesi için, Page yönerge satırında
tanımlanması gerekir. Bu özellik True veya False değeri alabilir.
FORM ÖZELLİĞİ
10
Web kontrolleri gruplandırmak için kullanılır. Her web form için tek Form etiketi tanımlanır.
Tüm kontroller <form> … </form> etiketleri arasına eklenir. Form etiketi içinde
tanımlanabilecek birçok özellik vardır.
Method
Web kontrol özelliklerinin, sunucuya gönderilme şeklini belirler. İki değer alabilir:
• Post: İsim ve değer bilgilerini, HTML bilgisinin üst bilgisine yazarak gönderir.
<form method=”Post” …>
• Get İsim ve değer bilgilerini, sayfa adının sonuna ekleyerek gönderir.
<form method=”Get” …>
Id
Formun isim bilgisini verir. CodeBehind sayfası içerisinde, forma işlem yaptırmak için
kullanılır.
<form id=”deneme” …>
Runat
Web formlarda kullanılan kontrollerin sunucu ile haberleşerek çalışabilmesi için runat=”server”
bildirimi kullanılır. Bu özellik sadece server değerini alabilir.
<form runat=”server” …>
SERVER(SUNUCU) KONTROLLER
Web sunucu üzerinde çalışan kontrollerdir. İki tür server kontrolu vardır. Bunlar:
• HTML Server Kontrolleri
• Web Server Kontrolleri (ASP.NET Kontrolleri)
11
ASP.NET server kontrolleri System.Web.UI.Control sınıfından türetilir. Her ASP.NET server
kontrolü <asp:KontrolIsmi> etiketi ile bildirilir. HTML kontrolleri ise
System.Web.UI.HtmlControls isim alanında bulunur.
Button, TextBox, DropDownList gibi server kontrollerinin çalışma modeli, istemci taraflı
HTML kontrollerinin çalışma modelinden oldukça farklıdır. ASP.NET server kontrolleri,
tamamen sunucu üzerinde çalışır ve geri plandaki tüm işleyişleri ara yüzle gizlenerek
gerçekleştirilir.
Bu kontrolün sunucu tarafında çalışması için, kontrole runat özelliği eklenmelidir. Böylece
kontrol HTML server kontrolü haline getirilir.
KONTROLLERİN SINIFLANDIRILMASI
12
ASP.NET Web kontrolleri dört grupta listelenir. Bunlar;
1- Standart Kontroller (ListBox, Button, CheckBox, Table vs.)
2- Doğrulama Kontrolleri (RequiredFieldValidator, RangeValidator, CompareValidator,
RegularExpressionValidator, CustomValidator, ValidationSummary)
3- Zengin Kontroller (Calendar, Adrotator)
4- İlişkisel Liste Tabanlı Kontroller (DataGrid, DataList, Repeater)
STANDART KONTROLLER
Bu kontroller, HTML kontrollere alternatif olarak tasarlanmıştır. Eski tip HTML kontrolleri ile
yeni ASP.NET kontrolleri arasındaki en belirgin fark, her Web kontrolünden önce asp: ön
ekinin kullanılıyor olmasıdır.
13
Bu grupta bulunan kontrollerin tümü id, text, backcolor, runat özelliklerine sahiptir. Ancak
CheckBox kontrolünün Checked ve ListBox kontrolünün SelectedItem özellikleri vardır.
Tabloda Html ve Standart sunucu kontroller gösterilmektedir.
Web kontrol Html Kontrol
<asp:Button> <input type=submit>
<asp:CheckBox> <input type=checkbox>
<asp:HyperLink> <a href=”...”> </a>
<asp:image> <img src=”..”>
<asp:imageButton> <input type=image>
<asp:LinkButton> Yok
<asp:Label> <span> </span>
<asp:ListBox> <select size=”5”> </select>
<asp:Panel> <div> </div>
<asp:TextBox> <input type=text>
<asp:RadioButton> <input type=radiobutton>
<asp:DropDownList> <select> </select>
<asp:Table> <table> </table>
Doğrulama Kontrolleri
Kullanıcının girdiği değerleri kontrol etmek için kullanılır. Kontrolün yapılacağı alana ve veriye
göre, farklı doğrulama kontrolleri kullanılır. ASP.NET, belirli bir aralıkta veri girişi sağlayan,
karşılaştırma yapan ve belirli değerlerin boş geçilmemesini sağlayan çeşitli doğrulama
kontrolleri sunar. RequiredFieldValidator, RangeValidator, CompareValidator,
RegularExpressionValidator, CustomValidator, ValidationSummary kontrolleri, bu grupta
yer alır.
Zengin Kontroller
AdRotator ve Calendar zengin kontroller grubunda yer alır. AdRotator, Web sayfaları
üzerinde reklam yayını yapmak için kullanılır. Calendar ise Web sayları üzerinde Takvim
göstermek için kullanılır.
14
Bu kontroller, veritabanından çekilen kayıtların gösterilmesini sağlar. DataList, DataGrid ve
Repeater kontrolleri, bu grupta yer alırlar.
STANDART KONTROLLER
Label
Label, kullanıcıya bilgi vermek için kullanılır.
<asp:Label ID="Label1" runat="server" Text="Label Control" Font-
Italic="true" />
Olaylar :
15
OnDataBinding OnDisposed OnPreRender
OnInit OnLoad OnUnload
16
<asp:label id="Label1" style="Z-INDEX: 104; LEFT: 32px;
POSITION: absolute; TOP: 72px" runat="server" Width="96px"
Height="16px" BackColor="White">Puntoyu Giriniz</asp:label>
TextBox
TextBox, kullanıcının bilgi girişini sağlar. En sık kullanılan giriş kontroludür.
17
<asp:TextBox id="userName" type="text" runat="server">
Özellikler :
Olaylar :
Button
Button, form üzerindeki olayları sunucuya yollamak için kullanılır. En sık kullanılan onay
kontroludür.
18
{
Message.InnerHtml = "Beni Tıkladın.";
}
Özellikler :
AccessKey CommandArgument Font-Italic Font-Underline
BackColor CommandName Font-Name ForeColor
BorderColor CssClass Font-Names Height
BorderStyle Enabled Font-Overline ID
BorderWidth EnableViewState Font-Size Runat
CausesValidation Font-Bold Font-Strikeout TabIndex
Text Visible With
Olaylar :
19
<form id="form1" runat="server">
</form></body> </html>
Kodda dikkat etmemiz gereken en önemli unsur eklenen butonların OnClick olayıdır.
Her biri koddan da anlaşıldığı gibi bir scripti çağırıyor. “kapa, gizle, kalin ve geri” bu scriptlerin
içinde de butonun bazı özellikleri değiştiriliyor. Aşağıda kapa butonuna basıldıktan sonra ekran
görüntüsü alınmıştır.
20
CheckBox
CheckBox, kullanıcıya seçenekler arasından seçim yapma imkânı sunar. Onay kutusu
işaretlenmiş ise True, işaretlenmemiş ise False değerini alır. Onay kutusunun durumu
CheckedChanged metodu ile takip edilebilir. Örnekte CheckBox kontrolünün onay kutusu
tıklandığı anda “Seçili”, seçim işlemi geri alındığı anda “Seçili değil” mesajı yazılır. Seçim
yapıldığı anda mesajın yazdırılmasını sağlayan AutoPostBack özelliğinin, True değeridir.
</script>
</head>
<body>
<span id="Message" runat="server" />
</form>
</body>
</html>
21
Uygulama: Aşağıda verilen ekran görüntüsüne ait programı
yazınız.
22
if (CheckBoxList1.Items[1].Selected == true)
{ Label3.Font.Italic = true; }
if (CheckBoxList1.Items[2].Selected == true)
{ Label3.Font.Underline = true; }
}
Scriptimize eklediğimiz koda bakacak olursanız Items özelliği ile ulaştığımız CheckBoxList
nesnesindeki değerlerin seçili olma durumlarını if deyimi ile kontrol edebiliyoruz. Scriptimizin
başında bu özellikleri false yapmamızın sebebi ikinci sefer çağırıldığında değişikliklerin
uygulana bilmesidir.
RadioButton
Örnekte, RadioButton kontrolleri arasında muzik isminde bir grup oluşturulmuştur. Bu grup
içerisindeki Pop, Jazz ve Classic RadioButton kontrollerinden sadece bir tanesi seçilebilir.
BtnOnay isimli button tıklandığında, seçilen RadioButton kontrolunun değeri Message isimli
Label kontrolune yazılır.
23
}
}
</script>
</head>
<body>
<span id="Message" runat="server" />
</form>
</body>
</html>
24
private void secim(object sender, System.EventArgs e)
{
if (RadioButtonList1.SelectedItem.Text=="Paskal" ||
RadioButtonList1.SelectedItem.Text=="Delphi" ||
RadioButtonList1.SelectedItem.Text=="Phyton")
{ Label1.Text="Yanlış Yanıtladınız"; }
if (RadioButtonList1.SelectedItem.Text=="Kobra")
{ Label1.Text="Doğru Cevapladınız"; }
}
HyperLink
Hyperlink, sayfalar arası dolaşımı sağlar. Hyperlink kontrolunun görünümü metin veya resim
olabilir. ImageUrl özelliği ile görüntülenecek resim dosyası belirlenir. NavigateUrl özelliği ile
gidilecek sayfa belirlenir. Örnekte Hyperlink kullanımı gösterilmektedir.
<asp:HyperLink id="hyperlink1" runat="server"
ImageUrl="image1.gif"
25
NavigateUrl="http://www.bilgeadam.com"
Text="Bilge Adam BTA"
Target="_blank"/>
Target özelliği, açılacak sayfanın aynı sayfa üzerinde veya yeni bir sayfada gösterilmesini
sağlar. Tablo da Target özelliğinin değerleri gösterilmektedir.
Target Özelliği Açıklama
_blank Yeni sayfa
_self Aynı sayfa içinde
_search Arama sayfası görünümünde
Image
Image, sayfa içinde resim görüntülemek için kullanılır. ImageUrl özelliği ile görüntülenecek
resim dosyası belirlenir. ImageAlign özelliği resmin hizalanması için kullanılır. AlternateText
resime alternatif metin göstermek için kullanılır.
Örnekte Image kullanımı gösterilmektedir.
ImageButton
ImageButton resimli button kontroludur. Örnekte ImageButton kullanımı gösterilmektedir.
26
<span id="Message" runat="server"/>
LinkButton
<br>
<asp:Label id=Label1 runat=server />
DropDownList
DropDownList, açılan kutuda veri görüntülemek için kullanılır. DropDownList öğeleri Items
koleksiyonunda tutulur. Items koleksiyonunun Count özelliği ile toplam öğe sayısı bulunur.
DropDownList kontrolune tasarım veya çalışma zamanında öğe eklenebilir. Örnekte
DropDownList kontrolune tasarım zamanında öğe eklenmektedir.
27
<asp:DropDownList id="dropdownlist1" runat="server">
<asp:ListItem>Türkçe</asp:ListItem>
<asp:ListItem>İngilizce</asp:ListItem>
<asp:ListItem>Almanca</asp:ListItem>
<asp:ListItem>İtalyanca</asp:ListItem>
</asp:DropDownList>
<asp:Button id="Button1" Text="Submit"
OnClick="Button_Click" runat="server"/>
<asp:label id="Label1" runat="server"/>
28
private void tikla(object sender, System.EventArgs e)
{
Label3.Text = TextBox1.Text;
Label3.Font.Size = Convert.ToInt32(Textbox2.Text);
}
private void secim(object sender, System.EventArgs e)
{
if (DropDownList1.SelectedItem.Text == "Bold")
{
Label3.Font.Bold = true;
}
if (DropDownList1.SelectedItem.Text == "Italic")
{
Label3.Font.Italic = true;
}
if (DropDownList1.SelectedItem.Text == "Altcizgili")
{
Label3.Font.Underline = true;
}
}
29
ListBox
}
}
}
30
private void tikla(object sender, System.EventArgs e)
{
Label3.Text = TextBox1.Text;
Label3.Font.Size = Convert.ToInt32(Textbox2.Text);
}
private void secim(object sender, System.EventArgs e)
{
if (ListBox1.SelectedItem.Text == "Times New Roman")
{
Label3.Font.Name = ListBox1.SelectedItem.Text;
}
if (ListBox1.SelectedItem.Text == "Courier New")
{
Label3.Font.Name = ListBox1.SelectedItem.Text;
}
if (ListBox1.SelectedItem.Text == "Arial")
{
Label3.Font.Name = ListBox1.SelectedItem.Text;
}
if (ListBox1.SelectedItem.Text == "Arial Narrow")
{
Label3.Font.Name = ListBox1.SelectedItem.Text;
}
}
31
Görüldüğü gibi ListBox kontrolü kullanılarak yazı tipi seçilmektedir. Bu örnekte de bir
önceki örnekte olduğu gibi “OnSelectedIndexChanged” özelliği kullanılarak secim metodu
çağrılır. Ve kodlara göre işlem yapılmaya başlanır.
Panel
Panel, diğer kontrolleri gruplandırmak için kullanılır. Örnekte panel kullanımı gösterilmektedir.
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="Default.aspx.cs" Inherits="_Default" %>
</script>
32
</head>
<body>
Panel1 isimli panel kontrolü başlangıçta gösterilmemektedir Button1 düğmesi tıklanınca, panel
kontrolunun içerisine label kontrolu eklenir ve görünür hale getirilir. BackImageUrl özelliği ile
panele arka plan resmi verilir.
33
Butonların OnClick özelliği metotlara yönlendirildiğinde panellerin nasıl gizlenip
görüntülendiğini görebilirsiniz.
Table
34
c.Controls.Add(new LiteralControl("Satır " +
j.ToString() + ", hücre " + i.ToString()));
r.Cells.Add(c);
}
Table1.Rows.Add(r);
}
}
35
for(int satir_sayisi=0;satir_sayisi<satir;satir_sayisi+
+)
{
s=new TableRow();
for(int
sutun_sayisi=0;sutun_sayisi<sutun;sutun_sayisi++)
{
hucre=new TableCell();
hucre.Text="Satir"+satir_sayisi+1+" Sutun="+
sutun_sayisi+1;
s.Cells.Add(hucre);
}
Table1.Rows.Add(s);
}
}
</script>
</HEAD>
<body bgcolor=#cc9999>
<asp:TableRow>
<asp:TableCell BorderStyle="Inset"
BorderColor="#FFC0C0"></asp:TableCell>
</asp:TableRow>
36
</asp:Table></form>
</body>
</HTML>
Tablo işlemleri satır ve hücreler bazında yürütülür. Bunun için TableCell ve TableRow
kontrolleri kullanılır. Programımızda ListBox’lardan aldığımız değerler ile döngü oluşturup
istenilen satır ve hücrede tabloyu oluşturuoruz. “hucre” kontrolü sayesinde hücreye isteğimiz
metin ve değerler yazdırılır.
37
DOĞRULAMA(VALIDATION) KONTROLLER
Web forma girilecek verinin doğruluğunu kontrol etmek için sıklıkla JavaScript fonksiyonları
veya uzun ASP kodları kullanılırdı. Bu durum uygulama geliştirme sürecinin artmasına neden
olurdu.
ASP.NET ile birlikte verinin doğruluğunu kontrol etmek için doğrulama kontrolleri geliştirildi.
ASP.NET, belirli bir aralıkta veri girişi sağlayan, karşılaştırma yapan ve belirli değerlerin boş
geçilmemesini sağlayan çeşitli doğrulama kontrolleri sunar. Tablo da doğrulama kontrolleri
listelenmiştir.
38
CustomValidator Özel doğrulama kontrolu yazmayı sağlar.
ValidationSummary Sayfada kullanılan tüm validation
kontrollerin, doğrulama hatalarını özet olarak
görüntüler.
RequiredFieldValidator
<asp:RequiredFieldValidator id="RequiredFieldValidator1"
style="Z-INDEX: 103; LEFT: 224px; POSITION: absolute;
TOP: 48px" runat="server"
ErrorMessage="Adınızı Girmelisiniz!!!"
ControlToValidate="txtad">
</asp:RequiredFieldValidator>
CompareValidator
Kontrol içerisine girilen değeri, sabit değerle veya başka bir kontrol ile karşılaştırmak için
kullanılır. Doğrulama yapılacak web kontrolünün ismi ControlToValidate özelliğine girilir.
39
Karşılastırma yapılacak sabit değer ValueToCompare özelliğine girilir. Type özelliğine girilen
değerin veri türü, Operator özelliğine ise mantıksal operatör girilir.
Örnekte txtYas kontrolune yirmi veya yirmiden büyük tamsayı girişi sağlayan doğrulama işlemi
yapılmaktadır.
<asp:CompareValidator id="CompareValidator1"
style="Z-INDEX: 109; LEFT: 232px; POSITION: absolute;
TOP: 88px" runat="server"
ErrorMessage="Yaşınız 20 ye eşit veya büyük olmalıdır."
ValueToCompare="20"
ControlToValidate="txtYas"
Type="Integer"
Operator="GreaterThanEqual"
Width="128px">
</asp:CompareValidator>
Doğrulama yapılacak web kontrolu, başka bir web kontrolü ile karşılaştırılacaksa
ControlToCompare özelliği kullanılır.
<asp:CompareValidator id="CompareValidator1"
style="Z-INDEX: 109; LEFT: 240px; POSITION: absolute;
TOP: 128px" runat="server"
ErrorMessage="yaşınız kontrol alanında yazılan
değerden büyük olmalıdır."
ControlToValidate="txtYas"
Type="Integer"
Operator="GreaterThan"
Width="144px"
ControlToCompare="txtKontrol">
</asp:CompareValidator>
40
RangeValidator
Kontrol içerisine girilen değerin, belirli bir değer aralığında olmasını sağlar. Doğrulama
kontrollerinin ortak özelliklerine ek olarak MinimumValue, MaximumValue ve Type özellikleri
vardır.
Örnekte txtYas kontrolune girilen değerin, otuzbeş ile elli arasında olamasını sağlayan
doğrulama işlemi yapılmaktadır.
<asp:RangeValidator id="RangeValidator1"
style="Z-INDEX: 109; LEFT: 240px; POSITION:
absolute; TOP: 128px" runat="server"
ErrorMessage="Yaşınız 35 ile 50 arasında olmalıdır."
ControlToValidate="txtYas"
Type="Integer"
MaximumValue="50"
MinimumValue="35">
</asp:RangeValidator>
RegularExpressionValidator
<asp:regularexpressionvalidator
id="RegularExpressionValidator1" style="Z-INDEX: 111;
LEFT: 256px; POSITION: absolute; TOP: 168px"
runat="server"
ErrorMessage="Mail giriş hatası"
ControlToValidate="txtMail"
ValidationExpression=
"\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*">
</asp:regularexpressionvalidator>
41
Karakter Tanımı
a Bir harf kullanımını zorunlu kılar.
1 1 sayısı kullanılmak zorunda.
? 0 veya 1 öğe olmak zorunda
* 0’dan n’e kadar bir değer
+ 1’den n’e kadar bir değer
[0-n] 0’dan n’e kadar sayı değer dizisi
{n} N ile belirtilen değer uzunluğunda olmalı
| Farklı geçerli dizinler.
\ Bir komut karakterini devam ettiren karakter
\w Bir karakter olmak zorunda.
\d Bir rakam olmak zorunda.
\. Bir nokta olmak zorunda.
Örnekte ValidationExpression özelliğine girilen özel karakterler ile e-mail formatı
oluşturulmaktadır.
ValidationExpression= "\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*">
CustomValidator
Aynı anda birden fazla nesnenin değerini kontrol etmek veya kullanıcı tanımlı kontrol yazmak
için CustomValidator kontrolü kullanılır.
Özellik Açıklama
ClientValidationFunction İstemci fonksiyon ismini belirtir.
ControlToValidate Doğrulama yapılacak kontrolü belirler.
42
Display Text özelliğine girilen hata mesajının nasıl görüntüleneceği
belirtir.
EnableClientScript İstemci skriptleri aktif hale getirir. Varsayılan değer True dur.
Enabled Sunucu ve istemci taraflı skriptleri aktif hale getirir. Varsayılan
değer True dur.
ErrorMessage Kontrol hata mesajını gösterir.
IsValid Kontrol işlemi başarı ile sonuçlanmışsa True, değilse False
değerini döndürür.
Text Kontrol hata mesajını gösterir. ErrorMessage ve Text özelliği
birliktekullanılabilir. Bu durumunda Text özelliğindeki mesaj
görüntülenir.
ServerValidate olayı ve OnServerValidate metodu ile sunucu taraflı kontroller etiklenir.
Örnekte sunucu taraflı metod oluşturulmaktadır.
IsValid: Bu özellik True ise kontrol içerisine girilen değerin doğruluğu sağlanmıştır.
Value: Doğrulama kontrolünün değerini verir.
43
<asp:CustomValidator id="CustomValidator1" style="Z-INDEX: 102;
LEFT: 312px; POSITION: absolute; TOP: 64px" runat="server"
ErrorMessage="çift rakam giriniz." ControlToValidate="txtcustom"
Display="Static" OnServerValidate="ServerKontrol">
</asp:CustomValidator>
</form>
CustomValidator kontrolunun C# kodları aşağıdaki gibidir.
public void ServerKontrol(object source,ServerValidateEventArgs args)
{
try
{
}
catch (Exception ex)
{
args.IsValid = false;
}
}
public void gonder_OnClick(object sender, EventArgs e)
{
if (Page.IsValid)
{
txtmessage.Text = "Sayfada Hata Yok.";
}
else
{
txtmessage.Text = "Sayfa Hatalı!";
}
}
ValidationSummary
ValidationSummary, doğrulama kontrollerin ErrorMessage özelliğine girilen tüm mesajları
listeler.
Örnekte ValidationSummary kullanımı gösterilmektedir.
44
DisplayMode özelliği ile ValidationSummary kontrolunun görüntüsü değiştirilebilir.
DisplayMode, BulletList, List ve SingleParagraph değerlerini alır. ShowMessageBox, hata
listesinin mesaj kutusu içinde görüntülenmesini sağlar.
ZENGİN KONTROLLER
AdRotator
AdRotator, Web sayfaları üzerinde reklam yayını yapmak için kullanılır. Reklam için kullanılan
banner nesneleri XML dosya içerisine kaydedilir.
<Advertisements>
<Ad>
<ImageUrl>image1.gif</ImageUrl>
<NavigateUrl>http://www.bilgeadam.com</NavigateUrl>
<AlternateText>BilgeAdam BTA</AlternateText>
<Impressions>80</Impressions>
<Keyword>Yazılım</Keyword>
</Ad>
<Ad>
<ImageUrl>image2.gif</ImageUrl>
<NavigateUrl>http://www.microsoft.com</NavigateUrl>
<AlternateText>Microsoft Site</AlternateText>
45
<Impressions>80</Impressions>
<Keyword>microsoft</Keyword>
</Ad>
</Advertisements>
Calendar
Calendar, web sayları üzerinde Takvim göstermek için kullanılır.
Özellik Açıklama
CellPadding Hücreler ve kenarlıkları arasındaki boşluk değerini tutar.
CellSpacing Hücreler arasındaki boşluk değerini tutar.
DayNameFormat Gün isimlerinin görüntülenme biçimini tutar. FirstLetter,
FirstTwoLetters, Full ve Short değerleri vardır. Varsayılan Short
değeridir.
FirstDayOfWeek Haftanın ilk gününü belirtir.
NextPrevFormat Next ve Previous linklerinin biçimini ayarlar. CustomText,
FullMonth, ShortMonth değerleri alır. Varsayılan CustomText
değeridir.
SelectedDate Seçilen gün bilgisini tutar. Varsayılan değer günün tarihidir.
46
SelectionMode Calendar nesnesinin seçim modunu belirler. Day, DayWeek,
DayWeekMonth ve None değerleri alır. Varsayılan seçenek Day
değeridir.
ShowDayHeader Gün isimlerini kolonların üzerinde görüntüler.
ShowGridLines Günleri hücreler içinde görüntüler.
ShowNextPrevMonth Önceki ve sonraki ay linklerinin görüntülenmesini sağlar.
ShowTitle Takvim başlığını görüntüler.
TitleFormat Başlık yazısının biçimini belirtir.
Örnek:
Yapacağımız uygulama takvimin herhangi bir gününe tıklandığımda günün değerini
gün/ay/yıl formatında labelin text özelliğine yazarak ekrana yazar. Şimdi aşağıdaki örneğimizi
inceleyelim.
<%@ Page language="c#" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0
Transitional//EN" >
<HTML>
<HEAD><title>WebForm1</title>
<script runat="server">
private void tarih_secimi(object nesne, EventArgs e)
47
{
Label1.Text+="Secilen Tarih <b> :";
Label1.Text+=Calendar1.SelectedDate.ToShortDateString();
Label1.Text+=" </b> ";
}
</script>
<meta name="GENERATOR" Content="Microsoft Visual
Studio .NET 7.1">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript"
content="JavaScript">
<meta name="vs_targetSchema"
content="http://schemas.microsoft.com/
intellisense/ie5">
</HEAD>
<body MS_POSITIONING="GridLayout"><form id="Form1" method="post"
runat="server">
NextPrevFormat="FullMonth"></asp:Calendar>
<asp:Label id="Label1" style="Z-INDEX: 102; LEFT: 96px;
POSITION: absolute; TOP: 312px" runat="server" Width="200px"
Height="40px"></asp:Label>
</form>
</body>
</HTML>
48
Çıktı 14 : Calendar kontrolü
Burada dikkat edilmesi gereken nokta “OnSelectionChanged” olayı ile "tarih_secimi"
yordamı işletilmektedir. "tarih_secimi" yordamında da Calendar’ dan alınan bilgiler Label' in
Test özelliğine eklenmektedir.
AUTOPOSTBACK ÖZELLİĞİ
AutoPostBack özelliği, herhangi bir sunucu kontrolünün web sunucuya otomatik olarak bilgi
göndermesini sağlar. Web formu doldurduktan sonra sunucuya göndermek için genellikle
button kontrolu kullanılır.
Bu özelliğin True olması, seçim yapıldığında veya TextBox kontrolüne yeni bir değer
girildiğinde sayfanın yeniden yüklenmesi anlamına gelir.
49
Örnekte AutoPostBack kullanımı gösterilmektedir.
</HEAD>
<body >
<form id="Form1" runat="server">
Bildiğiniz Yabancı Dili Seçiniz:<br/><br/>
<asp:listbox id="lstDiller" runat="server" rows="3"
AutoPostBack="true" onSelectedIndexChanged="secimGoster"
Height="114px" Width="178px" />
<br />
<br />
<asp:Label id="lblMesaj" runat="server" /> <br/><br/>
</form>
</body>
</HTML>
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
lstDiller.Items.Add(new ListItem("İngilizce"));
lstDiller.Items.Add(new ListItem("Almanca"));
lstDiller.Items.Add(new ListItem("Fransızca"));
lstDiller.SelectedIndex = 0;
}
}
public void secimGoster(object source, EventArgs e)
{
50
lblMesaj.Text = "Seçtiğiniz Dil " +
lstDiller.SelectedItem.Text;
}
VIEWSTATE
ViewState, kullanıcı ve sunucu arasında taşınan verilerinn gizli bir alanda şifrelenerek
saklanmasını sağlar. Forma ait tüm kontrollerin değerleri şifrelenir ve VIEWSTATE değişkende
saklanır. Form sunucuya gönderildikten sonra bir hata oluşması halinde kullanıcıdan tekrar aynı
verilerin girilmesi istenmez. Çünkü kullanıcının girmiş olduğu değerler bu gizli değişkende
saklanır ve sayfa açılınca tekrar kullanıcıya sunulur.
51
****** UygulamaÖrneğivarsonrak.oy******
FORM GEÇERLİLİK DENETİMİ
En iyi veri giriş programları kullanıcıların geçersiz veri girmelerine izin vermez. Daha
az iyi veri giriş programları kullanıcılar geçersiz veri girdiğinde durumdan haberdar eder. Kötü
programlar ise kullanıcıların geçersiz veri girmelerine olanak tanıdıkları gibi birde geçerlilik
denetimi adımını atladıkları için değişmez biçimde veri bütünlüğü problemi ile karşılaşırlar. Bu
problemleri çözmek için veri üzerinde geçerlilik deneti yapmak zorundayız. İzlenmesi gereken
genel kural şudur: bu kontrolleri girdi noktasına ne kadar yakın gerçekleştirirsek tutarlı veriler
almamızda o kadar olası olur.
Örneğin yukarıda hazırladığımız formda hem kullanıcı adı hem de şifre bölümünün bir
değer içermesi gerektiğini biliyoruz. Çünkü bu iki değer olmadan kullanıcı kimlik denetimi
yapmak mümkün değildir. Bu yüzden her iki değerinde girilmesi gerektiğini garanti etmeliyiz.
Ayrıca şifrelerin en az 6 karakterli ya da kullanıcı adının harf ve akamdan oluşması gibi her
alanın içeriği ile ilgili kurallarımız olmalıdır.
Şimdi Validator kontrollerini kullanarak istemci taralı geçerlilik denetimi yapan bir
örnek yapalım. Daha önce oluşturduğumuz kullanıcı denetim formunu açalım. Toolbox ‘ta
bulunan iki adet RegularExpressionValidator kontrolünü tasarım yüzeyine çekelim. Bunları
tablonun alına sırası ile yerleştirelim. Sonra kontrollerin ID özelliklerini sırasıyla
kullaniciadivalidator ve sifrevalidator olarak ayarlayalım. Ayrıca kontrollerin diğer özelliklerini
aşağıdaki gibi yapalım.
52
ErrorMessage Kullanıcı adı hatalı. Şifre hatalı
Kullanıcı adı 3 10 karakter arasında ve
Yalnızca harf ve rakamdan oluşmalıdır.
ValidationExpression [a-zA-Z_0-9]{3,10} .{6,10}
Eğer girdiğimiz belirttiğimiz ölçütlere karşın tutarsız olursa hatalar aşağıdaki şekilde
görüldüğü gibi verilecektir. Örneğin kullanıcı adına iki karakter girip tab tuşuna bastığımızda
geçerlilik denetimi anında ateşlenecektir ve ilk hata tablonun altında belirtilecektir.
53
ASP.NET İLE KOD GELİŞTİRMEK
KOD YAZMAK
54
Web Forma kod eklemek için üç yol izlenir:
• Mixed Code: Bu metotta web içeriği ile kod aynı sayfa içerisinde yazılır. Bu metot pek tercih
edilmez çünkü okunması ve düzenlenmesi zordur.
• Inline Code: Web içeriği ile kod aynı sayfa içerisinde yer alır. ASP.NET kodu Script etiketi
içerisine yazılır.
• Code-behind: HTML içeriği ve Visual Basic .NET kodu tamamen ayrı dosyalarda tutulur.
Kod dosyasına code-behind sayfası denir. Bu metot Visual Studio .NET ortamının varsayılan
çalışma şeklidir.
55
Aynı .aspx dosyası içinde HTML kodu ve C# kodu ayrı bölümlere yazılır. Bölümlerin ayrı
tutulması okunabilirliği arttırır. Server taraflı kodlar Script etiketi içersine yazılmalıdır ve
runat=”server” özelliği belirtilmelidir.
<%@ Page Language="C#" %>
<html>
<head>
<title>My First Web Form</title>
<script runat="server">
private void Page_Load (Sender As Object , e As EventArgs )
{
Message.Text = "Inline Kod Yazdık";
}
</script>
</head>
<body>
<form runat="server">
<asp:Label id="Message" runat="server" />
</form>
</body>
</html>
56
Visual Studio.NET ortamının kullandığı varsayılan model code-behind tasarım modelidir.
Programlama ve tasarım sayfaları ayrı tutularak çalışma mantığına göre ayrım yapılmış olur.
Code-behind sayfaları, .aspx uzantılı sayfanın sonuna.cs eklenerek isimlendirilir.
Webform1.aspx sayfasının code-behind sayfası, WebForm1.aspx.cs şeklindedir.
Form üzerinde bir kontrole çift tıklandığında code-behind sayfası açılır ve o kontrole ait olay
için metot tanımlanır.
using System;
using System.Collections;
using System.ComponentModel;
57
using System.Data;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
public class WebForm1 : System.Web.UI.Page
{
}
private void Button1_Click(object sender, System.EventArgs e)
{
lblMesaj.Text = "Hoşgeldin " +
txtAd.Text.ToString();
}
Codebehind
Code-behind sayfasının ismini temsil eder. Visual Studio .NET platformunun dosyayı
birleştirebilmesi için gereklidir.
Src
Code-behind sayfasının ön derleme işleminden geçmediği durumlarda bu özellik kullanılır.
Code-behind sayfasının ismini temsil eder.
Client-side olay prosedürleri, web forma istekte bulunan kullanıcı bilgisayarı üzerinde işlenen
olaylardır. Kullanıcı tarafında oluşan bu olaylar, sunucuya hiçbir bilgi göndermezler. Çünkü
istemci tarafındaki Internet tarayıcısı kodu alır ve işler.
58
Client-side olay prosedürleri yalnızca HTML kontrolleri tarafından kullanılır. Client-side olay
prosedürleri hiçbir zaman sunucu kaynağı kullanmaz. Örneğin SQL Server veritabanına erişmek
için client-side kod kullanılamaz.
Client-side olay prosedürlerini, istemci tarafında kısa zamanda oluşması istenilen olaylar için
kullanılır. Örneğin, metin kutusuna girilen değerin doğruluğunu kontrol etmek için client-side
kod kullanılabilir.
Client-side kodlar <Script> blokları içerisinde tanımlanır. Örnekte JavaScript ile istemci tarafılı
kod tanımlanmaktadır.
<SCRIPT language=”JavaScript”>
</SCRIPT>
Server-side olay prosedürleri, sunucu üzerinde çalışan olaylardır. Server-side olay prosedürleri
client-side olay prosedürlerinden oldukça güçlüdür.
Server-side olay prosedürleri, web sunucusu üzerinde bulunan derlenmiş kodlardan oluşur. Web
ve HTML server kontrolleri tarafından oluşturulan olayların, işlenmesinde kullanılır. Client-side
olay prosedürleri sunucu kaynaklarını kullanamazken, server-side olay prosedürleri sunucu
kaynaklarını kullanır.
Client-side olay prosedürleri ile fare ve klavye olaylarına kod yazılabilir. Server-side olay
prosedürleri Click ve Change gibi olaylar için kullanılır. Fare ve klavye olayları gibi çok sık
gerçekleşebilecek olayları desteklenmez.
59
Olay Prosedürleri Oluşturmak
Visual Studio .NET içerisinde server-side olay prosedürleri iki adım ile oluşturulur. Birinci
adım olay üretecek kontrolu web form üzerine eklemektir. İkinci adım ise code-behind
sayfasına olay prosedurünü eklemektir.
Örnekte Web form içerisine btn1 isminde bir button yerleştirilmiştir. Eklenen btn1 kontrolunun,
üretilen HTML kodu ve code-behind sayfasına eklenen olay prosedürü aşağıdaki kod ile
belirtilmiştir.
Kod: Button Kontrolüne Click Olayı ile İlişkilendirmek
<asp:Button id=”btn1” runat=”server”/>
‘...
protected System.Web.UI.WebControls.Button btn1
private void btn1_Click(object sender, System.EventArgs e)
{
//…
}
Server olay prosedürlerinin çalışmasını sağlamak için kontrollerin WithEvents anahtar sözcüğü
ile tanımlanması gerekir.
Örnekte txtAd isimli metin kutusuna girilen değer lblMesaj isimli etikete yazdırılmaktadır.
60
Kod : Olay prosedürleriyle Çalışmak
<asp:TextBox id=”txtAd” runat=”server” />
<asp:Button id=”btn1” runat=”server”/>
<asp:Label id=”lblMesaj” runat=”server” />
Bir ASP.NET sayfası belirli olaylar sırası ile çalışır. Bu sıraya “Sayfa Yaşam Döngüsü” denir
Page Event yaşam döngüsü sonlandığında sayfaya ait bilgiler hafızadan silinir.
61
Kontrol olaylarının çoğu, sayfa sunucuya geri gönderilene kadar gerçekleşmez. Örneğin Click
olayı ile form sunucuya gönderilmeden Change olayları gerçekleşmez.
POSTBACK İŞLEMLERİ
Varsayılan olarak veri yollayan tek kontrol Button kontrolüdür. Diğer kontroller
için AutoPostBack özelliğinin True yapılması gerekir.
Page.IsPostback
Page Load olayı, sayfa yüklendiği zaman gerçekleşir. Sayfaya yapılan her istekte Page Load
olayı içindeki kodlar çalışır. Aynı sayfanın her seferinde yeniden çalıştırılması, istenilen bir
durum değildir.
62
Page.IsPostback özelliği ile, sayfanın Load olayı içindeki kodlar sadece bir kez çalıştırılır.
Böylece sayfa yeniden çağrıldığında bu işlemler gerçekleşmez.
Örnekte Page.IsPostBack özelliğinin kullanımı gösterilmektedir.
Kod : Page.IsPostBack
private void Page_Load(System.Object sender,
System.EventArgs e)
{
//Put user code to initialize the page here
if(!Page.IsPostBack)
{
//sadece sayfanın ilk yüklendiğinde çalışan istenilen
alan
}
//sayfa her yüklendiğinde çalılşan alan
}
Bir Web Formu her talep edildiğinde Page_Load olayını çalıştırır. Ancak olay bir http
GET talebi ile POST talebini birbirinden ayırmaya arayan bir kod içerir. IsPostBack’in değeri
true olduğunda kullanıcı WebForms sayfasını en az bir kez görmüş demektir. Page nesnesi,
Page_Load olayı işlerken çalışmaya başladığı için, bu anahtar sözcüğü this.IsPostBack gibi açık
kullanmamız gerekmez. Yalnızca IsPostBack yazmamız yeterlidir.
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
63
using System.Web.UI.HtmlControls;
using System.Drawing;
int yukseklik,genislik;
Graphics grafik=Graphics.FromImage(b);
genislik=(int)
grafik.MeasureString(s,yazifontu).Width;
yukseklik=(int)
grafik.MeasureString(s,yazifontu).Height;
64
grafik.DrawString(s,yazifontu,new
SolidBrush(Color.Yellow),0,0);
grafik.Flush();
return(b);
}
Burada dikkat etmemiz gereken önemli gereken bir husus getImage fonksiyonunun
kendisi bir Bitmap formatında bir resim döndürse de WebForm1.aspx Web formu gif
formatında bir resim döndürür. Aşağıdaki fonksiyon kullanıcının WebForm1.aspx formuna
girdiği metni kullanarak bir BMP dosyası oluşturmaktadır.
Sayfayı ilk görüntülediğimizde, Page_Load olayı meydana gelir. Tarayıcı, Web Formu
get metodu ile istediği için Page.IsPostBack özelliğinin değeri false’dir. Dolayısıyla
tarayıcımızda “Sayfa Yüklenmeden Önce ” metnini görmekteyiz. Metin girilip enter tuşuna
basıldıktan sonra tarayıcı formu sunucuya gönderir. Formu gönderdiğimizde Webform1.aspx
sayfası bu kez Post talep metodunu kullanarak yeniden ister. Page_Load yeniden çalışır. Ancak
bu kez IsPostBack özelliği true’dir. Böylece sayfa bir resim oluşturma sürecini gerçekleştirir.
Projeyi kaydedip F5 fonksiyon tuşuna basarak projeyi derleyip çalıştıralım. IDE yeni
bir tarayıcı örneği açacaktır.
65
Çıktı 1 : Dinamik resim örneği
TextBox’a metin girip enter tuşuna bastığımızda, sunucu girdiğimiz metni içerecek şekilde
boyutlandırılmış bir gif resmine dönüştürerek aşağıdaki gibi yanıt verecektir.
66
RESPONSE VE REQUEST NESNESİ
İstek (Request)
RESPONSE NESNESİ
Response.Write
ASP.Net tagları arasına yazacağımız Response.Write (değişken ya da sabit) ifadesi ile sayfada,
ASP.Net kodları içinde istediğimiz herhangi bir değişken ya da yazının görüntülenmesini
sağlayabiliriz. ASP.Net’in çok kullanılan ifadelerinden biridir. Response.Write ifadesinde html
tagları kullanabiliriz;
Örneklersek;
67
<form id="form1" runat="server">
<div lang="tr" title="Dinamik Sayfa Örneği">
<br />
<br />
<asp:Label ID="Label1" runat="server"
Text="Ad"></asp:Label>
<asp:TextBox ID="TextBox1" runat="server" Text="deneme">
</asp:TextBox></div>
<%int d = 33; %>
<%Response.Write("<h1>Erkan TANYILDIZI, Yaş: </h1>");
Response.Write("<h2>"+d+"</H2>");%>
</form>
</body>
</html>
Örnek:
Response_write2.aspx
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Dinamik Sayfa Örneği</title>
</head>
<body>
68
<%
int i;
for (i = 0; i < 8; i++)
{
Response.Write("<font size=" + i + ">merhaba
<br></font>");
} Response.Write ("<hr width=80%\>");
%>
</body>
</html>
Write ile yazdan ifadelerde dikkat etmemiz gereken başka bir nokta, sabit ifadelerin
sunucu için anlamlı olabilecek ifadeler içermemesidir Örneğin
Response.Write (“<hr width=80%>”)
ifadesinde, sayfanın yüzde sekseninde enine bir çizgi oluşturmak istediğimizi bildiren 80%
ifadesi aynı zamanda %> şeklinde, sunucu için anlamlı bir tag oluşturmaktadır.
69
Bunu önlemek için ifademizi aşağıdaki iki şekilden birinde yazabiliriz:
Response.Write (“<hr width=80%\>”)
Response.Redirect
Kullanımı Response.Redirect’tir (URL). Bu ifadeye geldiğinde mevcut ASP sayfası
çalışmasını durdurup belirtilen URL adresindeki sayfayı browserımıza getirir.
Örnek:
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="Default.aspx.cs" Inherits="_Default" %>
</form>
</body>
</html>
70
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="yonlendirilen.aspx.cs" Inherits="yonlendirilen" %>
Response.Buffer
Response nesnesinin bu özelliği ile, sayfaların yükleme biçimlerini belirleyebiliriz.
Respose.Buffer=true şeklindeki bir ifade, web sayfası kodlarımızın en başına yazilır. Bu ifadeyi
71
gören server sayfa içindeki bütün sunucu scriptlerin işlevi tamamlanmadan, browser’a cevap
göndermeyecektir. Ne zamanki sayfadaki sunucu taraflı scriptlerin çalışması biter ve sayfa
tamamlanırsa o zaman geçici hafızasında (buffer) sakladığı sayfa bilgilerinin tamamını
browser’a gönderir. Eğer Response.Buffer=false ise tamponlama yapılmadan bilgileri hemen
browsere gönserecektir.
Response.Flush:
Sunucu ASP sayfası içindeki satırlarda bu ifadeye rastlarsa, o zamana kadar buffer’da
(tampon hafıza) sakladığı sayfa değerlerini, browser’a gönderir.
1. <html xmlns="http://www.w3.org/1999/xhtml" >
2. <head runat="server">
3. <title>Dinamik Sayfa Örneği</title>
4. </head>
5. <body>
6. <%Response.Buffer = true; %>
7. <p>Bu satır sunucunun tampon (buffer) hatızasında
saklanan ilk satır.
8. bu satırdan sonraki " flush" metodu ile hemen browsera
gönderilecek </p>
9. <% Response.Flush();%>
10. <p>Bu yazı flush metodundan sonra gösterilmiştir</p>
11. </body>
12. </html>
Yukarıdaki örneğe bakarsak, sunucu 9. satıra kadar olan işlemlerin sonucunu, browser’a
gönderilmek üzere tampon hafızasında tutacak, 9. satırdaki ifade ile birlikte bu değerleri,
ziyaretçinin browser’ına gönderip, kalan satırları işleyecektir. Sayfanın bitiminde de kalan diğer
satırların sonucunu gönderecektir.
Response.Clear
Sunucunun o zamana dek tampon hafızasında kullanıcıya göndermek üzere tutuğu
bütün bilgileri siler.
72
2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-
transitional.dtd">
Response.End
Rsponse.Clear metodunun tam tersidir. Bu satırı gördüğünde sunucu işlemlerini durdurup, o
zamana kadar olan tampon hafıza değerlerini browser’a gönderir ve scriptin çalışması durur.
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title></title>
</head>
73
<body>
<% Response.Buffer = true;%>
<p>Bu yazıdan sonraki yazılar gözükmüyor, çünkü sunucuya bu
satırdan hemen sonra "dur ve tampon hafızasındaki değerleri
gönder" komutu verdik.
</p>
<% Response.End();%>
<p>Bu yazı hiçbir zaman görüntülenmeyecek </p>
</body>
</html>
Konuyu daha iyi anlamak için, yine bir örnek üzerinden gidelim ve aşağıdaki sayfayı bu
defa sayfa yükleme olayına yazarak oluşturalım;
Web Formunun yüzeyi üzerine sağ fare tuşuna tıklayın ve bağlam menüsünden View
Code komutunu seçin. Burada birçok kod çıkacaktır karşımıza. Fakat bizim değiştirmek
istediğimiz metot Page_Load olayının kodudur.
Bir Web Formu her talep edildiğinde Page_Load olayını çalıştırır.
flush_clear_end.aspx
74
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="Default.aspx.cs" Inherits="_Default" %>
</body>
</html>
flush_clear_end.aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Drawing;
75
4. Response.Clear();
5. Response.Write ("Bu yazı tampon hafıza temizlendikten
sonra, tampon hafızada tutulmuş oradan da browser’a
gönderilmiştir.<br/>");
6. Response.End();
7. Response.Write("Bu yazıda hiçbir zaman gözükmeyecek,
çünkü response nesnesi, response.end ile browser’a
her türlü gönderimi durdurulmuştur. <br/>");
}
}
1. satırda sayfaya yazdırmak istediğimiz mesaj, 2. satırdaki “response.flush” dan dolayı, tampon
hafızada turulmamış ve o zamana kadar tampon hafıza. da bulunan her şey, bu mesajla birlikte,
istemciye hemen gönderilmiştir.
3. satırdan itibaren tampon hafıza yine birikmeye başlamış ancak bu seferde
4. satırda, “response.clear” ile bütün hafıza silinmiş, diğer bir ifadeyle boşaltılmıştır. Dolayısı
ile 3, satırdaki mesaj browser’a gönderilmeden silinmiştir ve hiçbir zaman sayfada
görüntülenmeyecektir.
76
5. satırdaki mesajla birlikte yine tamponlanma yapılmaya başlanır. Ancak 6. satırda, gönderimin
sona erdiği, “response.end” ile bildirilir ve o zamana kadar tamponda birikmiş olanlar,
istemciye gönderilir, Bu ise 5. satırımızın kendisidir.
7. sarırdaki mesaj, “response.end” ile göndenim süreci sonlandırıldığından, hiçbir zaman
sayfada gözükmeyecektir.
Response.Expires
</body>
</html>
77
Expires değerini sıfır yaparak sayfanın geçici hafızada (chace) saklanmasını engelledik.
Response.ExpiresAbsolute
Bazende sayfaların belirli bir tarihe kadar geçici bellekte saklanmasını isteyebiliriz. Bu
durumlarda Response nesnesinin ExpiresAbsalute özelliğini kullanırız.
</body>
</html>
Response.Charset Özelliği
Bir çok farklı karakter seti mevcuttur. Bu özellikle bilindik karakter setleri sayfanızda
kullanabilirsiniz. Örneğin İsveç karakterlerinin çıktısını almak istersek bu özelliğe “ISO-88959-
1” değerini aktarmanız gerekir. Bu özellikle ilgili önemli bir bilgide bu değişiklikleri
Response.BufferOutput özelliği false iken yapmalıyız. Aksi halde sayfa hata verir.
Türkçe karakter için <%Response.CharSet = "UTF-8"; %> kullanılmalıdır.
Response.Cookies Özelliği
78
Response.Cookies özelliği, HttpCookie nesnelerinin bir koleksiyonunu içerir.
Cookie’ler temel olarak iki şekilde oluşturulur.
// Anahtar kelimelerde Türkçe karakter kullanılmaz…..
Cookie.aspx
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="Default.aspx.cs" Inherits="_Default" %>
<p>
Cookie oluşturma</p>
<form runat="server" method="post">
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click"
Text="Button" />
</form>
</body>
</html>
Cookie.aspx.cs
79
Response.Cookies["KullaniciBilgi"]["KullaniciAdi"] =
"Bigisayar -Elektronik";
Response.Cookies["KullaniciBilgi"]["SonZiyaret"] =
DateTime.Now.ToString();
Response.Cookies["KullaniciBilgi"].Expires =
DateTime.Now.AddDays(3);//geçerlilik süresi
//2.Yol
HttpCookie cerez = new HttpCookie("Kullanici");
cerez.Values["Sifre"] = "123Bilgisayar456";
cerez.Values["SonErisim"] = DateTime.Now.ToString();
cerez.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(cerez);
//2.Yol
HttpCookie cerez2 = new HttpCookie("sevilenRenk",
"Mavi");
Response.Cookies.Add(cerez2);
}
80
yonlendirilen.aspx
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="yonlendirilen.aspx.cs" Inherits="yonlendirilen" %>
81
<asp:Label ID="Label3" runat="server"
Text="Label"></asp:Label>
</div>
</form>
</body>
</html>
yonlendirilen.aspx.cs
protected void Page_Load(object sender, EventArgs e)
{
//1.yol Okuma
if (Request.Cookies["KullaniciBilgi"]!= null)
{
Label1.Text =
Server.HtmlEncode(Request.Cookies["KullaniciBilgi"]
["KullaniciAdi"]);
Label2.Text =
Server.HtmlEncode(Request.Cookies["KullaniciBilgi"]
["SonZiyaret"]);
}
//Response.Write(Server.HtmlEncode(Request.Cookies["R"])); -
hata
HttpCookie cerez = Request.Cookies["Kullanici"];
Response.Write(Server.HtmlEncode(cerez.Values["Sifre"]))
;
Response.Write("<br>");
Response.Write("<br>");
82
Response.Write(Server.HtmlEncode(cerez.Values["SonErisim
"]));
Response.Write("<br>");
Response.Write("<br>");
Label3.Text = Server.HtmlEncode(cerez2.Value);
HttpCookie aCookie;
for (int i = 0; i < Request.Cookies.Count; i++)
{
aCookie = Request.Cookies[i];
83
output.Append("Cookie name = " +
Server.HtmlEncode(aCookie.Name) + "<br />");
output.Append("Cookie value = " +
Server.HtmlEncode(aCookie.Value)
+ "<br /><br />");
}
Label1.Text = output.ToString();
AddFileDependencies : Bir yanıt bir yada daha fazla dosyanın mevcut ve hazır olup olmamasına
bağlı olabilir. Dosya mevcut değilse Response nesnesi bir hataya yol açar. AddFileDependency
metodunu kullanarak dosyaları bağımlılık listesine bir bir ekleyebilirsiniz. Bu metot ise bir
kerede birkaç dosyayı aynı anda eklememize olanak tanır. Bunun için dosya adlarını içeren bir
ArrayList’i metoda aktarmalısınız. Kullanımı aşağıdaki gibidir.
AppendHeader : Bu metot , yanıta bir http başlığı ekler. Yeni başlıkları herhangi bir içerik
yazmadan önce eklemelisiniz. Aksi halde hata oluşur. Response.Cookies metodu ile çerez
yazılabildiği gibi bu metotla da çerez yazılabilir.Kullanım şekli aşağıdaki gibidir:
Response.AppendHeader("Cerez oluştur","cerez=deger");
BinaryWrite : Bu metot ile tarayıcıya ham byte verileri yazmak için kullanırız. Buna örnek
olarak c sürücüsünde deneme.txt adlı bir metin dosyası açın ve içine bir yazı yazın ve aşağıdaki
kodları sayfanızın Load yordamına ekleyin
using System.IO;
...
84
protected void Page_Load(object sender, EventArgs e)
{
FileStream MyFileStream;
long FileSize;
string path=@"C:\de.txt";
MyFileStream = new FileStream(path, FileMode.Open,
FileAccess.Read);
FileSize = MyFileStream.Length;
Close : Bu metot, soket bağlantısını kapatır. Ama yanıtı sonlandırmaz. Örneğin veritabanı
bağlantılarını kapatmak için Close() metodu kullanılır.
WriteFile : Bir dosyanın içeriğini istemciye yazar. BinaryWrite örneğindeki yaptığımız işi
aşağıdaki kodlarla da yapabiliriz.
FileStream MyFileStream;
long FileSize;
string path=@"C:\de.txt";
MyFileStream = new FileStream(path, FileMode.Open,
FileAccess.Read);
FileSize = MyFileStream.Length;
MyFileStream.Close();
85
Response.Write("<pre>");
Response.WriteFile(path);
Response.Write("</pre>");
MyFileStream.Close();
Metotlar
Metot Tarifi
86
Clear Sunucunun tampon hafızasını temizler.
End Sunucucudaki işlemi durdurup o zamana kadar ki değerleri
döndürür.
Flush Sunucuda o zamana kadar tamponlanmış verilen browser’a
gönderir.
Redirect (URL) Başka bir URL’ye yönlendirme yapar.
Write (data_to_write) Sayfaya yazdırma işlemini gerçekleştirir.
<HTML>
<HEAD>
<title>WebForm1</title>
87
<meta name="GENERATOR" Content="Microsoft Visual Studio .NET
7.1">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
<metaname="vs_targetSchema"
content="http://schemas.microsoft.com/intellisense/ie5">
<script runat="server">
private void Page_Load(object sender, System.EventArgs e)
{
string isim="Zülfü ALANOĞLU";
Response.Write("isim <br>");
Response.Write(isim);
}
</script>
</HEAD>
<body>
<form id="Form1" method="post" runat="server">
</form>
</body>
</HTML>
88
REQUEST NESNESİ
Kullanıcının sunucudan talep ettiği her sayfaya istek (request) denir. Request nesnesi
kullanıcıdan bilgi sağlamaya yönelik bir nesnedir.
HttpRequest Nesnesi
Basit bir html sayfalarına giren talepleri karşılamak için, bu karakter katarları içindeki
değerleri nadiren bilmeniz gereklidir. Fakat bir Web uygulaması içindeki sayfalara gelen
talepleri karşılamak için değerlerin en azından bazılarını, hemen hemen her zaman bilmeniz
gerekir. ASP.NET motoru, tarayıcının gönderdiği değerlerle etkileşimi basitleştirmek için söz
konusu değerleri çözümler ve onları bir HttpRequest nesnesinin özellikleri olarak saklar.
Bir Web formda bu HttpRequest nesnesini Page nesnesi bir özelliği olarak erişirsiniz.
Page nesnesini Web Formunun kendisi olarak düşünebiliriz. Page nesnesinin özellikleri,
nesnelerin adlarını kpolaylaştırır. Örneğin istemci blgilerine ulaşmanız gereken her seferinde
HttpContext.Current.HttpRequest yazmak yerine, yalnızca Request yazabilirsiniz.
Request.Querystring
Çok kullanılan bir ifadedir. Aynı sayfaya veya başka sayfalara değişken veya
değişkenlerin taşınmasını sağlar. <A href> tagıyla veya Response.Redirect ile yönlendirdiğimiz
sayfalara istediğimiz değişkenlerin değerini taşır. Bu ifadeler ile yönlendirdiğimiz sayfanın
adresini yazdıktan sonra “?“ işareti ardından sayfaya taşıyacağımız değişkenin adını ve değerini
belirtiriz. Aşağıdaki örneğimizle konuyu açıklamaya çalışalım; önce “qucrystring.asp” isimli bir
sayfa oluşturalım ve şu kodları yazalım:
<%@ Page Language="C#" %>
<html >
<head runat="server"></head>
<body>
<a href="yonlendirilen.aspx?
kitapkategorisi=turkroman&ismi=beyazkale">
link kodu içindeki soru işaretinden sonraki değişkenler link
adresinde belirtilen sayfaya taşınacak.</a>
</body>
</html>
89
Sonra link ile yönlendirileceğimiz “yonlendirilen.aspx” isimli sayfayı oluşturulalım.
<html>
<head runat="server">
</head>
<body>
<br /> <br />
<% string kategori = Request.QueryString
["kitapkategorisi"];
string kitapismi=Request.QueryString["ismi"];%>
<b><%Response.Write(kitapismi);%></b>
</body>
</html>
90
İlk sayfamızda bir link ile, istediğimiz sayfa adresi ve bu sayfaya taşıyacağımız değerleri soru
işaretinden sonraki değişken adları ve değerleri ile bildirdik. Bu linke tıkladığımızda, linkte
belirtilen adrese gidilmekle kalmıyor, aynı zamanda bu adresteki değişkenlere bir önceki
sayfada belirttiğimiz değerler giriliyor. Sonuçta bir önceki sayfa bu sayfanın durumunu
belirliyor.
Örnek kullanımlar;
Response.Redirect("default2.aspx?isim=" + TextBox1.Text + "&soyisim=" + TextBox2.Text +
"&id=" + TextBox3.Text);
//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]);
91
}
QueryString'de 'Key' değerleri farklı olmak zorunda değildir. 'Key' değerlerinin aynı
olacağı durumlarda şuna dikkat edilmelidir:
//default.aspx.cs
//default2.aspx.cs
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
92
Response.Redirect yerine Server.Transfer metodunu kullanmak
//default.aspx.cs
//default2.aspx.cs
93
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 '#', '+', '&' gibi bazı semboller eklenirken hatalar olmaktadır. Bu hataları
önlemek için Server.UrlEncode metodu kullanılmalıdır.
<html >
<head id="Head1" runat="server">
<title></title>
</head>
<body>
HTML formları kullnılarak Request.QuerySting yöntemi
94
<form action="yonlendirilen.aspx" method="get">Lütfen isminizi
giriniz:
<input type="text" name="isim"><br><br>
<input type="submit" value="Gönder">
</form>
</body>
</html>
<html>
</body>
</html>
95
ASP.Net kontrolleri kullanıldığında başka bir sayfaya yönlendirme genellikle yapılmaz. Aynı
sayfa içerisinde girilen veriler değerlendirilir. Gönderme yapılacağı zaman yine a href tagında
olduğu gibi ? işareti ile değerler gönderilir.
<html >
<head id="Head1" runat="server">
<title></title>
<script runat="server">
Response.Redirect("yonlendirilen.aspx?isim=" +
TextBox1.Text);
</script>
</head>
<body>
ASP.Net formları kullnılarak Request.QuerySting yöntemi
<form id="Form1" method="get" runat="server"> Lütfen isminizi
giriniz:
96
<asp:TextBox ID="TextBox1"
runat="server"></asp:TextBox><br><br>
<asp:Button ID="Button1" runat="server" Text="Gönder"
OnClick="Button1_Click" />
</form>
</body>
</html>
<html >
</head>
<body>
</body>
</html>
97
Aynı sayfada ASP.Net formlarının çağrılması
<%@ Page Language="C#" %>
<html >
<head id="Head1" runat="server">
<title></title>
<script runat="server">
</script>
</head>
<body>
ASP.Net formları kullnılarak Request.QuerySting yöntemi
<form id="Form1" method="get" runat="server"> Lütfen isminizi
giriniz:
<asp:TextBox ID="TextBox1"
runat="server"></asp:TextBox><br><br>
<asp:Button ID="Button1" runat="server" Text="Gönder"
OnClick="Button1_Click" />
</form>
98
</body>
</html>
Request.Form Özelliği(NameValueColleciton)
Yukarıda verilen örnek Request.Form özelliği kullanarak yapıldığında form metodu “get”
yerine “post” olarak seçilir.
99
default.aspx
<html>
<head id="Head1" runat="server">
<title></title>
</head>
<body>
HTML formları kullnılarak Request.Form yöntemi
<form action="yonlendirilen.aspx" method="post">Lütfen
isminizi giriniz:
<input type="text" name="isim"><br><br>
<input type="submit" value="Gönder">
</form>
</body>
</html>
yonlendirilen.aspx
</head>
<body>
</body>
</html>
<html>
<head> <title></title>
</head>
<body>
100
<form id="Form1" method="post" runat="server">
<asp:Label id="Label1" style="Z-INDEX: 101; LEFT: 76px;
POSITION: absolute; TOP: 166px" runat="server" Width="104px"
Height="24px">Ad-Soyad</asp:Label>
<asp:Label id="Label2" style="Z-INDEX: 102; LEFT: 72px;
POSITION: absolute; TOP: 201px" runat="server" Width="120px"
Height="23px">Şehir</asp:Label>
<asp:Label ID="Label3" runat="server" Height="23px" Style="z-
index: 107; left: 72px;position: absolute; top: 246px"
Width="120px">Öğrenci</asp:Label>
</form>
</body>
</html>
Default.aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Drawing;
101
using System.IO;
102
Request.AcceptTypes özelliği (String dizisi)
<%Response.Write("AccepTypes Örneği");
String[] dizi = Request.AcceptTypes;
for (int i = 0; i <= dizi.GetUpperBound(0); i++)
{
Response.Write(dizi[i] + "<br>");
}
%>
Yukarıdaki döngünün sonucunu, istemci olarak IE5 ve yukarısını kullanarak izlediğinizde çıktı
daima */* olur.
Dizinin en büyük indeksli elemanının indeks bilgisini GetUpperBound(0) metoduyla alırız.
AccepTypes Örneği */*
103
Accep Types listesinin tamamı;
<%
%>
Çıktı
Accept Type 0: image/gif
Accept Type 1: image/x-xbitmap
Accept Type 2: image/jpeg
Accept Type 3: image/pjpeg
Accept Type 4: application/x-shockwave-flash
Accept Type 5: application/vnd.ms-excel
Accept Type 6: application/vnd.ms-powerpoint
Accept Type 7: application/msword
Accept Type 8: */*
Request.Cookies Özelliği(HttpCookiesCollection)
Bu özellikte illaki sizin uygulamanızın içinde olması gerekmez. Bazı sayfalar tarafından
ayarlanan metin değerlerini tutan değer çiftlerinin bir koleksiyonudur. Varsayılan durumda
koleksiyon boştur. Tek bir çerezi adı ya da index numarası ile almak için Get metodunu
kullanabilirsiniz.
Response.Write(Request.Cookies["kullaniciadi"]);
104
Response.Cookies özelliğinde buna ait geniş bir örnek daha önce incelenmişti.
Mevcut olmayan bir çereze erişme girişiminde bulunursanız bir hataya yol açarsınız. Bu
problemi önlemek için çerezin olup olmadığını kontrol edebilirsiniz. Ne yazık ki, Exists ya da
KeyExists gibi bir özellik mevcut değildir. Bu yüzden tüm anahtarları almalı ve bunları
döngüsel olarak kontrol etmelisiniz. Neyse ki bu kolaydır. Bunu aşağıdaki gibi yapabilirsiniz.
Bir çerez tek bir değer çiftini ya da çiftlerin bir koleksiyonlarını içerir. Yani bir çerez bir
değer çiftidir; öyle ki, söz konusu değer diğer değer çiftlerinin bir koleksiyonunu içerebilir. Alt
anahtar ve değerleri Values özelliğini kullanarak elde edebiliriz. Fakat çerez alt anahtarlara
sahip değilse hata verir. Bunu önlemek için HasKeys özelliğini kullanarak çerezin alt
anahtarlarının olup olmadığını sınayabiliriz. Aşağıda bir çerez ve alt anahtarlarının oluşturma
örneği verilmiştir.
void cerezolustur()
105
{
HttpCookie cerez = new HttpCookie("Items",
"Test");
int i;
for (i = 1; i < 10; i++)
{
cerez.Values.Add(i.ToString(), "Items");
}
Response.AppendCookie(cerez);
}
Kodun ilk kısmı çerezi oluşturmaktadır. Çerezi göndermek için en son satırdaki
AppendCookie metodu kullanılarak çerez HttpResponse.Cookies koleksiyonuna eklenir. İstemci
bir sonraki kez sitenizden bir sayfa talep ettiğinde çerezleri talep ile birlikte gönderecektir.
Çerezi geri alabilir, Values ve AllKeys özelliklerini kullanarak anahtarların bir listesini elde
edebilirsiniz. ShowCookie metodu Request.Cookies koleksiyonundan bir çerezi geri alır ve alt
anahtar değerlerini basar. Çerezlerin içeriğini görüntülemek için aşağıdaki örneği inceleyiniz.
void showCookie()
{
HttpCookie cerez1;
int i;
String[] keys;
HttpCookieCollection cerezler = Request.Cookies;
cerez1 = cerezler.Get("Items");
if (cerez1.HasKeys)
{
Response.Write(cerez1.Values.AllKeys.Length.ToString() +
"<br>");
keys = cerez1.Values.AllKeys;
for (i = 0; i < keys.Length; i++)
Response.Write(keys[i] + "=" +
cerez1.Values[i] + "<br>");
}
else
{
Request.Cookies["renk"].Value.ToString();
Response.Write("bu çerez yok");
}
Response.Write(cerez1.Value);
}
Cookie’mizin değerini tekrar elde etmek isteyebilirsiniz. Aşağıdaki ifade ile renk isimli
Cookie’mizin değeri elde edilir ve istenilen bir yerde kullanılabilir.
Response.Write(Request.Cookies["okul"].Value.ToString());
106
Örnek:
Default.aspx
<HTML>
<HEAD>
<title>WebForm1</title>
<script runat="server">
private void Page_Load(object sender,
System.EventArgs e)
{
Response.Cookies["okul"].Value="Firat";
}
private void sayfayagit(object sender,
System.EventArgs e)
{
Response.Redirect("yonlendirilen.aspx");
}
</script>
</HEAD>
<body>
<form id="Form1" method="post" runat="server">
<asp:Button id="Button1" style="Z-INDEX: 101; LEFT: 27px;
POSITION: absolute; TOP: 20px" runat="server"
OnClick="sayfayagit" Text="Çerez Gönder"
Width="105px"></asp:Button>
</form>
</body>
</HTML>
107
yonlendirilen.aspx
<script runat="server">
private void Page_Load(object sender, System.EventArgs e)
{
bool x= keyExists("okul");
bool y = keyExists2("renkler");
if (x == true)
Response.Write(Request.Cookies["okul"].Value.ToString());
else Response.Write("Çerez yok");
if (y == true)
Response.Write(Request.Cookies["renkler"].Value.ToString());
else Response.Write("Çerez yok");
showCookie();
}
// Çerez kontrol
bool keyExists(String aKey)
{
HttpCookieCollection cerez2 = Request.Cookies;
System.Collections.IEnumerator e =
cerez2.GetEnumerator();
while (e.MoveNext())
108
{
if (e.Current.Equals(aKey))
return (true);
}
return (false);
}
</script>
<title>cerezoku</title>
</head>
<body>
</body>
</html>
Request.Files Özelliği(HttpFileCollection)
Request nesnesi bir files özelliğini ortaya çıkarır. Files, istemci tarafından gönderilen
dosya adlarından oluşan bir koleksiyon gönderir. Dosya upload olaylarında kullanılan bir
özelliktir. Dosya upload edildikten sonra dosyanın boyutu içeriği hakıkında bilgi alınabilir.
109
string [] a ;
HttpFileCollection File;
Tarayıcı her taleple birlikte bir başlık koleksiyonunu da gönderir. Normalde, değerler doğrudan
okumamıza gerek olamayacak olsa bile, bunu yapabiliriz.
ASP.NET’in dahili olarak yaptığı işte budur. Fakat siz bunu yapmak zorunda değilsiniz.
ASP.NET bir çok Request.Headers koleksiyon değerlerini başka şekillerde de ortaya çıkarır.
Örneğin bir formu göndermek için kullanılan metodu Request.ContentType özelliği ile, istemci
tipini Request.UserAgent özelliği ile, form verilerinin büyüklüğünü de Request.TotalByte
özelliği ile belirleye bilirsiniz.
header.aspx
110
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="header.aspx.cs" Inherits="header" %>
</div>
</form>
</body>
</html>
header.aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections.Specialized;
coll = Request.Headers;
111
}
}
}
}
112
Bu değerlerden bazılarına sıklıkla gerek duyarız. Sıklıkla kullanılanlardan bazıları
aşağıda verilmiştir.
<b>Kullandığın Tarayıcı:</b>
<%Response.Write
(Request.ServerVariables["Http_user_agent"]);%>
<p> <b> IP Adresin:</b>
<%Response.Write(Request.ServerVariables ["remote_addr"]);
%>
</p>
<p> <b> DNS :</b>
<%Response.Write (Request.ServerVariables["remote_host"]);
%> </p>
<p><b>Sayfayı çağırmak için kullandığın metot:</b>
<%Response.Write (Request.ServerVariables
["request_method"]);%> </p>
<p> <b>Sunucunun Domain İsmi: </b>
<%Response.Write(Request.ServerVariables["server_name"]);
%>
</p>
<p> <b>Sunucunun Port Numarası:</b>
113
<%Response.Write(Request.ServerVariables["server_port"]);
%>
</p>
<p>
<b>Sunucunun Kullandığı Yazılım:</b>
<%Response.Write
(Request.ServerVariables["server_software"]);%>
</p>
</div>
</form></body></html>
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections.Specialized;
114
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
int loop1, loop2;
NameValueCollection coll;
coll = Request.ServerVariables;
}
}
115
Request.UserLanguages Özelliği (ShortedStringArray)
Bu özellik kullanıcının dil tercihlerini listeleyen bir string dizisi içerir. Dil tercih için
kullanılan karakter katarları Locale ID (LCID) sabitleridir.
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="Default.aspx.cs" Inherits="_Default" %>
<b>Kullanılan Dil:</b>
<%int count;
String[] userLang = Request.UserLanguages;
116
for (count = 0; count < userLang.Length; count++)
{
Response.Write(userLang[count] + "<br>");
} %>
</div>
</form>
</body>
</html>
</head>
<body>
<form id="form1" runat="server">
</form>
</body>
</html>
117
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections.Specialized;
}
}
lblValues.Text = paramInfo;
}
}
118
Diğer Request Nesnesi Özelikleri
<script runat="server">
119
Label2.Text = Image1.ImageUrl;
Label3.Text = Request.AppRelativeCurrentExecutionFilePath;
if (VirtualPathUtility.GetDirectory(
Request.AppRelativeCurrentExecutionFilePath).Equals("~/Members/"))
{
Image2.ImageUrl = Request.ApplicationPath +
"/memberimages/Image1.gif";
}
else
{
Image2.ImageUrl = Request.ApplicationPath +
"/guestimages/Image1.gif";
}
Label4.Text = Image2.ImageUrl;
}
</script>
<html >
<head runat="server">
<title>HttpRequest.ApplicationPath Example</title>
</head>
<body>
<form id="form1" runat="server">
<div>
This is the ApplicationPath from the current page:<br />
<asp:Label ID="Label1" runat="server" ForeColor="Brown" /><br />
Use it to link to resources at fixed locations in the application.<br />
<asp:Image ID="Image1" runat="server" />
<asp:Label ID="Label2" runat="server" ForeColor="Brown" />
<br /><br />
This is the AppRelativeCurrentExecutionFilePath to the current page:<br />
<asp:Label ID="Label3" runat="server" ForeColor="Brown" /><br />
Use it to help programatically construct links to resources based on the location of the
current page.<br />
120
<asp:Image ID="Image2" runat="server" />
<asp:Label ID="Label4" runat="server" ForeColor="Brown" />
</div>
</form>
</body>
</html>
121
Response.Write("Supports Frames = " + bc.Frames +
"<br>");
Response.Write("Supports Tables = " + bc.Tables +
"<br>");
Response.Write("Supports Cookies = " + bc.Cookies +
"<br>");
Response.Write("Supports VB Script = " + bc.VBScript +
"<br>");
Response.Write("Supports JavaScript = " + bc.JavaScript
+ "<br>");
Response.Write("Supports Java Applets = " +
bc.JavaApplets + "<br>");
Response.Write("Supports ActiveX Controls = " +
bc.ActiveXControls + "<br>");
Response.Write("CDF = " + bc.CDF + "<br>");
}
122
ContentType : Tarayıcı tarafından sağlanan veriler için MIME tipinde bir karakter katarı içirir.
FilePath : Mevcut talebin tam sanal dizin yolunu içeren bir string değeri döndürür.
123
UrlReferrer : Tarayıcının mevcut talepte bulunmadan önce en son talep ettiği URL’yi içerir.
BinaryRead : Yüklenmiş bir dosya yada diğer ikili akışlar benzeri ikili içerik aldığınız zaman,
bunu okumak için bu metot kullanılır. Bir Byte dizisi döndürür.
Request.MapImageCoordinates("ImageButton1");
SaveAs : SaveAs metodu, bir HttpRequest’in içeririğini bir disk dosyasına kaydetmemize olanak
tanır. Örneğin, Request.Save(“C.\\request.text”,true);
124
yakalar.
ServerVariables(server_variable) Sunucu değişken değerlerini alır.
Özellikler
Özellik Açıklama
TotalBytes Bağlantıda gönderilen toplam byte miktarını
gösterir.
Metot
Metot Açıklama
BinaryRead
SESSION(Oturum) NESNESİ
ASP.Net için ziyaretçi sunucuya bağlandığı an, bir oturum (session) başlanmıştır. Bu durumda
sunucu session nesnesi yaratarak, ziyaretçiyi oturumdan çıkana kadar izler.
Burada kullanılan Session sözcüğü ise System.Web.Session.HttpSessionstate nesnesinin
eş anlamlısıdır. Bir tarayıcı oturumu ve HttpSessionState aynı şey değildirler, ama ilintilidirler.
Her tarayıcı örneği web sitenizde bir sayfaya ilk kez eriştiğinde bir ASPSessionID çerezi
almaktadır. Bundan sonraki her talepte sunucu bu ASPSessionID değerini kullanır. Bir
ASP.NET uygulamasında session nesnesini o tarayıcı örneğine özgü verileri saklamak için
kullanabilirsiniz. Tarayıcı ile sunucu arasında ASPSessionID üzerinden kurulan ilişki, tarayıcı
Session’nun oturumunu kapatana kadar devam etmektedir. Session zaman aşımına uğradıktan
sonra, eğer kullanıcı sizin uygulamanıza yeniden dönerse, ASP.NET yeni bir Session
oluşturacak ve yeni bir ASPSessionID verecektir.
Durum bilgisini tutmanın birden fazla yolu vardır. Daha önce gördüğümüz durum
bilgisini çerezlerde tutma işi her zaman en iyi seçenek değildir. Durum bilgisini tutmanın ikinci
bir yolu, bu iş için veri tabanı ya da dosya kullanarak verilerin kalıcılığını sağlamaktır. Diğer bir
yol ise durum bilgisini bellekte saklamaktır. Burada da kullanıcı ile veri arasında çerez ile
bağlantı kurarsınız. ASP.NET uygulamaları bu işi şeffaf bir şekilde ASPSessionID çerezi ile
session nesnesini kullanarak yapmamızı sağlar.
Her değişken tanımlaması en fazla o sayfa genelinde etkin olur. Bütün sayfalarda geçerli
olabilecek değişkenleri, session nesnesi ile tanımlayabiliriz.
125
Session Değişkenleri
Spesifik bir tarayıcı ile ilgili olarak veri kaydetmeniz, okumanız, değiştirmeniz ya da
silmeniz gerektiğinde Session nesnesini kullanın.
Session nesnesinde nesne depolamanın en kolay yolu, tıpkı Application nesnesine nesne
kaydetmekteki gibidir. Yeni bir String anahtar değeri oluşturarak ve Session[newkey]’i o
nesneye eşitleyerek. Aşağıdaki örnek kod bir Session[“sayac”] oluşturmakta ve ardından,
sayfanın her yenilenmesini bu değişkenin değerini bir arttırmaktadır.
Response.Write("Sayaç="+Session["sayac"].ToString()
+"<br>");
}
Kod, sayfa ilk talep edildiğinde “sayac” değişkeninin mevcut olup olmadığını kontrol eder.
Yok ise, değişkeni onu 1’e eşitlemek sureti ile oluşturur. Mevcutsa, değeri okumakta ve ona 1
eklemektedir. Son olarak değeri tarayıcıya yazmaktadır.
Session değişkenlerini oluşturmanın ikinci bir yolu daha vardır. Session nesnesi,
nesneler içeren ve hash edilmiş bir ad-değer koleksiyonu için bir sarmalıyıcıdır. Dolayısıyla
çoğu koleksiyonda olduğu gibi, koleksiyona nesne eklemek için onun Add metodunu
kullanabilirsiniz. Bunun söz dizimi aşağıdaki gibidir.
126
Session.Add(isim,değer);
Örnek:
<script runat="server">
%>
</form>
</body>
</html>
127
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="session.aspx.cs" Inherits="session" %>
128
Timeout Özelliği
Bir oturum nesnesi oluşturulduğunda, eğer ziyaretçi belirli bir süre zarfında
browser’ında hiçbir hareket veya yenileme yapmamışsa, sunucu oturum nesnesini otomatik
olarak kapar (varsayılan değeri 20 dakikadır.).
Session.Timeout = dakika değeri;
Session.Timeout özelliğinin bulunduğu sayfada dakika değeri
kadar işlem yapılmadan beklenirse session değişken içerikleri
silinecektir.
Contents Özelliği
Session nesnesinin içeriğinin elde edilmesi için kullanılan bir özelliktir.
<%
for(int i=0; i<Session.Contents.Count;i++)
Response.Write(""+Session.Contents[i]+"<br>");
%>
Session değişkenini birden fazla şekilde oluşturabildiğimiz gibi bunları yok etmek
içinde çeşitli yollar vardır.
Örnek:
<%@ Page Language="C#" %>
129
</body>
</html>
<html >
<head > <title>Untitled Page</title> </head>
<body>
<% Session.Timeout=1;
string ad = Request.Form["ad"];
int yas = Int16.Parse(Request.Form["yas"]));
Session["ad"]=ad;
Session.Add("yas",yas);
Session["yetiskin_kitap"]="yetişkin kitapları";
Session["cocuk_kitap1ari"]="çocuk kitapları";
if ((int)(Session["yas"])<= 18)
Session.Contents.Remove("yetiskin_kitap");
else
Session.Contents.Remove ("cocuk_kitapları");
int j=Session.Contents.Count;
for( int i=0;i<j;i++)
Response.Write(Session.Contents[i]+ "<br>");
%>
</body>
</html>
Örnek:
130
default.aspx kodları ve Form’ un ekran görüntüsü;
131
Bu örneği çalıştırdığımızda, default.aspx sayfasında Ekle butonuna basarsak
Session nesnemize Deneme bilgisi eklenecektir. Eğer WebForm2.aspx
sayfasına geçersek, Session bilgisinin Label kontrolüne yazıldığını görürüz.
//default.aspx
private void btnEkle_Click(object sender, System.EventArgs e)
{
Session["Kimlik"]=txtBilgi.Text; //Session’ a değer atıyoruz.
}
//sayfa2.aspx
private void Page_Load(object sender, System.EventArgs e)
{
lblAdSoyad.Text=Session["Kimlik"].ToString(); //Session değerini
okuyoruz.
}
//sayfa3.aspx
private void Page_Load(object sender, System.EventArgs e)
{
lblAdSoyad.Text=Session["Kimlik"].ToString(); //Session değerini
okuyoruz.
}
132
Cookie’siz Session Kullanımı
133
Bunun için geliştiriciler olarak kaynak kodlarımızda herhangi bir değişiklik yapmaya
gerek yoktur. Yapmamız gereken web.config dosyasınıda cookle kullanılmayacağını
belirtmektir.
Web.config dosyasını Türkçe karakter kullanımı bölümünde kullanmıştık.
Hatırlayacağınız gibi web .config dosyası, sitemizle (uygulamamızla) ilgili temel
konfigürasyonları tutan dosya idi. Bu dosya, genel olarak, sitemizin veya web sunucusunun kök
dizininde bulunuyordu.
İşte bu dosyada, aşağıdaki bildirimi yaparak, session oluşumunda, cookie
kullanmayacağımızı belirtebiliriz;
web.config
1 <?xml version="l.0" encoding="iso-8859-9" ?>
2 <configuration>
3 <system.web>
4 <sessionstate cookieless="true" timeout="10" />
5 <globalization reguestEncoding="iso-8859-9" resçonseEncoding="iso-8859-9"
6 fileEncoding="iso-8859-9" culture="tr-TR" uiCulture="tr" />
7 </system.web>
8 </configuration>
4. satırda session’a ait bir takım değerleri tanımlıyoruz. Bunlardan bir tanesi cookie’siz
kullanımı oluşturan
Cookieless=”true”
134
Eğer uygulamamızı bu haliyle denersek sayfalar arasında gezinirken url bilgilerinin
aşağıdaki gibi değiştiğini görürüz. Görüldüğü gibi ASP.NET_SessionId değeri otomatik olarak
relative url bilgisinin önüne eklenmiştir.
ASP.NET’in durum bilgisini nasıl takip ettiğini öğrendik. Sessionları detayı incelemek
için bilmemiz gereken birkaç konu başlığı daha vardır.
Verileri bir tarayıcı ile ilişkilendirmek her zaman verileri bir bireyle ilişkilendirmekle
aynı şey değildir. Sunucu açısından bakıldığında, IP adresleri aynı olsa bile, her tarayıcı ayrı bir
Sessiondur. Çünkü sunucu IP adresine bakmaz ve bu konuda hiçbir şey bilmez. Aynı şey
olmamasının sebebi, aynı makinede alışan tarayıcı örneklerinin kalıcı çerezleri paylaşmalarıdır.
135
ASP.NET Oturum Durumunun Güvenliği
Froms kimlik denetimi : Bu tipte, standart kullanıcı adı – şifre iletişim kutusunda tarayıcının
içerisine entegre edilmiştir.
136
Bir web sunucusu kullanıcının tarayıcısını
kapatıp kapatmadığını anlayamaz. Onun yerine
Kullanıcının tarayıcı barındırdığı sayfalara yapılan çağrıları tespit
penceresini kapatması eder. Dolayısıyla bir kullanıcı açık bir oturuma
veya sayfaya yeni bir sahip iken tarayıcısını kapattığında veya yeni
tarayıcı penceresi açarak bir tarayıcı penceresi açtığında aynı sayfaya
ulaşması. yeni bir oturum içinde bağlanır. Bunun sebebi
sunucunun ürettiği ASP.NET_SessionId’ lerin
her bir istekte yeniden oluşturulmasıdır.
Oturum kapatılmaya Session nesnesine Abondon metodu
zorlandığında. uygulanarak oturumlar iptal edilebilir.
Bir sunucunun yeniden başlatılması eğer
SessionId değerleri işlem içinde (yani asp.net
work processor’ un açtığı iş parçalarında)
Sunucu yeniden tutuluyorsa otomatik olarak kaybedilecektir.
başlatıldığında. Ancak SessionId lerin bir Sql sunucusunda
database’ de veya StateServer isimli windows
servisinde tutulması sağlanarak bu kayıpların
önüne geçilebilir.
Session Nesnesine Toplu Bakış
Yazım Koleksiyonlar
Session.Koleksiyon Contents
Session.Özellik Static Objects
Session.Metot
Özellikler
Metot
CodePage
Abandon
LCID
Contents.Remove (Item or Index)
SessionID
Contents.RemoveAll ( )
Timeout
Olaylar
OnEnd
OnStart
Session nesnesini anlatırken, oluşturulan session yordamlarının ziyaretçi, sunucuya bağlı kaldığı
sürece bütün sayfalar için geçerli olduğunu söylemiştik. Ziyaretçi sayfayı kapadığında veya
137
belirlenen süre içinde bir eylem yapılmadığında session değişkenlerinin veya yordamlarının
sıfırlandığını da yukarıda belirttik. Bu nesne ile sağlanan tanımlamalar bütünü, oturum süresince
ziyaretçiye özel tanımlamalar ve değerlerdir. Her oturumda değişmeyen ve bütün ziyaretçiler
için geçerli evrensel tanımlara veya değerlere ihtiyaç duyabiliriz. ASP.Net için web ortamı bir
uygulama olduğuna göre, bu uygulamanın tamamında geçerli olan değişkenleri tanımlayabilme
imkânımızın olması son derece normal. Application, bütün kullanıcılar için geçerli değişkenleri
oluşturan, tanımlayan bir nesnedir.
Application["Değişken_ismi"]="Değişken_değeri";
Örnek:
138
istiyorsunuz. Katılımcıların kaç kişi olduğunu da sayfanızda göstermek istiyorsunuz. Her yeni
katılımcıda, oyuncu adedini gösteren sayacın bir artması, herhangi bir katılımcı oyundan
çıktığında da bir azalması gerekmektedir. Böyle bir uygulama için application nesnesi
(değişkeni) kullanmalıyız. Çünkü bu değişken bütün site için geçerlidir.
“Oyun_giris.aspx”
Application.Add("Oyun", 0);
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Session</title>
</head>
<body>
<%
Response.Write("<h3>oyun sayfamıza girmek ister misiniz?
</h3>");
Response.Write("Oyun sayfamızda su an " +
Application["Oyun"] + "oyuncu var.");
%>
<p><a href="session.aspx"> evet oyuna girmek istiyorum.</a></p>
</body>
</html>
Öncelikle yukarıdaki gibi bir oyuna giriş sayfası oluşturalım. Bu sayfada “application” nesnesi
ile “oyun” adında evrensel bir değişken tanımlıyoruz. Bu değişken bütün site ziyaretçileri için
geçerlidir. Şimdi oyuncu sayısını veren sayfamızı oluşturalım;
“Oyun.aspx”
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="Oyun.aspx.cs" Inherits="Oyun" %>
139
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
if ((int)Application["Oyun"] == 0)
Application["Oyun"] = 1;
else
{
int deger = (int)Application["ToplamZiyaretci"];
deger += 1;
Application["Oyun"] = deger;
Application.UnLock();
Response.Write ("Şu anda oyunda "+ Application["Oyun"]+"
kişi var");%>
<p><A href="oyun_cikis.aspx">Oyundan ayrıl</A></p>
</body>
</html>
Bu sayfada oyuna katıldığımız zaman application değişkeninin sayısı bir artıyor. Lock ve
Unlock metotları, uygulamayı lock’tan başlayıp unlock’a kadar kilitler. Bu sürede sadece bir
ziyaretçinin işlemi yapılır. Eş zamanlı ziyaretler için kullanılır.
140
linke tıkladığımızda;
Application.Lock();
if ((int)Application["Oyun"] <= 0)
Application["Oyun"] = 0;
else
{ int deger = (int)Application["Oyun"];
deger -= 1;
Application["Oyun"] = deger;
}
141
Application.UnLock();
</body>
</html>
Koleksiyonlar Olay
Contents OnEnd
StaticObjects OnStart
142
Global.asax Dosyası
Global.asa dosyası bir Active Server Application dosyasıdır. Bu dosya web uygulamasının
çalıştırılmasından itibaren, uygulamada geçerli olan bütün tanımlamaları ihtiva eder. Bu
dosyada scriptler, veritabanı bağlantıları session ve application nesneleri gibi sitenin tamamında
geçerli olacak yordamlar yazılabilir. Örnek olarak, sunucu herhangi bir sebepten dolayı reboot
edilirse “application” nesnesinin “OnStart” olayı ile neler yapması gerektiğini bu dosya
sayesinde tanımlayabiliriz. Diğer bir örnek olarak “session” nesnesinin “OnEnd” ve “OnStart”
olayları bu dosyada tanımlanarak oturum başladığmda veya bittiğinde değişkenlerin hangi
değerler alacağını belirtebiliriz.
Application_Start : Bu olay, herhangi bir kullanıcı uygulamanızda ki herhangi bir sayfa için ilk
kez talepte bulunduğunda ateşlenir. Uygulamalarınızı başlatmak için bu olayı kullanın. Örneğin,
veritabanının bağlantısını, fiziksel dizin yolunu keşfetme gibi işlemleri bu olayda
tanımlamalısınız.
Session_Start : Herhangi bir istemci uygulamanızda ki herhangi bir sayfayı ilk kez talepte
bulunduğunda ateşlenir. Dikkat ederseniz istemci sözcüğü kullanıcı anlamına gelmez. Tek bir
kullanıcı aynı anda açılan ve tüm uygulamanızdan sayfa talep eden birden fazla istemci
örneğine sahip olabilir. Herhangi bir istemciden gelen ilk talep Application_Start olayını ateşler,
her istemciden gelen ilk talep ise Session_Start olayını ateşler.
Session_End : Bu olay, belirli uzunluktaki bir sürenin bir istemci tarafından talepte bulunmadan
geçmesinden sonra ateşlenir. Varsayılan olarak 20 dakikadır. Fakat biz bu süreyi kendimiz
belirleyebiliriz.
143
Application_End : Bu olay, son aktif oturum zaman aşımına uğradığı anda ateşlenir. Sunucu,
Application kapsamında depolanan tüm nesneleri serbest bırakır ve uygulamayı kapatır.
Kullanıcı uygulama verilerini kaydetmek için ve artık gereksinim duymadığınız nesne ve
verileri serbest bırakmak için bu olayı kullanın.
Örnek:
Global.asax
<%@ Application Language="C#" %>
<script runat="server">
Application.Add("ToplamZiyaretci",0);
if ((int)Application["ToplamZiyaretci"] == 0)
Application["ToplamZiyaretci"] = 1;
else
{
int deger = (int)Application["ToplamZiyaretci"];
deger += 1;
Application["ToplamZiyaretci"] = deger;
144
}
</script>
Default.aspx
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="Default.aspx.cs" Inherits="_Default" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Session</title>
</head>
<body>
<%Session.Timeout = 1; %>
<form id="form1" runat="server">
<div>
Ziyaretçi Saysı :<asp:Label ID="lblZiyaretciSayisi"
runat="server" Text=""></asp:Label>
<br />
145
<br />
<strong> ASP.NET_SessionID :</strong>
<span style="color: #ff3300; " ><asp:Label
ID="lblSessionID" runat="server" Text="Label" Font-
Bold="True"></asp:Label></span>
<br />
<br />
<br />
<a href="Default.aspx">Default</a>
<a href="session.aspx">Sayfa2</a>
<a
href="oyun_cikis.aspx">Sayfa3</a><br />
</div>
</form>
</body>
</html>
Default.aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections.Specialized;
using System.IO;
lblZiyaretciSayisi.Text =
Application["ToplamZiyaretci"].ToString();
146
protected void btnEkle_Click(object sender, EventArgs e)
{
147
<a
href="Sayfa3.aspx">Sayfa3</a>
</div>
</form>
</body>
</html>
Sayfa2.aspx.cs
lblAdSoyad.Text = Session["Kimlik"].ToString();
//Session değerini okuyoruz.
Sayfa3.aspx
148
<asp:Label ID="lblAdSoyad" runat="server"
Text="Label"></asp:Label>
<br />
<br />
<a href="Default.aspx">Default</a>
<a href="session.aspx">Sayfa2</a>
<a
href="oyun_cikis.aspx">Sayfa3</a>
</div>
</form>
</body>
</html>
Sayfa3.aspx.cs
SERVER NESNESİ
HttpServerUtility NESNESİ
149
yönetebilir olmamıza rağmen kimi zaman bu nesnelerin yapamayacağı birkaç görevi
gerçekleştirmeniz gerekir. Bir ProgID veya ClassID ‘den kalıtımla COM nesneleri türetmek,
dizin yollarını eşlemek, programın çalışmasını bir başka bir dosyaya aktarmak, URL’de ya da
HTML dosyasında kullanmak üzere belirlenmiş stringler içerisindeki karakterleri kaçırmak ve
başka sayfalardaki kodu çalıştırmak bu bölümde göreceğiniz bölümler arasındadır. Page nesnesi
HttpServerUtility nesnesinin bir örneğini server kısa adı ile ortaya çıkarır. Bu yüzden genelde
kısa ad kullanılır.
Server Script Time Out
Normal bir sayfadaki scriptlerin belirli bir süre içinde çalışması beklenir. Bu süre aksi
belirtilmedikçe 90 sn’dir. 90 sn içinde tamamlanmazsa sunucu scriptin çalışmasını durdurur.
<% Server.ScriptTimeout = 150; %>
Bu örnekte çalışma süresini 150 sn ile kendimiz belirliyoruz.
CreateObject ve CreateObjectFromClsID Metotları (COM)
Klasik Asp’de, COM nesnelerini türetmek için Server nesnesine gerek duyardık.
ASP.NET’te ASP.NET nesneleri oluşturmak için ya da bir proje referansı içeren COM
nesnelerini oluşturmak için artık Server.CreateObject metoduna ihtiyaç kalmadı.
domDoc=DOMDocument30Class)Server.CreateObject("MSXML2.DOMDocumen
t.3.0");
Server.CreateObjectFromClsid("{f5078f32-c551-11d3-89b9-
0000f81fe221}");
150
Server.CreateObject(System.Type.GetTypeFromProgID("MSXML2.DOMDoc
ument.3.0"));
domDoc.loadXML("<?xml versiyon=\"1.0\"?
><root><item1>"+"Bu bir Test</item1></root>");
if (domDoc.parseError.reason!=null)
{
Response.Write(domDoc.parseError.reason);
Response.End();
}
Response.Write("<br />XML dosyası Yükleniyor.<br
/>");
N=domDoc.selectSingleNode("//item1");
if (!( N==null))
{
Response.Write(N.text);
}
else
{
Response.Write("Node alınamadı\"root/item1\".");
}
domDoc=null;
}
Not : Yukarıdaki kodu çalıştırmak için Microsoft XML v3.0 bileşen kütüphanesine bir proje
referansı eklemelisiniz.
//conn =
(ADODB.Connection)Server.CreateObject(Type.GetType"ADODB.Connect
ion, ADODB"));
//rs =
(ADODB.Recordset)Server.CreateObject("ADODB.Recordset, ADODB");
//conn =
(ADODB.Connection)Server.CreateObjectFromClsid("00000514-0000-
0010-8000-00AA006D2EA4" ) ;
151
//rs =
(ADODB.Recordset)Server.CreateObjectFromClsid("00000535-0000-
0010-8000-00AA006D2EA4" ) ;
//conn = new ADODB.Connection( );
//rs = new ADODB.RecordsetClass( );
conn.Open(strConn," "," ",0);
rs.Open("Region", conn,
ADODB.CursorTypeEnum.adOpenKeyset,ADODB.LockTypeEnum.adLockOptim
istic,(int)ADODB.CommandTypeEnum.adCmdTable);
StringBuilder strTable = new StringBuilder( );
strTable.Append("<table border=\"1\">\n");
strTable.Append("<tr>\n");
strTable.Append("<tdwidth=\"80\"align=\"center\">"+
rs.Fields[0].Name+"</td>");
strTable.Append("<tdwidth=\"200\"align=\"center\">"+rs.Fields[1]
.Name+"</td>\n");
strTable.Append("</tr>\n");
while(!rs.EOF)
{
strTable.Append("<tr>\n");
strTable.Append("<tdalign=\"center\">"+rs.Fields[0].Value.ToStri
ng()+"</td>\n");
strTable.Append("<tdalign=\"center\">"+
rs.Fields[1].Value.ToString()+"</td>\n");
strTable.Append("</tr>\n");
rs.MoveNext();
}
strTable.Append("</table>\n");
Label1.Text=strTable.ToString();
rs.Close();
conn.Close();
}
Execute Metodu
Server.Execute metodu, bir başka dosya içindeki kodu sanki söz konusu kod mevcut dosyanın
içindeymiş gibi çalıştırmaza olanak tanır. Dahil edilen dosyalardan faklı olarak Server.Execute
metodu bir fonksiyonu çağırmak ve bir sonucu okumak için kullanamazsınız. Onun yerine
Server.Execute metodunu bütün dosyaları çalıştırmak ve bir sonuç döndürmek için
kullanırsınız.
152
<title>Untitled Page</title>
</head>
<body>
Transfer Metodu
Server.Transfer metodu ise “Eski stil” bir tarayıcıyı bir başka konuma yönlendirme web
tekniğinin yerini alır.
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="Default2.aspx.cs" Inherits="Default2" AspCompat="true"
%>
153
</head>
<body>
<form id="form1" runat="server" method="post">
<div>
<p>Genel olarak
<% Server.Transfer("Default3.aspx");%>kitaplarını
okurum.</p>
</div>
</form>
</body>
</html>
<% Response.Write("Macera");%>
</body>
</html>
HtmlEncode Metodu
154
Kimi zaman, tarayıcıya HTML ve XML yazmamız gerekebilir. Ancak HTML ya da XML
kodunu yazmak için Response nesnesini kullanırsanız, tarayıcı onu HTML olarak yorumlar.
Problemi çözmek için metni tarayıcıya göndermeden önce Server.HtmlEncode metodunu
kullanarak düzgün olarak kaçırın. Aşagıdaki Web Formu iki adet label kontrolü içerir.
Page_Load olayında Web Formu her label’e html içeriği atar. Kod “Düz” kaçırılmamış HTML’i
ilk etikete atar fakat ikinci etikete içerik atamak için Server.HtmlEncode Metodunu kullanır.
<% Response.Write(Server.HtmlEncode("Server.HTMLEncode
Metodunu Kullanarak <b> tagı ekrana yazdırıldı."));%>
</body>
</html>
MapPath Metodu
Bir dosyanın tam konunu bulmak için Server.MapPath metodunu kullanırız. MapPath
metodu, bir sanal dizin yolu, bağıl dizin yolu yada bir null karakter katarı içeren bir String
parametresini alır ve tam olarak genişletilmiş fiziksel dizin yolunu döndürür. Eğer metot dizin
yolu bilgisini içermiyorsa metot, çalışmakta olan dosyanın dizin yolunu döndürür.
Server.MapPath(" ");
155
Server.MapPath metodu ile kısayol “nokta” notasyonu kullanabilirsiniz. Tek bir nokta
(.) mevcut dizini çift nokta (..) ise ebeveyn dizine göndermede bulunur.
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="Default2.aspx.cs" Inherits="Default2" AspCompat="true"
%>
k ScriptTimeou
Server.metot t
Metot
156
CreateObject
(type_of_object)
Execute (yol)
GetlastError()
HTMLEncode(string)
MapPath(yol)
Transfer(yol)
Dosya okuma için StreamReader yazma için ise StreamWriter nesnesi kullanılır.
Response.Write(tr.ReadToEnd());
tr.Close();
157
TextWriter tw = new
StreamWriter(Server.MapPath("veri.txt"));
tw.WriteLine(DateTime.Now);// Ornek olarak gunun tarihi
yazılacak
tw.WriteLine("Tarih değişti");
// stream kapat
tw.Close();
Var olan dosyaya ekleme yapmak için ise aşağıdaki komut satırı kullanılr.
158
ilk 10 karakterini ekrana yazar.
TextReader tr = new
StreamReader(Server.MapPath("veri.txt"));
tr.Close();
}
}
TextReader tr = new
StreamReader(Server.MapPath("veri.txt"));
Response.Write(f);*/
Response.Write(tr.ReadToEnd());
tr.Close();
159
kullanılmak üzere saklanabilir.
tw.WriteLine(Request.Form["TextBox1"]);
tw.Close();
}
protected void Button2_Click(object sender, EventArgs e)
{
TextReader tr = new
StreamReader(Server.MapPath("veri.txt"));
TextBox2.Text=tr.ReadToEnd();
tr.Close();
}
Dosyalar üzerinde okuma ve yazma işlemleri yapan sınıfları incelemeden önce dosya ve
klasörler üzerinde işlemler yapan Directory, File, Path, FileInfo, DirectoryInfo sınıflarını
inceleyeceğiz. Bu sınıfların I/O sistemi ile çok fazla ilgisi olmamasına rağmen genellikle I/O
160
işlemeleri sırasında bu işlemler sıkça kullanıldığı için ilk önce bu konuları ele alacağız.
FileInfo ve File sınıfları dosyaları, Directory ve DirectoryInfo sınıfları klasörleri temsil eder.
Path sınıfı ise dosya ve klasörlerin yol bilgileri ile ilgili işlemleri yapmak için kullanılır. File ve
Directory sınıfları sadece static metotlar içerir.
Directory Sınıfı
Directory.CreateDirectory
Belirtilen adreste bir klasör oluşturur. Aşağıdaki programı çalıştırırsak programın bulunduğu
klasörün içerirsinde “belgeler” adına yeni bir klasör oluşturacaktır.
protected void Page_Load(object sender, EventArgs e)
{
Directory.CreateDirectory(Server.MapPath("belgeler"));
Directory. Delete
Belirtilen yoldaki klasörleri silmek için kullanılır. İki kullanımı vardır.
Delete(string yol): yoldaki boş olan bir klasörü silmek için kullanılır.
Directory.Delete(Server.MapPath("belgeler"));
Delete(string yol,bool a), ikinci parametre(a) true ise yoldaki klasörü içindeki dosya ve
klasörlerle ile tamamen siler.
Directory.Delete(Server.MapPath("belgeler"),true);
Directory. Exists - bool
Belirtilen yolda klasör bulunuyorsa true aksi halde false döndürür.
Response.Write(Directory.Exists(Server.MapPath("belgeler")));
True
Directory.GetCreationTime - DateTime
161
Directory.GetCurrentDirectory()
Directory.GetDirectories- string[]
Belirtilen yoldaki bütün klasörlerin ismini bir string türünden bir dizi döndürür.
162
Directory.GetDirectoryRoot(string yol)
Klasörün bulunduğu kök dizin bilgisini ve volume bilgilerini string olarak verir.
14.02.2008 18:25:52
Belirtilen yoldaki dosyanın üzerinde en son ne zaman yazma işlemi yapıldığını DateTime
nesnesi olarak döndürür.
Response.Write(Directory.GetLastWriteTime(Server.MapPath("belgeler")))
;
14.02.2008 16:13:57
Directory. GetLogicalDrives()-string []
Bilgisayardaki bütün sürücülerin isimlerini bir string dizini aktarır.
protected void Page_Load(object sender, EventArgs e)
{
//Directory.CreateDirectory(Server.MapPath("belgeler1"));
// Directory.Delete(Server.MapPath("belgeler1"),true);
//
Response.Write(Directory.Exists(Server.MapPath("belgeler")));
//
Response.Write(Directory.GetCreationTime(Server.MapPath("belgeler")));
// Response.Write(Directory.GetCurrentDirectory());
string[] a;
a = Directory.GetLogicalDrives();
foreach (string k in a)
{
Response.Write(k);
}
163
}
Belirtilen yoldaki klasörün bir üst dizinin bilgilerini içeren DirectoryInfo nesnesi döndürür.
Response.Write(Directory.GetParent(Server.MapPath("belgeler")));
c:\inetpub\wwwroot\WebSite\WebSite\proje2
Belirtilen yoldaki klasörün en son erişilen zamanını Datetime nesnesi olarak verir.
Response.Write(Directory.GetLastAccessTime(@"C:\Inetpub\wwwroot\
WebSite\Proje"));
Directory.SetLastAccessTime(@"C:\Inetpub\wwwroot\WebSite\
Proje", new DateTime(2000, 5, 4));
Response.Write(Directory.GetLastAccessTime(@"C:\Inetpub\
wwwroot\WebSite\Proje"));
04.05.1985 00:00:00
04.05.2000 00:00:00
164
Directory. SetLastWriteTime(string yol,DateTime zaman)- DateTime
Belirtilen yoldaki klasörün en son yazılma zamanını DateTime nesnesi olarak verir.
Directory.SetCurrentDirectory(string yol)
Programın çalıştırıldığı klasörü yol ile belirtildiği gibi değiştirir.
File Sınıfı
File sınıfının bazı metotları, klasörler yerine dosyalar üzerinde işlem yapması hariç
Directory sınıfının metotları ile aynıdır. Bu metotlar Exist(), Delete(), GetCreationTime(),
GetLastAccessTime(), GetLastWriteTime(), GetLastWriteTime(), SetCreationTime(),
SetLastAccessTime() ve Move()’ dır. Ayrıca File sınıfı dosyalar üzerinde özelleşmiş işlemler
yapabilmek için aşağıdaki metotları bulundurur.
StreamWriter AppendText(string yol) : yol ile belirtilen dosya için StreamWriter nesnesi
döndürür.
protected void Page_Load(object sender, EventArgs e)
{
string path = @"C:\Inetpub\wwwroot\WebSite\proje\veri.txt";
if (!File.Exists(path))
{
165
using (StreamReader sr = File.OpenText(path))
{
string s = "";
while ((s = sr.ReadLine()) != null)
{
Response.Write(s+"<br>");
}
}
}
File.Copy(string kaynak, string hedef, bool üzerineyaz) : Eğer 3. parametre false ise birinci
metodun görevini yapar, true ise üzerine yazar.
string path = @"C:\Inetpub\wwwroot\WebSite\WebSite\proje2\veri.txt";
string path1=@"C:\Inetpub\wwwroot\WebSite\proje\belgeler\veri.txt";
File.Copy(path,path2 , true);
File.Create(path);
veri1.txt dosyası oluşturuldu.
166
StreamWriter CreateText(string yol)
Belirtilen yolda üzerine yazmak için text dosyası oluşturulur ve ilgili dosya ilişkin StreamWriter
nesnesi döndürür.
StreamWriter sw = File.CreateText(path));
(Örnek yukarıda)
167
FileStream Open(string yol, FileMode a) :
FileStream Open(string yol, FileMode b, FileAccess b) :
FileStream Open(string yol, FileMode a, FileAccess b, FileShare c) :
Open() metodu belirtilen yoldaki dosyayı açar ve ilgili dosyaya ilişkin FileStream nesnesi
döndürür. FileMode, FileAccess ve FileShare numaralandırmaları dosyanın ne şekilde
açılacağını ve dosya üzerinde ne şekilde işlem görüleceğini belirler.
File.Open(path,FileMode.Append,FileAccess.Write);
168
Truncate: Belirtilen açılır ve için tamamen silinir.
Belirtilen dosya yalnız okumak için açılır. Geriye FileStream nesnesi döndürür.
DirectoryInfo Sınıfı
DirectoryInfo sınıfı tek bir dizin ile ilgili bilgileri elde etmek için kullanılır.
169
Response.Write(k.Attributes + "<br>");
Response.Write("Uzantı : ");
Response.Write(k.Extension + "<br>");
}
Çıktı
170
DirectoryInfo sınıfının metotları static olmadığı için nesnelere metotlar üzerinden erişilir. Bu
metotlar;
void Create
Bu metot ile klasör oluşturur.
void Delete
Klasörün içi boş ise silinir.
void Delete(bool a)
Eğer parametre true ise her şey silinir.
DirectoryInfo[] GetDirectories()
İlgili klasörde bulunan bütün dizinleri DirectoryInfo dizisi halinde döndürür.
FileInfo[] GetFiles()
İlgili klasörde bulunan bütün klasörler FileInfo türden diye yerleştirilir ve bu dizi döndürülür.
171
FileSystemInfo[] GetFilesystemInfos()
İlgili klasördeki bütün dosyalar ve klasörler FileSystemInfo türünden bir diziye aktarılır ve bu
dizi döndürülür.
void Refresh()
İlgili klasörün özelliklerini dosya sisteminden tekrar yükler.
FileInfo Sınıfı
Tek bir dosya ile ilgili özellikleri içerir. FileInfo sınıfının özellikleri aşağıdaki
programda toplu olarak verilmiştir. Bunun için yeni bir text dosyası açıp dosyanın yolunu
kendimize göre değiştirip aşağıdaki programı yazmamız gerekiyor.
Response.Write(k.Attributes + "<br>");
Response.Write("Uzantı : ");
Response.Write(k.Extension + "<br>");
Response.Write("Boyut :");
172
Response.Write(k.Length + "<br>");
}
Çıktı
173
void Refresh()
İlgili dosya bilgileri dosya sisteminden tekrar alınarak FileInfo nesnesi yenilenir.
Path sınıfı
Path sınıfı string türden aldığı bir yol bilgisi üzerinde çeşitli işlemler yapan static üye
metotlara sahiptir. Aşağıdaki örnekte bu metotların kullanımı gösterilmiştir.
}
Çıktı
174
Path sınıfının en önemli metodu GetTempFileName metodudur. Bu metot sisteminizi
temp klasöründe oluşturduğu bir dosyanın ismini döndürür. Dosyalarla ilgili geçici işlem
yapmak istediğimizde bu metodu kullanabiliriz.
175
ADO.NET İLE VERİTABANI İŞLEMLERİ
ADO ADO.NET
ADO nesne modeli 6 temel yapıdan oluşur. ADO.NET modeli veriye erişim olarak iki ana
Bunlar: metot kullanır:
-Connection nesnesi
-Recordset nesnesi Online Erişim(Connected Access)
-Command nesnesi
-Error nesnesi Offline Erişim(Disconnected Access)
-Field nesnesi
-Parametre koleksiyonu
İki yeni nesne modeli sunar. Bunlar DataSet ve
ADO, Recordset nesnesi ile offline çalışma DataAdapter nesneleridir. Bu yapıların ikisi de
modeline sınırlı bir imkan sağlar. offline çalışma için gereklidir. DataSet tasarım
olarak offline çalışacak şekilde düzenlenmiştir.
Çok fazla kullanılmayan yapılar ADO.NET modeli ise daha yüksek performans
uygulamanın performansını düşürür. sağlar.
Doğrudan XML desteği verir. ADO.NET,
Doğrudan bir XML desteği yoktur. XML ile entegre çalıştığı için bir tablodaki
verileri XML formatına dönüştürmek çok
basittir.
176
ADO.NET’i oluşturan sınıfların çoğu bir DataSet oluşturmak ve bu DataSet üzerinde
işlemler yapmak içindir. DataSet, veritabanında bulunan bir veya daha fazla tablonun içinde
barındığı tablolar koleksiyonudur. DataSet içinde bulunan tablolar asıl veri kaynağından
tamamen bağımsız şekilde çalışır. Yani DataSet nesnesinin içini bir kere doldurduğunuzda
veritabanı bağlantısını kesensiz bile DataSet ile sanki bir veritabanına bağlıymışsınız gibi
DataSet üzerinden tablolar arasında ilişki kurabilir, yeni bir veri ekleyebilir, yeni sorgulamalar
yapabilir ve hatta kayıtları silip işiniz bittiğinde tekrar veritabanına bağlayabilirsiniz. İşte
DataSet nesnesinin bu özelliğine disconnected(offline) çalışma denmektedir. ADO.NET ile
online çalışma DataAdapter ve DataSet dediğimiz nesneler ile gerçekleştirilir.
ADO.NET te veri erişimi olarak iki tür destek sağlar; birincisi SQL Server ile yüksek
performanslı erişim, ikincisi ise OLEDB protokolünü destekleyen diğer veritabanlarına
bağlanmaktadır.
ADO.Net, .Net Framework sınıf kütüphanesinde 4 tane isim alanı (namespace) ile
temsil edilir ve hepsi de System.Data altında bulunur. ADO.NET’e ilişkin bütün sınıflar
System.Data.dll isimli tek bir assembly de toplanmıştır.Bizde uygulamalarımızda bu isim
alanları kullanacağız. Bu isim alanlar aşağıdaki gibidir.
OleDbConnection
OleDbCommand
OleDbDataReader sınıflarıdır.
177
System.Data.SqlClient isim alanı da 3 tane sınıf içerir. Bunlar:
SqlConnection
SqlCommand
SqlDataReader sınıflarıdır.
System.Data
ADO.NET’in en temel isim alanıdır. Veriyi sembolize eden veri türleri burada
bildirilmiştir. Mesela, tablo, sütun, satır, koşullar ve DataSet gibi veriyle doğrudan ilişkisi olan
türler bu isim alanındadır. Veri kaynağına bağlanmak için gerekli veri türleri bu isim alanında
değildir. Kısacası ADO.NET mimarisinin temel yapı taşlarını oluşturan sınıflar bu isim alanında
bulunur.
System.Data.Common
Bu isim alanı managed provider dediğimiz veri erişim kaynaklarını kullanan sistemlere
yönelik sınıfları içerir.
System.Data.OleDb
Buradaki sınıfların yapısı eski ADO’ya biraz yakınlığı ile bilinir. OLEDB protokolünü
destekleyen veritabanı sistemlerine erişmek için kullanılan sınıflar bu isim alanı içindedir.
System.Data.SqlClient
System.Data.SqlTypes
Bu isim alanında bulunan veri tipleri, MS SQL Server içinde desteklenen doğal veri
türlerini içerir. Tabi ki bu doğal veri tiplerinin CLR deki karşılıklarını da kullanabiliriz, fakat sql
veri tiplerini kullanmak SQL Server verilerine erişmede artı bir performans sağlamaktadır.
178
VERİTABANINA BAĞLANMAK
Bir veri kaynağına erişmek için veri kaynağı ile bir bağlantının sağlanması gerekir. Bu
bağlantıda bağlantı türü ve bağlantının yapılacağı veri kaynağı belirtilir. Veri kaynağına olan
bağlantıyı sembolize eden sınıflar SqlConnection ve OleDbConnection dır. Bu konuda
OleDbConnection sınıfını kullanacağız. Çünkü OleDb ile hem SQL sunucusuna hem de diğer
veri tabanlarına erişebiliriz. Aşağıda SQL Server ve Access veritabanlarına SqlConnection ve
OleDbConnection ile nasıl bağlanıldığı gösterilmektedir.
179
Veritabanı İle Bağlantıyı Gerçekleştirmek
<SCRIPT runat='server'>
180
Programdaki ilk 3 satır ile sayfanın kullanacağı dili ve programın çalışması için gerekli
olan isim alanları tanımlanıyor. SqlConnection özelliği ile bağlantı nesnesi oluşturuluyor ve bu
bağlantı nesnesinin özellikleri tanımlanıyor. Biz bu örnekte SQL Server in hazır
veritabanlarından olan Pubs ile bağlantı kurduk ve baglantı nesnesinin database ve
ServerVersion özellikleri Response.Write ile yazdırıldı.
conn.Open();
Response.Write("Bağlantı Gerçekleştirildi");
conn.Close();
181
Hata Koduyla Veritabanı Bağlantısı
SQL
<% @Page language='c#' debug='true' %>
<% @Import namespace='System.Data' %>
<% @Import namespace='System.Data.SqlClient' %>
<SCRIPT runat='server'>
Yukarıdaki programı gördüğünüz gibi try ve catch blokları arasına yazdık. Bunun amacı
eğer bağlantıda bir sorun varsa bize sorunu ve sorun kaynağını vermesi içindir. Biz eğer
programı çağırmadan önce Sql Server Service Maneger ‘dan stop komutunu verirsek program
bağlantıyı kuramayacak ve aşağıda görüldüğü gibi hata mesajı verecektir.
182
Access
protected void Page_Load(object sender, EventArgs e)
{
try
{
conn.Open();
Response.Write("Bağlantı Gerçekleştirildi");
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
conn.Close();
183
OleDbCommand ve OleDbDataReader
1) OleDbCommand nesnesi bir bağlantı nesnesi ve bir SQL cümleciği ile oluşturulabilir.
SQL cümleciği veritabanından sorgulama yapmamızı sağlar. Aşağıda yazdığımız sorgu
ile Bilgiler tablosundan adı ve soyadı bilgilerini listelettik.
conn.Open();
Response.Write("Bağlantı Gerçekleştirildi");
String sorgu = "Select Adı, Soyadı FROM Bilgiler";
OleDbCommand komut = new OleDbCommand(sorgu, conn);
conn.Close();
184
protected void Page_Load(object sender, EventArgs e)
{
conn.Open();
Response.Write("Bağlantı Gerçekleştirildi");
OleDbCommand komut = new OleDbCommand("Bilgiler", conn);
komut.CommandType = CommandType.TableDirect;
conn.Close();
try
{
conn.Open();
Response.Write("Bağlantı Gerçekleştirildi");
OleDbCommand komut = new OleDbCommand("Yordam", conn);
komut.CommandType = CommandType.StoredProcedure;
komut.Parameters.Add("@Yaş", "30");
}
catch (Exception ex)
{
Response.Write(ex.Message);
conn.Close();
}
Add() metodu ile Yordam isimli Stored Procedure yordamındaki Yaş parametresine 30
değeri gönderilmektedir.
185
OleDbCommand nesnelerinin oluşturulma yöntemlerinden en çok kullanılanı ve bizim
uygulamalarda kullanacağımız SQL sorgusudur. Zaten SQL sorgusu ile bir tablonun tamamı
elde edilebilir.
ExecuteNonQuery() Metodu:
Command Nesnesi üzerinde veri güncelleme, değiştirme ve silme işlemleri yapmak için
kullanılır. Bu işlemin sonucunda etkilenen kayıt sayısı geriye döndürür.
186
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
Default.aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Web;
187
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.OleDb;
}
protected void Button2_Click(object sender, EventArgs e)
{
TextBox1.Text = "";
TextBox2.Text = "";
TextBox3.Text = "";
TextBox4.Text = "";
TextBox5.Text = "";
}
}
ExecuteScalar() Metodu:
Çalıştırılan Command nesnesinden geriye tek değer döndürmek için kullanılır. Örneğin bir
tablodaki kayıt sayısını elde etmek için kullanılan Count komutunun kullanıldığı SQL
sorgularının çalıştırılması ExecuteScalar() metodu ile yapılabilir. Aşağıdaki programda Bilgiler
Tablosundaki kayıt sayısının nasıl elde edildiği görülmektedir.
188
protected void Button1_Click(object sender, EventArgs e)
{
string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=" + Server.MapPath("fakulte.mdb");
OleDbConnection conn = new OleDbConnection(connStr);
try
{
conn.Open();
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
}
Çıktı:
Toplam Kayıt Sayısı : 10
ExecuteReader() Metodu:
OleDbDataReader nesnesi ile bir kayıttan sadece ileriye doğru ilerleme yapılır. Yani bir
kayıt kümesinden bir kaydı okuduktan sonra tekrar geriye dönüp eski kayıtları okumak mümkün
değildir.OleDbDataReader nesnelerini new operatörüyle doğrudan oluşturamayız. Bunun yerine
OleDbCommand nesnesinin ExecuteReader geri dönüş değeri kullanılır.
OleDbDataReader sınıfında bildirilen iki indeksleyici ile sorgu sonucu elde edilen kayıt
kümesindeki her sütuna ilişkin veriler elde edilebilir. Bu indeksleyicilerin kullanımı aşağıdaki
gibidir.
189
DataReader[1] ;
DataReader[“Adı”];
string [] a={"Numarası","Adı","Soyadı","Bölümü","Danışmanı"};
for(int j=0;j<5;j++){
TableCell c = new TableCell();
c.Controls.Add(new LiteralControl(a[j]));
r1.Cells.Add(c);
}
Table1.Rows.Add(r1);
190
// int kayıt = (int)komut1.ExecuteScalar();
while (ord.Read())
{
TableRow r = new TableRow();
for (int i = 0; i <5; i++)
{
TableCell c = new TableCell();
c.Controls.Add(new
LiteralControl(ord[i].ToString()));
r.Cells.Add(c);
}
Table1.Rows.Add(r);
/*for (int j=0; j <kayıt; j++)
{
ord.Read();
TableRow r = new TableRow();
for (int i = 0; i <5; i++)
{
TableCell c = new TableCell();
c.Controls.Add(new
LiteralControl(ord[i].ToString()));
r.Cells.Add(c);
}
Table1.Rows.Add(r);
}
ord.Close();*/
}
ord.Close();
conn.Close();
}
191
Read() metodunun geri dönüş değeri eğer OleDbDataReader ile okuma yapılabildiyse
true değerindedir. Eğer okuma yapılamadıysa false değerindedir. Read() metodu her
çağrıldığında OleDbDataReader nesnesindeki kayıt işaretçisi bir artırılır. İşaretçi son kaydı
gösterdikten sonra Read() metodu ile artık okuma yapılmayacaktır.
192
}
string a=TextBox1.Text;
string sorgu1 = @"delete from Bilgiler WHERE Numarası='" + a +
"'";
OleDbCommand db_komut= new OleDbCommand(sorgu1 ,conn);
conn.Close();
}
Örnek: Veritabanında güncelleme yapmak
Veritabanındaki kayıtlarda değişiklik yapmak için UPDATE komutu kullanılır.
protected void Button2_Click(object sender, EventArgs e)
{
ExecuteXmlReader() Metodu:
Çalıştırılan Command Nesnesinden geriye XML döndürmek için kullanılır. Sadece SQL
Server 7.0 ve sonraki versiyonları için kullanılır. Bu metot sadece SqlCommand ile
uygulanabilir. SQL Server, verileri XML şeklinde elde etmek için çeşitli komutlar sağlamıştır.
Bu komutun geri dönüş değeri ise ileride göreceğimiz XmlReader sınıfı türündendir.
193
DataSet ve bir DataSet içindeki yapıları temsil eden DataTable, DataRow, ve
DataColumn sınıfları ADO.NET’in veri erişim modeline getirdiği yenilikleri içerir.
Bir DataSet ile, veri kaynağından bağlantı kesilse bile DataSet içerisindeki verilerle
çalışabiliriz. Konunun başında bahsedilen offline çalışma DataSet ile olmaktadır. DataSetbir
veri kaynağının adeta şablonu gibidir. Bir DataSet içerisinde bir veya daha fazla tablo olabilir.
Bu tablolar System.Data isim alanındaki DataTable sınıfı ile temsil edilir. Tabloların yapısında
ise kayıtları ve sütunları temsil eden DataRow ve DataColumn sınıfları mevcuttur.
DataSet nesnelerine veri kaynağından bilgi alıp doldurmak için DataAdapter sınıfı
kullanılır. DataAdapter sınıfı System.Common isim alanında bulunur. Diğer bir yol ise
System.Data.SqlClients isim alanında bulunan SqlDataAdapter sınıfını kullanmaktır. DataSet ve
DataAdapter nesnelerinin OLEDB ve SQL Server için sunduğu arayüzler aynıdır.
DataTable sınıfı, bir veri kaynağındaki tablolara benzer. Yani bir DataTable
nesnesinde sütunlar ve verileri içeren kayıt satırları bulunmaktadır. Bir DataSet nesnesi içinde
birden fazla DataTable olabileceği için farklı DataTable nesneleri arasında çeşitli ilişkiler
kurulabilir. DataTable nesnelerinin columns özelliği ilgili tablodaki sütunları bir DataColumn
koleksiyonu şeklinde verir. Aynı şekilde Rows özelliği de tablodaki satırları bir DataRow
koleksiyonu şeklinde verir.
DataColumn sınıfı, bir tablodaki sütunları temsil eder. DataColumn ile temsil edilen
bir sütunun veri türü C#’taki herhangi bir temel veri türü olabilir. DataColumn nesneleri ile bir
sütunun çeşitli özellikleri değiştirilebilir. Aşağıda bir DataColumn nesnesinin oluşturulması ve
bazı özellikleri verilmiştir.
Dc adında bir DataColumn nesnesi oluşturuldu.
194
dc.AllowDBNull=false;
Yeni bir kayıt eklendiğinde bu sütunun değerinin otomatik olarak artıp artmayacağını verir.
dc.AutoIncrement=true;
dc.AutoIncrementSeed=10;
dc.AutoIncrementStep=1;
dc.Caption="No";
dc.DataType=typeof(int);
dc.DefaultValue=(Object)"*";
dc.MaxLength=10;
Sütunun bir sütun koleksiyonunda kaçıncı sırada olduğunu verir. Okunabilir bir özelliktir.
Response.Write(dc.Ordinal);
195
dc.Unique=true;
dc.Table;
DataRow nesnesi ise bir tablodaki satırları temsil eder. DataRow sınıfının birçok
metodu vardır. DataSet nesnesinin içerini veri kaynağındaki bilgilerle doldurmak için
DataAdapter() sınıfının Fill() metodu kullanılır. Bu metot parametre olarak bir Dataset nesnesi
almaktadır. Aşağıdaki örnekte şimdiye kadar anlatılan sınıfları kullanarak veritabanındaki tablo
ile ilgili bilgileri nasıl elde edildiği görülmektedir.
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.OleDb;
196
adp.Fill(ds, "Bilgiler");
Response.Write("<center>----------------Bilgiler
Tablosu--------------</center>" + "<br>");
// Response.Write("<br>");
//
Response.Write("-----------------------------------------------------"
);
}
Table1.Rows.Add(r);
baglan.Close();
}
}
Kaynak nesnesi ile veritabanı tanımlandı. Bağlan nesnesi ile tanımlanan kaynak nesnesi
ile veritabanıyla bağlantı sağlandı ve açıldı.
197
Ds ile tanımlanan DataSet nesnesine veri kaynağından bilgi alıp doldurmak için adp ile
tanımlanan DataAdapter nesnesi kullanıldı. Ve ds DataSet i Bilgiler tablosunun da ki kayıtlarla
dolduruldu.
}
Table1.Rows.Add(r);
198
Bir DataSet üzerindeki bir tabloya yeni bir kayıt eklemek için DataTable sınıfının
DataRow() metodu kullanılır. DataSet nesnesindeki tabloları elde etmek için ise DataSet
nesnesinin Tables özelliğini kullanabiliriz. Tables özelliğini bir indeksleyici ile kullanarak
DataSet nesnesine eklenen tabloları tek tek elde edebiliriz. Yeni oluşturulan bu kaydın DataSet
nesnesine de aktarılması için DataSet nesnesindeki Rows koleksiyonun Add metodu
kullanılabilir. Son olarak DataSet nesnesinde yapılan bu değişikliklerin veri kaynağında da
güncellenmesi için DataAdapter nesnesinin Update() metodunu kullanmalıyız. Aşağıda Uyeler
tablosuna yeni bir kayıt eklenmektedir.
199
string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=" + Server.MapPath("fakulte.mdb");
OleDbConnection conn = new OleDbConnection(connStr);
try
{
conn.Open();
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
string sorgu = @"INSERT INTO
Bilgiler(Numarası,Adı,Soyadı,Bölümü,Danışmanı) VALUES('" +
TextBox1.Text + "','" + TextBox2.Text + "','" + TextBox3.Text + "','"
+ TextBox4.Text + "','" + TextBox5.Text + "')";
OleDbCommand komut = new OleDbCommand(sorgu, conn);
komut.ExecuteNonQuery();
conn.Close();
Label6.Text = "Kayıt Eklendi";
}
protected void Button2_Click(object sender, EventArgs e)
{
TextBox1.Text = "";
TextBox2.Text = "";
TextBox3.Text = "";
TextBox4.Text = "";
TextBox5.Text = "";
}
200
DataSet nesnesinden bir kayıt silmek istendiğinde DataRow nesnesinin Delete() metodu
kullanılabilir. Silinen kayıtların DataAdapter ile veritabanında güncellenmesi için DataAdapter
nesnesinin DeleteCommand nesnesi tanımlanmalıdır. Aynı işlemler bir kaydın değiştirildiği
durum içinde geçerlidir. Bunun için ise UpdateCommand nesnesi tanımlanır.
201
GridView Kontrolünde Update,Delete İşlemleri
</asp:AccessDataSource>
202
SelectCommand özelliği dışında, dikkati çeken bir diğer özellik UpdateCommand’
dır. UpdateCommand özelliği, satırlardaki değişikliklerin veri kaynağına
yansıtılmasında kullanılacak Sql sorgusunu içermektedir.
203
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server" AllowPaging="True"
AllowSorting="True" AutoGenerateColumns="False"
DataSourceID="AccessDataSource1" DataKeyNames="Numarası" >
<Columns>
<asp:BoundField DataField="Numarası"
HeaderText="Numarası" SortExpression="Numarası" ReadOnly="True" />
<asp:BoundField DataField="Adı" HeaderText="Adı"
SortExpression="Adı" />
<asp:BoundField DataField="Soyadı" HeaderText="Soyadı"
SortExpression="Soyadı" />
<asp:BoundField DataField="Bölümü"
HeaderText="Bölümü"
SortExpression="Bölümü" />
<asp:BoundField DataField="Danışmanı"
HeaderText="Danışmanı" SortExpression="Danışmanı" />
<asp:CommandField ShowEditButton="True" />
<asp:CommandField ShowDeleteButton="True" />
</Columns>
</asp:GridView>
204
Bizim için en önemli özellik, DataKeyNames’ dir. Bu özellik, GridView
kontrolünde üzerindeki satırlarda yapılan veri değişiklikleri sonucu, güncelleme
işlemlerinin hangi primary key alanı üzerinden yapılacağını belirtmektedir.
Nitekim, Sql sorgumuza dikkat edecek olursanız, güncelleme işleminin hangi
alan için yapılacağını belirleyebilmek amacıyla, primary key olan Numarası alanı
kullanılmıştır.
Properties ekranında bulunan Auto Format ile GridView inize istediğiniz formatı verebilirsiniz.
Biz Autumn Formatını seçiyoruz.
205
Görüldüğü gibi, ilgili satıra ait alanlarda TextBox kutucukları veri girişi için hazır
beklemektedir. Bu noktada Güncelle linkine tıklarsak, seçili satırın Numarası değeri
ile birlikte diğer alanların güncel içerikleri, AccessDataSource kontrolünün
UpdateCommand özelliğinde kullanılan Sql sorgusuna parametre olarak
gönderilirler. Ardından güncelleme işlemi yapılır ve GridView kontrolü güncel içeriği
ile görüntülenir. Örneğin, "Rabia" değerini "Ramazan" yapıp Güncelle linkine
bastığımızda aşağıdaki ekran görüntüsünü elde ederiz.
206
Header Text; DataGrid de o alanın en yukarısında yazılması istenen başlıktır.
Data Field ise; veritabanımızdaki alanın ismidir.
Read Only ; GridView in Edit Modun da iken var olan alanın asla değiştirilmemesini sağlar. Bu
kullanıma en uygun alan Numarası alanımız için true seçiyoruz.
<UpdateParameters>
<asp:Parameter Name="Numarası" />
<asp:Parameter Name="Adı" />
<asp:Parameter Name="Soyadı" />
<asp:Parameter Name="Bölümü" />
<asp:Parameter Name="Danışmanı" />
</UpdateParameters>
<DeleteParameters>
<asp:Parameter Name="Numarası" />
207
</DeleteParameters>
</asp:AccessDataSource>
Eğer Sil linki ile bir satırı silecek olursak, ilgili satırın Numarası değeri,
AccessDataSource kontrolündeki, DeleteCommand özelliğine parametre olarak
gidecek ve Sql sorgusu çalıştırılarak ilgili satır silinecektir. Örnek olarak, Numarası
08531001 değerine sahip satırı sildiğimizde, aşağıdaki ekran görüntüsünü elde
ederiz.
208
XML İşlemleri Ve System.Xml
XML bir programlama dili değildir. XML belgelerini, biçimlendirilmiş metin tabanlı
verileri, depolama işine yarayan belgeler şeklinde nitelendirebiliriz. Veritabanları, elde olan
bilgileri çeşitli biçimlerde saklamak için kullanılan gelişmiş sistemlerdir. Bazı veritabanları
sunucu-istemci mimarisini desteklerken bazı veritabanları dosya sisteminde normal bir
dosyaymış gibi davranır. Dosya sisteminde bulunan veritabanları hızlı olmakla beraber
günümüz şartlarında kullanışlı değildir. Çünkü dosya sisteminden aynı anda binlerce kişinin
aynı dosyayı okumaya çalışması sistemin çökmesine sebep olabilmektedir. Bunun için verileri
daha düzenli ve daha sistematik bir şekilde işleyen veritabanı sunucuları kullanılır. Microsoft’un
209
SQL Server sunucusu ve Oracle veritabanı yönetim sistemleri bunlara verilebilecek en önemli
iki örnektir.
Veritabanı sunucuları daha piyasada yokken metin tabanlı bilgi saklama yöntemleri
kullanılırdı. ADO.NET konusunda örneklerimizde kullandığımız Bilgiler tablosuna benzer bir
tablo metin tabanlı bir tablo olarak aşağıdaki gibi yazılıyordu.
Yukarıdaki her bir satır veritabanındaki bir kaydı göstermektedir. Her bir sütun ise
virgül işareti ile birbirinden ayrılmış durumdadır. Bu dosyadan kayıt ve sütunlarla ilgili bilgileri
elde edebilmek için dosyayı açıp çeşitli ayıklama işlemlerini yapmamız gerekir. Fakat XML ile
metin tabanlı veri saklama sistemine büyük kolaylık gelmiştir. Normal veritabanlarındaki gibi
verilere çeşitli isimler verilir ve gerektiğinde bu verinin ismi kullanılarak asıl veri dosyadan
çekilir. Tabi XML dosyaları ile ilgili yazma ve okuma gibi temel işlemleri yapabilmek için
sistemimizde XML motoru dediğimiz kütüphanelerin olması gerekir. Eğer yoksa XML belgeleri
ile ilgili işlem yapmak bir hayli zor olacaktır. XML ayıklayıcı bir defa yazıldıktan sonra XML
dosyalarını bir veritabanı gibi kullanabiliriz. XML, W3C standartları tarafından desteklendiği
için hemen bütün platformlar XML desteği vermektedir. Bir platformun XML desteği
vermesinden kastımız, XML belgelerini işleyebilmek için gerekli olan motorun sağlanmasıdır.
XML’in standart olmasından dolayı XML tabanlı birçok uygulama alanı gelişmiştir. Örneğin
farklı sistemler arasında haberleşmeyi sağlayan Web servisleri bu uygulama alanlarından en
önemlisidir. Web servisleri sayesinde internet protokolü dediğimiz HTTP üzerinden, XML
yardımıyla bir sunucudaki metodu çalıştırıp metodun geri dönüş değerini, aradaki çeşitli
katmanları kullanarak XML formatında elde edebiliriz.
XML Belgeleri
Şimdi basit bir XML dosyası oluşturup XML belgesindeki çeşitli elemanlara bakalım.
Bu dosyayı oluşturmak için bir metin belgesi açıp aşağıdaki kodları yazalım ve .xml olarak
kaydedelim. Veya Visual Studio .Net’te şu adımları uygulayalım.
210
ilkuygulama.xml
Bu dosyayı Internet Explorer ile çağırdığımızda aşağıdaki gibi bir çıktı elde ederiz.
211
Şekil–4.1: Yukarıdaki kodların çıktısını gösteren şekil
En sade hali ile bir XML belgesi yukarıdaki gibi oluşturulabilir. Belgeden de görüldüğü
gibi her veri, kapanan ve açılan etiketler arasına yazılmıştır. Belgenin ilk satırında, çeşitli
bildirimler yapılmaktadır. Bu bildirimler versiyon bilgisi ve karakter kodlamasıdır. Bu
bildirimler bu kadar ile sınırlı değildir. Her XML belgesinin mutlaka bir kök elemanı olmalıdır.
Bu örnekte kök eleman
<yemekler>
…………..
</yemekler>
etiketi ile bildirilen elemandır. Kök elemanı olmayan bir XML belgesi geçerli değildir.
Diğer bütün elemanlar kök elemanın içinde bulunur. Tıpkı bir ağaç yapısı gibi, yemekler
elemanında iki adet menü elemanı bulunmaktadır. Menü elemanı ise farklı yemek çeşitlerinden
oluşan 3 ayrı elemandan oluşmaktadır. XML belgelerindeki veriler açılan ve kapanan etiketler
arasına yazılır. Örneğin
<ana_yemek>Döner</ana_yemek>
Etiketinde “Döner” bilgisinin bir ana yemek olduğu söylenmektedir. Ayrıca her etiket
için farklı niteliklerde tanımlanabilir. Örneğin
212
<menu adı="Seçenek 2">
İfadesinde menü elemanının “adı” isminde bir niteliği vardır. Bu niteliğin değeri ise
"Seçenek 2" şeklindedir.
Bir ASP.NET sayfasına Xml belgesini eklemek için XmlDocument nesnesinin Load
metodunu kullanırız. Aşağıdaki uygulamamızda loadmetodu.aspx sayfasına kitaplar isimli xml
belgesi yüklenmiş ve OuterXml ile elde edilen veriler ekrana yazdırılmaktadır.
(Kitaplar.xml)
<KİTAPLAR>
<KİTAP>
<BAŞLIK>C# Developer's Guide To ASP.NET, XML and ADO.NET</BAŞLIK>
<YAZAR YER='San Francisco'>Jeffrey P. McManus</YAZAR>
<YAZAR YER='Seattle'>Chris Kinsman</YAZAR>
</KİTAP>
</KİTAPLAR>
(loadmetodu.aspx)
213
<%@ Import Namespace="System.Xml" %>
<SCRIPT runat="server">
void Page_Load(Object Sender,EventArgs e)
{
XmlDocument xd = new XmlDocument();
xd.Load(Server.MapPath("kitaplar.xml"));
Response.Write (xd.OuterXml);
xd = null;
}
</SCRIPT>
XML belgeleri üzerinde işlem yapmak için geliştirilmiş sınıflar System.XML isim
alanında bulunur. Bu isim alanından en çok kullanılanları aşağıda verilmiştir.
XmlReader: XML belgelerinden verileri okumamız için tasarlanmış bir sınıftır. Tamponlama
mekanizması ile çalışmamaktadır. Yani veriler direkt dosya sisteminden alınır.
XmlWriter: Bir akıma yada dosya sistemine XML verilerini kaydetmek için kullanılır.
XmlTextReader: XML belgelerinden sadece ileri yönde okuma yapabilir ve XML verilerine
bir akım (stream) gibi erişmemizi sağlar.
214
XmlNode: XML belgesindeki tek bir düğümü temsil etmek için kullanılır.
XmlNodeReader: Bu sınıf okumak için bir düğüm bilgisini kaynak olarak kullanır.
XmlDocument: Bir XML belgesinin belleğe bir ağaç yapısı şeklinde yüklenmesini ve bu ağaç
üzerinde çeşitli işlemler yapılabilmesini sağlar.
XmlTextReader Sınıfı
string dosya="ilkuygulama.xml";
XmlTextReader= new XmlTextReader(dosya);
string dosya=”ilkuygulama.xml”;
FileStream fs=new FileStream(dosya, FileMode.Open)
XmlTextReader= new XmlTextReader(fs);
215
XmlTextReader sınıfının Read() metodu XML belgesinden okuma yapar. Read()
metodu her çağrıldığında XML belgesindeki bir sonraki düğüm okunur. Dosyanın sonuna
gelindiğinde Read() metodu okuma yapamayacağı için false değerine dönecektir. Read()
metodu her okuma yaptığında yeni bir düğüm üretir. XmlTextReader sınıfındaki çeşitli
özellikler bu düğüme ilişkindir. Şimdi yapıyı daha iyi anlayabilmek için aşağıdaki xml belgesini
oluşturalım.
Uygulama2.xml
Bu xml belgesindeki her bir satır bir düğümü ifade etmektedir. Ancak her düğümün
farklı özellikleri vardır. Örneğin bazı düğümler sonlandırma düğümleri iken bazı düğümler
başlangıç düğümleridir. Bazı düğümlere ait nitelik bilgileri varken bazılarında yoktur. Ayrıca
bazı düğümlerin değeri de yoktur. Örneğin menu elemanı içinde sadece diğer elemanlar vardır.
Ayrı bir veri türü olarak herhangi bir veri bulundurmamaktadır. Düğümlerin bütün özelliklerini
XmlTextReader sınıfını çeşitli özellikleri ile kontrol edebilmekteyiz. Şimdi yukarıdaki Xml
belgesini okuyup düğümlerle ilgili çeşitli düğümler elde eden aşağıdaki programı yazalım. Bu
program için bir ConsoleApplication uygulaması açalım. Kod yazamaya geçmeden önce
uygulama2.xml belgesini C:/Inetpub/wwwroot/ dizini altına taşıyalım.
using System.Xml;
216
protected void Page_Load(object sender, EventArgs e)
{
string yol = @"C:\Inetpub\wwwroot\WebSite\Vtabani\
XMLFile.xml";
while (xtr.Read())
{
if (xtr.NodeType == XmlNodeType.Element)
{
Response.Write(xtr.Name);
if (xtr.HasAttributes)
{
Response.Write(xtr.AttributeCount+" niteliği var,"
);
while (xtr.MoveToNextAttribute())
Response.Write(xtr.Name + " " + xtr.Value);
Response.Write("<br>");
}
else
Response.Write("\tNitelik Yok..."+"<br>");
}
}
}
Şekil–4.3: Yukarıdaki kodların çıktısını gösteren şekil
217
Programın çıktısından da görülebileceği üzere uygulama2.xml dosyasındaki bütün
elemanların adı ve sahip oldukları nitelikler yazdırılmıştır. Öncelikle XmlTextReader sınıfının
NodeType özelliği ile ilgili düğümün eleman(element) olup olmadığını kontrol ediyoruz.
Düğümler eleman olmak zorunda değildir, örneğin bir düğüm yorum satırı ya da komut
bildirimi olabilir. Yada daha spesifik olarak son eleman(end element) olabilir. XmlTextReader
sınıfının NodeType özelliği System.Xml isim alanında bulunan XmlNodeType
numaralandırıcısı türündendir. Bu numaralandırıcının sembollerinden biriside Element’tir.
XmlNodeType numaralandırıcısının diğer sembolleri ise aşağıdaki gibidir.
XmlTextReader sınıfının Name özelliği, ilgili düğümün etiket ismini; Value özelliği ise
ilgili düğümün değerini vermektedir. Programda bir düğümün eleman olduğuna karar verdikten
sonra HasAttributes özelliği ile elemanın nitelik içerip içermediği tespit edilmektedir. Eğer
nitelik içeriyorsa AttributeCount özelliği ile toplam nitelik sayısı yazdırılıyor. Daha sonra
XmlTextReader sınıfının MoveToNextAttribute() metodu ile bu nitelikler arasında iteratif bir
şekilde ilerleniyor. Her yeni nitelik ile karşılaşıldığında o niteliğin adı Name özelliği ile değeri
ise Value özelliği ile ekrana yazdırılıyor.
ReadChar Metodu:
218
Bir Xml belgesinden karakterleri okumak için kullanılır. Kullanılış şekli aşağıdaki
gibidir.
using System;
using System.Xml;
219
// ReadChars metodunun değişken değerleri girildi
karaktersay = 15;
kelime = new Char[karaktersay];
220
Şekil–4.4: Yukarıdaki kodların çıktısını gösteren şekil
using System;
using System.Collections;
using System.Xml;
class xmloluşturma
{
static void Main()
{
Hashtable sozluk =new Hashtable();
sozluk.Add("Araba","Car");
sozluk.Add("Masa","Table");
sozluk.Add("Okul","School");
sozluk.Add("Bilgisayar","Computer");
221
XmlTextWriter xw=new XmlTextWriter
("C:/uygulama3.xml",System.Text.Encoding.GetEncoding("windows-
1254"));
xw.Formatting=Formatting.Indented;
xw.WriteStartDocument();
xw.WriteComment("Türkçe-ingilizce Sözlük");
xw.WriteStartElement("Sozluk");
int i=1;
foreach(DictionaryEntry d in sozluk)
{
xw.WriteStartElement("kelime");
xw.WriteAttributeString("No",i.ToString());
xw.WriteStartElement("Türkçe");
xw.WriteString(d.Key.ToString());
xw.WriteEndElement();
xw.WriteStartElement("İngilizce");
xw.WriteString(d.Value.ToString());
xw.WriteEndElement();
i++;
}
xw.WriteEndElement();
xw.WriteEndDocument();
xw.Close();
}}
222
Şekil–4.5: Yukarıdaki kodların çıktısını gösteren şekil
XmlTextWriter Sınıfı
223
XmlTextWriter(string dosya, System.Text.Encoding kodlama): Bu yapıcı metot ile
oluşturulacak XML dosyasının yol bilgisi ve XML belgesinin karakter kodlaması
System.Text.Encoding sınıfı türünden belirtilir.
System.Text.Encoding.GetEncoding("windows-1254");
yazıldığına dikkat edin. Encoding sınıfı System.Text isim alanında bulunmaktadır. Encoding
nesnesi oluşturmak için statik GetEncoding() metodu bir string parametresi ile kullanılmıştır.
Parametre ile verilen “Windows-1254” yazısı karakter kodlamasının Windows uyumlu ve
Türkçe olacağı belirtilmektedir.
xw.Formatting=Formatting.Indented;
deyimi yazıldı. Formatting özelliği bir numaralandırıcıdan ibarettir. Indented sembolü ise her
elemanın bizim gözle rahat görebileceğimiz biçimde kümeleneceğini göstermektedir. Eğer bu
satırı yazmamış olsaydık XML belgesi tek bir satır halinde oluşturulurdu, dolayısıyla XML
belgesindeki elemanların ne şekilde kümelendiğini açıkça göremezdik.
WriteStartDocument() metodu ile XML belgesine versiyon bilgisi yazılıyor. Daha sonra
WriteComment() metodu ile XML belgesine bir yorum satırı eklenmektedir. XML belgelerinde
yorum satırları aşağıdaki gibidir.
224
Bu kısmın başında denildiği gibi her XML belgesi mutlaka bir kök eleman içermelidir.
Bu yüzden WriteStartElement() metodu ile yeni bir başlangıç elemanı yazdırılıyor. Bu metot ile
XML belgesine <Sozluk> yazdırmış oluyoruz. Sozluk etiketinin kapatılması için XML
belgesine diğer bilgileri yazdırmamız gerekir. Bu bilgileri yazdıktan sonra WriteEndElement()
metodu ile </Sozluk> yazdırıyoruz. Bir foreach döngüsü ile Hashtable nesnesindeki bütün
anahtar değer ikilileri bir kelime etiketi oluşturacak şekilde XML belgesine yazdırılıyor. Her bir
elemana ilişkin yazdırılma işlemi bittikten sonra WriteEndElement() metodunun çağrıldığını
unutmayın. WriteAttributeString() metodu ile bir elemana aşağıdaki gibi bir nitelik veriliyor.
xw.WriteAttributeString("No",i.ToString());
“No” niteliğin ismidir, ikinci parametre ise niteliğin alacağı değerdir. Niteliğin alacağı
bu değer döngünün her iterasyonunda artan bir tamsayıdır. Bu parametre string türünden olduğu
için ToString() metodu kullanılmıştır.
Diğer bir metot olan WriteString() ise bir eleman düğümü için değer yazmaktadır.
Hashtable nesnesindeki Türkçe ve İngilizce kelimeler bu metot ile yazdırılmaktadır.
Xml belgeleri ile çalışmanın tek yolu XmlTextReader veya XmlTextWriter sınıfları
değildir. W3C’nin DOM denilen modelini destekleyen ve System.Xml isim alanında bulunan
XmlDocument sınıfı ile çalışmamız mümkündür. XmlDocument ile bir XML belgesi tamamen
belleğe yüklenir ve bir DataSet gibi üzerinde işlemler yapılıp tekrar XML belgesine güncelleme
yapılır. XmlDocument ile XML belgesi belleğe bir ağaç yapısı şeklinde yüklendiği için çeşitli
sınıflar yardımıyla her bir düğüm elde edilip üzerinde çeşitli işlemler yapılabilir.
XmlDocument ile çalışırken sıkça kullnacağımız iki sınıf daha vardır. Bunlar
XmlElement ve XmlAttribute sınıflarıdır. Bu sınıflar sırasıyla bir eleman ve nitelik temsil etmek
için kullanılır. Bir XmlDocument nesnesi oluşturmak için yol bilgisi ya da akım bilgisi
gerekmektedir. XmlDocument nesnesi bellekteki verileri temsil etmektedir. Bu yüzden
XmlDocument nesnesine XML belgesini yüklememiz için XmlTextReader sınıfına ihtiyacımız
vardır. XmlTextReader sınıfı ile okunan XML belgesini, XmlDocument nesnesine aktarmak
225
için XmlDocument sınıfının Load() metodu kullanılır. XmlDocument nesnesinde yapılan
değişiklikleri tekrar XML belgesine kaydetmek için ise Save() metodu kullanılır. Şimdi bir
önceki başlık altında oluşturduğumuz uygulama3.xml belgesini XmlDocument nesnesine ne
şekilde aktarabileceğimize bakalım.
Attributes: İlgili düğüme ilişkin bir nitelik koleksiyonu döndürür. Bu koleksiyonun türü
XmlAttributeCollection’ dır.
ParentNode: Bir düğüme ilişkin XmlNode sınıfı ile temsil edilmiş ana düğümü verir.
HasChildNodes: Eğer ilgili düğüm bir başka yavru düğüm (child node) içeriyorsa true değeri
döndürür.
FistChild: İlgili düğüme ilişkin ilk yavru düğümü XmlNode sınıfı türünden verir.
LastChild: İlgili düğüme ilişkin son yavru düğümü XmlNode sınıfı türünden verir.
ChildNodes: İlgili düğüme ilişkin yavru düğümleri bir XmlNodeList koleksiyonu şeklinde
verir.
InnerText: Bir düğümün içinde yavru düğümleri ve varsa düğümlerin değerlerini verir.
InnerXml: Bir düğüme ilişkin bilgileri ve yavru düğümleri XML etiketleri ile beraber string
türünden verir.
226
OuterXml: Bir düğüme ilişkin bilgileri XML etiketleri ile beraber string türünden verir. Bu
özellikte yavru düğümler alınmaz.
Düğümleri Kullanma:
Bir xml belgesinden verileri elde edebilmenin çeşitli yöntemleri vardır. Bunlardan bir
tanesi de düğüm adlarını kullanarak istenilen verileri elde etme yöntemidir. Biz aşağıdaki
uygulamamızda kitaplar.xml belgesinden yazar isimlerini aldık. Bir ASP.NET sayfası açıp
aşağıdaki kodları Load olayına yazalım. Kitaplar.xml belgesini de programın oluşturulduğu
klasöre atmayı unutmayalım.(WebApplication45)
xd.Load(Server.MapPath("kitaplar.xml"));
ndkitap = xd.FirstChild["KITAP"];
foreach(XmlNode nd in ndkitap.ChildNodes)
{
if(nd.Name == "YAZAR")
Response.Write("Yazarın Adı " + nd.InnerText +
"<BR>");
}
}
227
XmlNode nesnesinin Name özelliğini kullanarak düğüm ismiyle bizim istediğimiz
“YAZAR” kelimesini karşılaştırdık. Programda bize <YAZAR> tagları arasındaki bilgileri
listeledi.
using System;
using System.IO;
using System.Xml;
class xmlDom
{
static void Main()
{
XmlTextReader xr=new XmlTextReader("C:/uygulama3.xml");
XmlDocument doc=new XmlDocument();
doc.Load(xr);
XmlNodeList xnl=xnl=doc.ChildNodes;
Console.WriteLine("Toplam Yavru Düğüm:"+xnl.Count);
foreach(XmlNode xn in xnl)
Console.WriteLine("Yavru Düğüm Adı:
{0},Türü{1}",xn.Name,xn.NodeType);
228
Console.WriteLine("\n");
XmlElement xe=doc.DocumentElement;
if(xe.HasChildNodes)
{
Console.WriteLine("İlk Yavru Düğüm:{0}",xe.FirstChild.Name);
}
XmlNodeList xnl2=xe.FirstChild.ChildNodes;
foreach(XmlNode xn in xnl2)
Console.WriteLine("Yavru Düğüm Adı:
{0},Türü{1}",xn.Name,xn.NodeType);
Console.Read();
}
}
229
Bu programımızda oluşturacağımız ASP.NET sayfası ile ilkuygulama.xml isimli
belgeden verileri okuyup ekrana yazdıracağız. Uygulamaya başlamadan önce ilkuygulama.xml
isimli belgeyi C:\Inetpub\wwwroot klasörüne kopyalayalım.
<SCRIPT runat='server'>
void Page_Load(Object Sender,EventArgs e)
{
XmlDocument xd = new XmlDocument();
xd.Load(Server.MapPath("ilkuygulama.xml"));
Response.Write (xd.OuterXml);
}
</SCRIPT>
Yine ilk iki satırda sayfanın hangi dili kullanacağı ve gerekli olan isim alanı
belirtilmiştir.Daha sonra xd isimli bir XmlDocument nesnesi oluşturulmuştur.
xd.Load(Server.MapPath("ilkuygulama.xml"));
Response.Write (xd.OuterXml);
230
Şekil–5.1: Yukarıdaki kodların çıktısını gösteren şekil
Uygulama
Kullanacağımız tablo ise fakulte veritabanındaki Uyeler tablosudur. İlk olarak bir aspx
sayfası açalım, bu sayfaya 5 tane TextBox ve bir buton ekleyelim. Ado.NET ile veritabanından
bağlantı yapabilmek için using System.Data.SqlClient isim alanını ve Xml işlemleri için ise
using System.Xml isim alanını ekleyelim. Butonun Click olayına ise veritabanından bilgileri
okuyup TextBoxlara yazacak olan kodumuzu yazalım.
SqlConnection cn;
SqlCommand cm;
SqlDataReader dr;
231
string [] dizi=new string[15];
string sorgu;
cn = new SqlConnection("server=localhost;uid=sa;pwd=;database=fakulte;");
sorgu = "SELECT * FROM Uyeler";
cm = new SqlCommand(sorgu, cn);
cn.Open();
dr = cm.ExecuteReader();
dr.Read();
object a=dr["Kullanıcı_Adı"];
TextBox1.Text=(string)a;
dizi[0]="Kullanıcı_Adı";
object b=dr["Şifre"];
TextBox2.Text=(string)b;
dizi[1]="Şifre";
object c=dr["Adı"];
TextBox3.Text=(string)c;
dizi[2]="Adı";
object d=dr["Soyadı"];
TextBox4.Text=(string)d;
dizi[3]="Soyadı";
object f=dr["Şehir"];
TextBox5.Text=(string)f;
dizi[4]="Şehir";
232
Şekil–4.3: Hazırlanan aspx sayfası
SqlConnection("server=localhost;uid=sa;pwd=;database=fakulte;"
Daha sonra Uyeler tablosundan bilgileri almak için bir SQL sorgusu yazdık ve bunu
sorgu adlı stringe yazdık.
String sorgu;
sorgu = "SELECT * FROM Uyeler";
233
dr = cm.ExecuteReader();
object a=dr["Kullanıcı_Adı"];
TextBox1.Text=(string)a;
dizi[0]="Kullanıcı_Adı";
Buraya kadar veriler tablodan okunup TextBoxlara yazıldı, şimdi bu verileri xml belgesi
şeklinde yazmak için hazırladığımız kodumuza bakalım.
234
xw.Close();
cn.Close();
}
}
xw.Formatting=Formatting.Indented
Xml belgesini formatlı bir şekilde görebilmek için Formatting.Indented özelliğini kullandık.
xw.WriteComment("Uyeler Tablosu");
xw.WriteStartElement("Uyeler");
int z=0;
foreach(DictionaryEntry k in Uyeler)
{
xw.WriteStartElement(dizi[z]);
xw.WriteString(k.Key.ToString());
xw.WriteEndElement();
z++;
}
235
Foreach döngüsü içerisinde dizi ve Uyeler dizilerinden alınan veriler xml belgesine
yazdırıldı.
xw.WriteEndElement();
xw.WriteEndDocument();
xw.Close();
cn.Close();
Programın sonunda ise xml belgesinin sonuncu elemanı yazdırıldı ve cn.Open(); ile
açtığımız veritabanı bağlantısını cn.Close(); metoduyla kapattık.
Xml Belgesi Oluşturmak İçin Tıklayınız linkine tıkladıktan sonra gördüğünüz gibi bir
xml belgesi oluşturuldu.
236
KAYNAKLAR
237