You are on page 1of 237

BÖLÜM 1

1. ASP NET’E GİRİŞ


ASP.NET, .NET çatısında belirli dosya türlerini yönetir. Bu dosya türleri arasında
.aspx, .ascx ve .asmx uzantılı dosyalarla birlikte başka dosyalarda bulunmaktadır. ASP.NET
motoru dinamik içerik oluşturmak için güçlü bir nesne modeli sağlar.

1.2 ASP.NET NEDİR?

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:

 Klasik ASP’ nin aksine ASP.NET, .NET dillerini kullanmaktadır. Dolayısıyla


herhangi bir sınıfının tüm gücüne aynı C#’ta yazılmış herhangi bir Windows programından
olduğu gibi erişebiliriz.
 ASP.NET tüm .NET dillerini(C#, C++, VBNET ve JScript) desteklediği için arzu
ettiğiniz herhangi bir dili veya uzman olduğunuz herhangi bir programlama dilini
kullanabilirsiniz.
 Klasik ASP ile kullanabileceğimiz script dilleri tipi olmayan, derlenmeyen ve pek
fazla gücü olmayan dillerdi. Yinede COM uyumlu herhangi bir dilde DLL’ ler yazarak ASP’

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 İLE UYGULAMA GELİŞTİRMEK

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?

IIS(Internet Information Services), Windows sistemler için web tabanlı uygulama


geliştirme ve yayınlama amacıyla kullanılan web sunucusudur.

5
IIS(Internet Information Services) Kurulması

1. Denetim Masası (Control Panel) penceresinde “Program Ekle/Kaldır” (Add or

Remove Programs) simgesini seçin.

2. Açılan pencerenin sol panelinden “Windows Bileşeni Ekle/Kaldır”

(Add/Remove Windows Components) bileşenini seçin.

3. “Windows Bileşeni Ekle/Kaldır” penceresinden “Internet Information

Services” (IIS) seçin.

4. Next butonunu tıklayarak kurulumu başlatın.

Uygulama Yayınlamak

Default.htm ismindeki HTML sayfayı IIS üzerinden yayınlayın.

1. “C:\Inetpub\wwwroot” klasorüne gidin.

2. wwwroot penceresi içerisinden Dosya menüsünü tıklayın.

3. Dosya menüsü içerisinden Yeni alt menüsünü tıklayın.


4. Yeni alt menüsü içerisinden Metin Belgesi komutunu vererek Yeni
Metin Belgesi oluşturun.
5. Oluşturduğunuz metin belgesi içerisine aşağıdaki HTML(Hyper Text
Markup Language) kodları ekleyin ve dosyayı kaydedin.

<html>
<head>
<title>HTMLPage1</title>
</head>
<body>
<p>Hoş Geldiniz.</p>

</body>

6
</html>

6. Metin belgesinin ismini Default.htm olarak değiştirin.


7. Intrernet Explorer açın ve aşağıdaki adreslerden herhangi birini adres
çubuğuna yazın.
a. http://localhost
b. http://127.0.0.1
c. http://MakinaAdı
d. http://IpNumarası

Localhost: Lokal makina adı.


127.0.0.1 : Lokal IP numarası.
Makina Adı: Ağ içerisindeki bilgisayar adı.
Ip Numarası: Ağ içerisindeki Ip Numarası.

ASP.NET WEB FORM VE KONTROLLERİ İLE ÇALIŞMAK

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 Bileşenleri

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.

<”@Page Language=”c#” …”>


<”@Page Language=”vb” …”>

CodeBehind
Web formların, Visual Basic .NET veya C# uzantılı kod dosyasını belirtir.

<@Page CodeBehind=”WebForm1.aspx.vb” …>


<@Page CodeBehind=”WebForm1.aspx.cs” …>

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.

<@Page Language=”c#” CodeBehind=”WebForm1.aspx.cs” SmartNavigation=”True” >

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.

<@Page EnableViewState=”True” …>

Ayrıca kontrol düzeyinde EnableViewState özelliği kullanılabilir. Bu durumda, Page yönerge


satırında belirtilen değer geçersiz olur.
<asp:Button … EnableViewState=”false“ …>

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.

Bir kontrolün sunucu tarafında çalıştığı runat=”server” özelliği ile belirlenir.

<asp:Button id=”Buton1” runat=”server” Text=”Tıklayınız” />

Örnekte istemci tarafında çalışan HTML Button kontrolü gösterilmektedir.

<INPUT type=”button” value=”Bu Bir Html Button” >

Bu kontrolün sunucu tarafında çalışması için, kontrole runat özelliği eklenmelidir. Böylece
kontrol HTML server kontrolü haline getirilir.

<INPUT type=”button” id=”button1” runat=”server” value=”Bu Bir Html Button” >

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.

<asp:TextBox runat=”server” id=”giris” Text=”Hoş Geldiniz”>


</asp:TextBox>

Bu kontrollerin avantajları aşağıdaki gibidir.

• Benzer kontrollere düzenli biçimde isimler verilir.


• Tüm kontroller aynı genel özelliklere sahiptir.
• Tarayıcı için özel kodlar kendiliğinden üretilir.

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.

İlişkisel Liste Tabanlı Kontroller

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" />

Bu kontrol, Internet Explorer tarayıcısında şu şekilde gösterilir.


<span style="font-style:italic;">Label Control</span>
Özellikler :

AccessKey With Font-Italic Font-Underline


BackColor Visible Font-Name ForeColor
BorderColor CssClass Font-Names Height
BorderStyle Enabled Font-Overline ID
BorderWidth EnableViewState Font-Size Runat
MaxLength Font-Bold Font-Strikeout TabIndex

Olaylar :

15
OnDataBinding OnDisposed OnPreRender
OnInit OnLoad OnUnload

Aşağıdaki örnekte Label kontrolünün Text ve Size özelliğini TextBox’lara girilen


değerlere göre değişiklik yapılıyor.

<%@ Page language="c#" Debug="true"%>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML> <HEAD>
<title>WebForm1</title>
<script runat="server">

private void tikla(object sender, System.EventArgs e)


{
Label3.Text=TextBox1.Text;
Label3.Font.Size=Convert.ToInt32(TextBox2.Text);
}
</script>
<meta content="Microsoft Visual Studio .NET 7.1"
name="GENERATOR">
<meta content="C#" name="CODE_LANGUAGE">
<meta content="JavaScript" name="vs_defaultClientScript">
<meta content=http://schemas.microsoft.com/intellisense/ie5
name="vs_targetSchema">
</HEAD><body>
<form id="Form1" method="post" runat="server">

<asp:textbox id="TextBox1" style="Z-INDEX: 101; LEFT: 136px;


POSITION: absolute; TOP: 32px" runat="server"
Width="136px"></asp:textbox>

<asp:textbox id="TextBox2" style="Z-INDEX: 105; LEFT: 136px;


POSITION: absolute; TOP: 72px" runat="server"
Width="136px"></asp:textbox>

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>

<asp:label id="Label2" style="Z-INDEX: 102; LEFT: 32px;


POSITION: absolute; TOP: 32px" runat="server"Width="96px"
Height="16px" BackColor="White">Adınızı Giriniz </asp:label>

<asp:button id="Button1" style="Z-INDEX: 103; LEFT: 192px;


POSITION: absolute; TOP: 112px" onclick="tikla" runat="server"
Width="80px" Height="24px" Text="Uygula"></asp:button>

<asp:label id="Label3" style="Z-INDEX: 106; LEFT: 32px;


POSITION: absolute; TOP: 176px" runat="server" Width="232px"
Height="24px"></asp:label>
</form></body></HTML>

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">

Bu kontrol, Internet Explorer tarayıcısında şu şekilde gösterilir.

<input name="userName" id="Text1" type="text" />

Web kontroller, WebControl sınıfından türemişlerdir. Bu yüzden Web kontroller BackColor,


BorderColor, Enabled, Font, Height, Width özelliklerine sahiptir.

Özellikler :

AccessKey AutoPostBack Font-Italic Font-Underline


BackColor Columns Font-Name ForeColor
BorderColor CssClass Font-Names Height
BorderStyle Enabled Font-Overline ID
BorderWidth EnableViewState Font-Size Runat
MaxLength Font-Bold Font-Strikeout TabIndex
TextMode Visible With Wrap
Rows

Olaylar :

TextChanged OnDisposed OnPreRender OnDataBinding


OnInit OnLoad OnUnload

Button
Button, form üzerindeki olayları sunucuya yollamak için kullanılır. En sık kullanılan onay
kontroludür.

Örnekte Dugme1 isimli button tıklandığında, Label kontrolune mesaj yazılır.

<asp:Button id="Dugme1" runat="server" Text="Tıklayınız"


OnClick="Dugme1_Click" runat="server"/>
<span id="Message" runat="server" />

private void Dugme1(object sender, System.EventArgs e)

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 :

OnClick OnDisposed OnPreRender OnDataBinding


OnCommand OnInit OnUnload OnLoad

<%@ Page Language="C#" AutoEventWireup="true"


CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >


<head runat="server"> <title> TextBox</title>
<script runat="server">

private void kapa(object sender, System.EventArgs e)


{
Button1.Enabled=false;
}
private void gizle(object sender, System.EventArgs e)
{
Button1.Visible=false;
}
private void kalin(object sender, System.EventArgs e)
{
Button1.Font.Bold=true;
}
private void geri(object sender, System.EventArgs e)
{
Button1.Font.Bold=false;
Button1.Visible=true;
Button1.Enabled=true; }
</script></head>
<body>

19
<form id="form1" runat="server">

<asp:Button id="Button1" style="Z-INDEX: 100; LEFT: 128px;


POSITION: absolute; TOP: 32px" runat="server" Text="Test Butonu"
Width="96px" Height="32px"></asp:Button>
<asp:Button id="Button7" style="Z-INDEX: 107; LEFT: 112px;
POSITION: absolute; TOP: 176px" runat="server" Text="İşlemleri Geri
Al" Width="128px" Height="32px" BorderStyle="Inset"
BackColor="#00cc99" OnClick="geri"></asp:Button>

<asp:Button id="Button2" style="Z-INDEX: 102; LEFT: 224px; POSITION:


absolute; TOP: 112px" runat="server" BackColor="#00cc99"
BorderStyle="Ridge" Text="Gizle" Width="72px" Height="32px"
OnClick="gizle"></asp:Button>

<asp:Button id="Button3" style="Z-INDEX: 103; LEFT: 40px; POSITION:


absolute; TOP: 112px" runat="server" BackColor="#00cc99"
BorderStyle="Ridge" Text="Kapa" Width="80px" Height="32px"
OnClick="kapa"></asp:Button>

<asp:Button id="Button4" style="Z-INDEX: 104; LEFT: 136px; POSITION:


absolute; TOP: 112px" runat="server" BackColor="#00cc99" Text="Kalın"
Width="72px" Height="32px" BorderStyle="Ridge"
OnClick="kalin"></asp:Button>

</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.

<%@ Page Language="C#" AutoEventWireup="true"


CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >


<head runat="server">
<title> TextBox</title>
<script runat="server">

void Check_Clicked(Object Sender, EventArgs e) {


if(checkbox1.Checked )
{
Message.InnerHtml="Seçili" ;
}
else
{
Message.InnerHtml="Seçili Değil" ;

</script>

</head>
<body>
<span id="Message" runat="server" />

<form id="form1" runat="server">

<asp:CheckBox id="checkbox1" runat="server"


AutoPostBack="True"
Text="Üye Olmak İster misiniz?"
TextAlign="Right"
OnCheckedChanged="Check_Clicked"/>
<br>

</form>
</body>
</html>

21
Uygulama: Aşağıda verilen ekran görüntüsüne ait programı
yazınız.

private void tikla(object sender, System.EventArgs e)


{
Label3.Font.Bold = false;
Label3.Font.Italic = false;
Label3.Font.Underline = false;
Label3.Text = TextBox1.Text;
Label3.Font.Size = Convert.ToInt32(TextBox2.Text);
if (CheckBoxList1.Items[0].Selected == true)
{ Label3.Font.Bold = true; }

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

RadioButton, CheckBox kontrolüne benzerlik gösterir. Ancak RadioButton kontrolunun


GroupName özelliği ile, birden fazla RadioButton arasında grup oluşturulur. Aynı grup
içerisinden sadece bir RadioButton seçilebilir. Birden fazla seçeneğin işaretlenmesine izin
verilmez. Onay kutusunun durumu Checked metodu ile takip edilebilir.

Ö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.

<%@ Page Language="C#" AutoEventWireup="true"


CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >


<head runat="server">
<title> RadioButton</title>
<script runat="server">

void BtnOnay_Clicked(Object Sender,EventArgs e)


{
if (Radio1.Checked)
{
Message.InnerHtml = "Seçiminiz" + Radio1.Text;
}
else if (Radio2.Checked)
{
Message.InnerHtml = " Seçiminiz " + Radio2.Text;
}
else if (Radio3.Checked)
{
Message.InnerHtml = " Seçiminiz " + Radio3.Text;

23
}
}

</script>

</head>
<body>
<span id="Message" runat="server" />

<form id="form1" runat="server">

<h4>Beğendiğiniz müzik türünü seçiniz:</h4>

<asp:RadioButton id=Radio1 Text="Pop" Checked="True"


GroupName="muzik" runat="server"/>
<br />
<asp:RadioButton id=Radio2 Text="Jazz" GroupName="muzik"
runat="server" />
<br />
<asp:RadioButton id=Radio3 Text="Classic" GroupName="muzik"
runat="server" />
<br />
<asp:button Text="Seçiniz" id="BtnOnay" OnClick="BtnOnay_Clicked"
runat="server" />
<br />
<br />

</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"; }
}

Görüldüğü gibi bu çalışma da sadece bir seçenek işaretlenebilmektedir. Diger örneklerin


çoğunda olduğu gibi metoduzu butonun “onclick” özelliğini kullanarak çalıştırmaktayız. Seçim
işleminide RadioButtonList’in “RadioButtonList1.SelectedItem.Text” özelliğini kullanarak
yapmaktayı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.

<asp:Image id="Image1" runat="server" AlternateText="Logomuz"


ImageAlign="left" ImageUrl="logo.gif"/>

ImageButton
ImageButton resimli button kontroludur. Örnekte ImageButton kullanımı gösterilmektedir.

void ImageButton_Click(object Source,ImageClickEventArgs e)


{
Message.InnerHtml="Resimli Düğme kontrolünü Tıkladınız" +
"Koordinatlar: (" & e.X.ToString() + ", " +
e.Y.ToString() & ")" ;
}
<asp:ImageButton id="imagebutton1" runat="server"
AlternateText="Resimli Düğme Kontrolü"
ImageAlign="right"
ImageUrl="image1.gif"
OnClick="ImageButton_Click"/>
<br><br>

26
<span id="Message" runat="server"/>

ImageButton kontrolünün ImageClickEventArgs argüman nesnesi kullanarak, kontrolün


bulunduğu yerin koordinat değerleri alınabilir.

LinkButton

LinkButton, HyperLink görünümlü Button kontrolüdür. LinkButton kontrolünün HyperLink


kontrolünden farkı ise olaylarının olmasıdır. Örnekte LinkButton kullanımı gösterilmektedir.

void LinkButton1_Click(Object sender,EventArgs e)


{
Label1.Text="Link Button’a tıkladınız" ;
}

<asp:LinkButton Text="Mesajı Görmek İçin Tıklayınız."


Font-Name="Verdana" Font-Size="14pt"
onclick="LinkButton1_Click" runat="server"/>

<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.

void Button_Click(object sender, EventArgs e)


{
Label1.Text = "Konuştuğunuz Dil " +
dropdownlist1.SelectedItem.Text + "." ;
}

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"/>

ListItem etiketi içindeki değerler, DropDownList öğelerini temsil eder.

Örnekte DropDownList kontrolune çalışma zamanında öğe eklenmektedir.

<asp:DropDownList id="DropDownList1" style="Z-INDEX: 101; LEFT: 128px; POSITION:


absolute; TOP: 160px" runat="server" Width="152px"/>

void Page_Load(System.Object sender, System.EventArgs e)


{
for (int i=0;i<=5;i++)
{
DropDownList1.Items.Add(i.ToString);
}
}
Çalışma zamanında eleman eklemek için, Items koleksiyonunun Add metodu kullanılır.
( Not: position:absolute|reletive; (elemanların sayfa içerisine yerleşimi)
 absolute: sayfanın en başından geçerli noktayı alır.
 reletive: sayfanın en son yazılan elamanının bulunduğu noktayı başlangıç
olarak alır.
top: belirlenen başlangıç noktasından belirtilen pixel kadar aşağı yazar.
left: başlangıç noktasında sağa doğru belirtilen pixel kadar uzaklığa yazar.
width: yazılacak yazı için maksimum genişlik belirler ve bu genişlik aşıldığı zaman bir alt
satıra geçer.
z-index parametresi derinlik olarak yeni stile bir değer verir. İki stil hazırladığımızda z-index
değeri büyük olan üstte görünecektir.)

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;
}
}

DropDownList kontrolünün “OnSelectedIndexChanged” olayını kullanılarak secim


metodu çalıştırılır ve yazının fontu ayarlanır.

29
ListBox

ListBox, DropDownList kontrolüne benzer. Elemanlar liste halinde gösterilir ve SelectionMode


özelliğine Multiple değeri atanarak, çoklu seçim yapma imkânı sağlanır. Örnekte ListBox
kontrolunün çoklu seçim özelliği kullanılmaktadır. ListBox kontrolu içerisinde seçilen tüm
elemanlar Label kontrolune yazıdırılır.

public void SubmitBtn_Click(object sender, EventArgs e)


{
Message.Text = "";

foreach (ListItem i in ListBox1.Items)


{
if (i.Selected == true)
{
Message.Text += i.Text + " ";

}
}
}

<asp:ListBox id=ListBox1 Rows=4 SelectionMode="Multiple" Width="100px"


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:ListBox>
<br />
<asp:button ID="Submit" Text="Submit" OnClick="SubmitBtn_Click"
runat="server" />
<br />
<asp:Label id="Message" runat="server"/>

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" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >


<head runat="server">
<title> Panel</title>
<script runat="server">

public void Button1_Click(object sender, EventArgs e)


{ // Label kontrolü oluşturalım
Label label; label = new Label(); label.Text = "Etiket";
label.ID = "Label1"; Panel1.Controls.Add(label);
Panel1.Visible = true;
}

</script>

32
</head>
<body>

<form id="form1" runat="server">

<asp:Panel id="Panel1" runat="server" BackColor="yellow"


Height="150px" Width="200px" Visible=false>
Panel1 <p> </asp:Panel>
<asp:Button id="Button1" onClick="Button1_Click"
Text="Panel’i Göster" runat="server"/>
</form>
</body>
</html>

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.

private void gizle(object sender, System.EventArgs e)


{ Panel1.Visible = false; }

private void goster(object sender, System.EventArgs e)


{ Panel1.Visible = true; }

33
Butonların OnClick özelliği metotlara yönlendirildiğinde panellerin nasıl gizlenip
görüntülendiğini görebilirsiniz.

Table

Table, satırlarına ve sütunlarına programlama yoluyla müdahale edilebilen tablo kontroldür.


Table kontrolü içinde TableRow ve TableCell nesneleri kullanılır. TableCell, tabloda bir
hücreyi temsil eder. TableRow ise tabloda bir satırı temsil eder.

Örnekte Tabel kullanımı gösterilmektedir.


protected void Page_Load(object sender, EventArgs e)
{
//Satır ve Sütun Oluşumu
int nrows = 3;
int ncells = 2;
int i;
int j;
for (j = 0; j <= nrows - 1; j++)
{
TableRow r;
r = new TableRow();
for (i = 1; i <= ncells; i++)
{
TableCell c;
c = new TableCell();

34
c.Controls.Add(new LiteralControl("Satır " +
j.ToString() + ", hücre " + i.ToString()));
r.Cells.Add(c);
}
Table1.Rows.Add(r);

}
}

<asp:Table id="Table1" GridLines="Both"


HorizontalAlign="Center" Font-Name="Verdana"
Font-Size="8pt" CellPadding=15 CellSpacing=0
Runat="server"/>

<%@ Page Language="C#" AutoEventWireup="true"


CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >


<head runat="server">
<title> Tablo</title>
<script runat="server">
private void olustur(object sender, System.EventArgs e)
{
int satir,sutun;
TableRow s;
TableCell hucre;
satir=int.Parse(ListBox1.SelectedItem.Value);
sutun=int.Parse(ListBox2.SelectedItem.Value);

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>

<form id="Form1" method="post" runat="server">

<asp:listbox id="ListBox1" style="Z-INDEX: 101; LEFT: 104px;


POSITION: absolute; TOP: 192px" runat="server" Width="80px"
Height="96px">
<asp:ListItem Value="1">1</asp:ListItem>
<asp:ListItem Value="2">2</asp:ListItem>
<asp:ListItem Value="3">3</asp:ListItem>
<asp:ListItem Value="4">4</asp:ListItem>
</asp:listbox>

<asp:label id="Label2" style="Z-INDEX: 104; LEFT: 208px; POSITION:


absolute; TOP: 248px" runat="server" Width="160px" Height="32px">Sütun
Sayısı:</asp:label>

<asp:listbox id="ListBox2" style="Z-INDEX: 102; LEFT: 320px; POSITION:


absolute; TOP: 192px" runat="server" Width="80px" Height="96px">
<asp:ListItem Value="1">1</asp:ListItem>
<asp:ListItem Value="2">2</asp:ListItem>
<asp:ListItem Value="3">3</asp:ListItem>
<asp:ListItem Value="4">4</asp:ListItem>
</asp:listbox>&nbsp;

<asp:Label id="Label1" style="Z-INDEX: 103; LEFT: 16px; POSITION:


absolute; TOP: 248px" runat="server" Width="160px"
Height="32px">Satır Sayısı:</asp:Label>

<asp:Button id="Button1" style="Z-INDEX: 105; LEFT: 56px; POSITION:


absolute; TOP: 312px" runat="server" Width="128px" Text="Tablo
oluştur" OnClick="olustur"></asp:Button>

<asp:Table id="Table1" style="Z-INDEX: 106; LEFT: 56px; POSITION:


absolute; TOP: 24px" runat="server" Width="384px" Height="136px"
BackColor="#E0E0E0" BorderStyle="Double" BorderColor="White"
ForeColor="#FF8080" BorderWidth="2">

<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.

Validation Kontroller Görevi


RequiredFieldValidator Bir kontrol içerisine değer girilipgirilmediğini
kontrol eder. Veri girilmesi zorunlu alanlarda
kullanılır.
CompareValidator Kontrol içerisine girilen değeri, sabit değerle
veya başka bir kontrole girilen değerle
karşılaştırır.
RangeValidator Kontrol içerisine girilen değerin, İki sabit
değer arasında olmasını sağlar.
RegularExpressionValidator Bir kontrol içerisine girilen değerin, istenilen
formatta girilmesini sağlar.

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.

Doğrulama kontrollerinin ortak özellikleri aşağıdaki gibidir.

• ControlToValidate: Hangi kontrolün doğrulanacağını belirtir.


• ErrorMessage: Geçerli giriş yapılmamışsa görüntülenecek hata mesajını verir.
• Text: ErrorMessage ve Text özelliği birlikte kullanılabilir. Bu durumunda Text özelliğindeki
mesaj görüntülenir. Doğrulama kontrollerin ErrorMessage özelliğine girilen tüm mesajlar
ValidationSummary içerisinde listelenir.
• Display: Validation kontrolün nasıl görüntüleneceği bilgisini tutar. Static, Dynamic ve None
değerleri alır.

RequiredFieldValidator

RequiredFieldValidator, belirtilen kontrolün boş geçilmemesini sağlar. Doğrulama yapılacak


web kontrolünün ismi ControlToValidate özelliğine girilir Geçerli giriş yapılmadığında ortaya
çıkacak hata mesajı ErrorMessage özelliği ile belirtilir.

Örnekte RequiredFieldValidator kullanımı gösterilmektedir.

<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.

Örnekte txtYas kontrolünün değeri txtKontrol değerinden büyük olmalıdı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

Kontrol içerisine girilen değerin, istenilen formatta girilmesini sağlar. ValidationExpression


özelliğine girilen özel karakterler ile veri giriş formatı sağlanır. Bu özel karakterler Tablo da
gösterilmektedir. Örnekte RegularExpressionValidator kontrolu ile txtMail metin kutusu için
geçerli e-mail girişi sağlanmaktadır.

<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+)*">

\w+ : En az bir karakter içeren metin anlamına gelir.


([-+.]) : -, +, . karakterlerinden herhangi biri anlamına gelir.
* : 0’dan n’e kadar bir değer girilmesi gerektiği anlamına gelir.
@ : @ işaretinin kullanılması gerektiğini belirtir.

Örnekte ValidationExpression özelliğine girilen özel karakterler ile e-mail formatı


oluşturulmaktadır.
ValidationExpression =“\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.

public void CustomValidator_SunucuKontrol(object s,


ServerValidateEventArgs e)
{

ServerValidateEventArgs parametresinin iki özelliği vardı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.

CustomValidator, kredi kart numaralarının doğruluğu kontrol etmek için kullanılabilir.


Örnekte metin kutusuna girilen değerin çift olması kontrol edilmektedir. CustomValidator
kontrolunun HTML kodları aşağıdaki gibidir.

<form id="Form1" method="post" runat="server">

<asp:Button id="Button1" style="Z-INDEX: 101; LEFT: 200px; POSITION:


absolute; TOP: 96px" runat="server" Text="gonder"
onClick=”gonder_OnClick”> </asp:Button>

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>

<asp:TextBox id="txtmessage" style="Z-INDEX: 103; LEFT: 200px;


POSITION: absolute; TOP: 152px" runat="server"> </asp:TextBox>

<asp:TextBox id="txtcustom" style="Z-INDEX: 104; LEFT: 144px;


POSITION: absolute; TOP: 64px" runat="server"> </asp:TextBox>

</form>
CustomValidator kontrolunun C# kodları aşağıdaki gibidir.
public void ServerKontrol(object source,ServerValidateEventArgs args)
{
try
{

int num = int.Parse(args.Value);


args.IsValid = ((num % 2) == 0);

}
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.

<asp:ValidationSummary id="ValidationSummary1" style="Z-INDEX: 114; LEFT: 72px;


POSITION: absolute; TOP: 336px" runat="server" HeaderText="Hatalar">
</asp:ValidationSummary>

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.

Örnekte AdRotator kullanımı için gerekli XML dosya (Ads.Xml) gösterilmektedir.

<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>

Ad: Her bir banner nesnesini temsil eder.


ImageUrl: Banner içerisinde görüntülenecek resim dosyasını belirtir.
NavigateUrl: Gidilecek sayfanın adres bilgisini belirtir.
AlternateText: Resime alternatif metin göstermek için kullanılır.
Impression: -Banner resimlerinin uygulama süresini belirtir.
Keyword:.Banner nesneleri arasında filtreleme oluşturacak kategori adını belirler.

AdRotator kontrolünün AdvertisementFile özelliği, reklâm bilgilerinin bulunduğu XML


dosyayı içerir. KeywordFilter özelliği ise reklâmların filtrelenerek görüntülenmesini sağlar.

Calendar
Calendar, web sayları üzerinde Takvim göstermek için kullanılır.

Örnekte Calender kullanımı gösterilmektedir.

<asp:Calendar id=”takvim” runat=”server”/>


Calendar kontrolüne ait özellikler tabloda listelenmiştir.

Ö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.

Örnekte Calender kullanımı gösterilmektedir.

<asp:Calendar id="Calendar1" style="Z-INDEX: 105; LEFT: 160px; POSITION: absolute;


TOP: 248px" runat="server" CellSpacing="2" Width="240px" Height="152px"
BorderStyle="Groove" DayNameFormat="Full" NextPrevFormat="FullMonth">
<DayStyle Font-Bold="True" HorizontalAlign="Center" BorderStyle="None"
BorderColor="Transparent" VerticalAlign="Top" BackColor="LightCyan"> </DayStyle>
<DayHeaderStyle Font-Underline="True" Font-Italic="True" HorizontalAlign="Right"
BorderWidth="3px" ForeColor="DarkBlue" BorderStyle="Groove"
BorderColor="#C0FFFF" VerticalAlign="Top" BackColor="#FFC0FF">
</DayHeaderStyle>
<WeekendDayStyle BackColor="Salmon"></WeekendDayStyle>
</asp:Calendar>

Ö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">

<asp:Calendar id="Calendar1" style="Z-INDEX: 101; LEFT:


96px; POSITION: absolute; TOP: 24px" runat="server"
Width="472px" Height="272px" OnSelectionChanged="tarih_secimi"
SelectedDate="6/6/2006" DayNameFormat="full"

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.

AutoPostBack özelliği, DropDownList, ListBox, CheckBox, CheckBoxList, RadioButton,


RadioButtonList, TextBox ve Button kontrolünde bulunur.

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.

<%@ Page Language="C#" AutoEventWireup="true"


CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >


<head runat="server">
<title> Tablo</title>

</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;

public partial class _Default : System.Web.UI.Page


{
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{

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;
}

AutoPostBack özelliğininin gereksiz yere kullanılması performansı olumsuz yönde etkiler.

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.

Örnekte ViewState kullanımı gösterilmektedir.

<input type="hidden" name="__VIEWSTATE"


value="dDwtMTY5NzI1NjkxNzs7Po5lYTu9gAdJkhGyy1Rw1gGcc+ia" />

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.

Kullanıcı formu geçerlilik kriterlerini karşılamadan gönderdiği durumda formu yeniden


görüntülemek ve hatanın ne olduğunu göstermek isteyebiliri. ASP.NET’te iç kod yazmadan
geçerlilik denetleyicisi(Validator) kullanarak bir çok geçerlilik denetimini gerçekleştirebiliriz.

İstemci Taraflı Geçerlilik Denetimi

Ş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.

Özellik: kulaniciadivalidator sifrevalidator

ControlToValidate TextBox1 TextBox2

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}

Display Dynamic Dnamic

EnableClientScript true true

Bu işlemleri tamamladıktan sonra programımızı çalıştırdığımızda aşağıdaki gibi bir


ekran görüntüsü elde ederiz.

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.

Inline Kod Yazmak

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>

Code-Behind Kod Yazmak

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.

Code-behind sayfasının.aspx sayfasıyla birlikte çalışabilmesi için, .aspx sayfasının Page


bildiriminde, CodeBehind ve Src özelliklerine ilgili değerlerin girilmesi gerekir.

WebForm.aspx - Code-behind kod yazmak

<%@ Page Language="c#" AutoEventWireup="false"


Codebehind="WebForm1.aspx.cs"
Inherits="ilkAspNet.WebForm1"%>
<HTML>
<HEAD>
<title>BilgeAdam</title>
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<asp:TextBox id="txtAd" runat="server"/>
<asp:Button id="btnGonder" runat="server"
Text="Gönder"></asp:Button>
<asp:Label id="lblMesaj" runat="server"></asp:Label>
</form>
</body>
</HTML>

WebForm.aspx.cs – Code-Behind Sayfası

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 Page_Load(object sender, System.EventArgs e)


{
Response.Write("Selam");

}
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(İstemci Taraflı) Olay Prosedürleri

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(Sunucu Taraflı) Olay Prosedürleri

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.

Server-side olay prosedürleri için aşağıdaki tanımlama yapılır.

<SCRIPT language=”c#” runat=”server”>

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.

Olay prosedürleri kontrolun ID özelliğine girilen değerden faydalanarak oluşturulur. Handles


anahtar sözcüğü kontrolün hangi olay ile ilişkilendirileceğini belirler. Handles anahtar sözcüğü
ile tek bir olay için birden fazla olay prosedürü oluşturulabilir.

Ö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.

Olay prosedürlerine iki parametre girilmelidir.


• Sender: Olayı tetikleyen kontrol nesnesidir.
• EventArgs: Olaya özgü parametreleri içeren nesnedir.

Olay Prosedürlerinde Kontrollerle Etkileşim

Web uygulamalarında, genellikle kontrollerden veri alma ve kontrollere veri gönderme


işlemlerine ihtiyaç duyulur. Server-side olay prosedürleri bu tür zor işlemlerin kolayca
yapılmasını sağlar.

Ö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” />

private void Page_Load(System.Object sender, System.EventArgs e)


{
Button1.Click +=new EventHandler(btn1_Click);
}

private void btn1_Click (ByVal sender As System.Object, _ ByVal e As System.EventArgs)


{
string mesaj = “Merhaba ” + txtAd.Text.ToString();
lblMesaj.Text = Mesaj;
}

SAYFA YAŞAM DÖNGÜSÜ

Bir ASP.NET sayfası belirli olaylar sırası ile çalışır. Bu sıraya “Sayfa Yaşam Döngüsü” denir

Bu döngü olayları aşağıdaki sırada gerçekleşir.

1- Page_Init (Page Initialize – Sayfanın oluşmaya başlaması): Bu aşamada sayfa başlatılır


ve sayfadaki kontroller oluşturulur.
2- Page_Load (Sayfanın yüklenmesi): Bu olay, sayfa yüklendiği zaman tetiklenir.
3- Control Events (Kullanıcı kontrol olayları): Click ve Change olaylarıdır. Bu olaylar
kontrollerin tıklanması veya kontrol değerlerinin değişimi ile tetiklenir. TxtAd_Changed ve
Btn1_Click gibi.
4- Page_Unload (Sayfanın Kapanması): Bu olay, sayfa kapandığı zaman
tetiklenir.

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İ

Sunucuya veri gönderme işlemine “postback” denir. Örneğin Button kontrolü


tıklanınca otomatik olarak sunucuya veri yollanır.

Varsayılan olarak veri yollayan tek kontrol Button kontrolüdür. Diğer kontroller
için AutoPostBack özelliğinin True yapılması gerekir.

Örnekte DropDownList kontrolunun AutoPostBack özelliğine True değeri


girilmiştir. Bu durum liste kutusundan seçilen değerin sunucuya gönderilmesini
sağlar.
Kod: DropDownList Kontrolunun Sunucuya Gönderilmesi
<asp:DropDownList id="DropDownList1"
runat="server" AutoPostBack=”True”>
<asp:ListItem>Türkçe </asp:ListItem>
<asp:ListItem>İngilizce</asp:ListItem>
</asp:DropDownList>

<asp:TextBox id=”mesaj” runat=”server”/>

private void DropDownList1_SelectedIndexChanged(object


sender, System.EventArgs e)
{
mesaj.Text = DropDownList1.SelectedItem.Value;
}

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
}

Örnek Dinamik resim oluşturma

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.

Bu örnek sayfada, kullanıcının metin kutusuna girdiği metni yakalamak istiyoruz.


Dolayısıyla kodumuz If yapısının alt kısmına gidecektir. Page_Load olayına eklememiz gereken
kod aşağıdaki gibi olmalıdır. Dikkat edilmesi gereken program büyük küçük harflere duyarlıdır.

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;

public partial class _Default : System.Web.UI.Page


{
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
Response.ContentType = "image/gif";
getImage(TextBox1.Text).Save(Response.OutputStream,S
ystem.Drawing.Imaging.ImageFormat.Gif);
Response.End();
}
Response.Write("Sayfa Gönderilmeden önce<br>");

private static Bitmap getImage(string s)


{
Bitmap b=new Bitmap(1,1);

int yukseklik,genislik;

Font yazifontu=new Font("Times New


Roman",24,System.Drawing.GraphicsUnit.Point);

Graphics grafik=Graphics.FromImage(b);
genislik=(int)
grafik.MeasureString(s,yazifontu).Width;
yukseklik=(int)
grafik.MeasureString(s,yazifontu).Height;

b=new Bitmap(b,new Size(genislik,yukseklik));


grafik=Graphics.FromImage(b);
grafik.Clear(Color.Black);

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.

 Sonucun Tarayıcıda İzlenmesi

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.

Çıktı 2 : Dinamik resim örneğinin çıktısı

66
RESPONSE VE REQUEST NESNESİ

İstek (Request) ve Cevap (Response)


İnternette web sayfalarının görüntülenmesi için kullanıcının, web sunucusundan (server)
bir istek yapması ve sunucunun da bu isteğe karşılık vermesi gerekmektedir. Bildiğimiz gibi
kullanıcı bu isteğini, tarayıcısından (browser) ziyaret etmek istediği web sayfasının adresini
yazarak yapar.

İstek (Request)

Kullanıcı (Client) http:// WEB

BROWSER Sunucu (Server)


cevap (Response)

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;

<%@ Page Language="C#" AutoEventWireup="true"


CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >


<head runat="server">
<title>Dinamik Sayfa Örneği</title>
</head>
<body>

67
<form id="form1" runat="server">
<div lang="tr" title="Dinamik Sayfa Örneği">
<br />
<br />
&nbsp;
<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" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >


<head runat="server">
<title>Dinamik Sayfa Örneği</title>
</head>
<body>
<form id="form1" runat="server">
<div lang="tr" title="Dinamik Sayfa Örneği">
<br />
<br />
<%Response.Write("Bu sayfa aşağıda belirtilen sayfayı
yükleyecektir");
Response.Redirect("yonlendirilen.aspx");%>

&nbsp;

</form>
</body>
</html>

yonlendirilen.aspx”de şöyle olsun;

70
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="yonlendirilen.aspx.cs" Inherits="yonlendirilen" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >


<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<%Response.Write ("<h4> Bu sayfa, bir önceki redirect.asp
sayfasının çalıştırılması ile görüntülenmiştir</h4>"); %>
</div>
</form>
</body>
</html>

“redirect.aspx” sayfamızı çalıştırdığımızda, Response.Write ile yazılan ifadeyi göremeyeceğiz,


çünkü, ASP.Net response.write dan hemen sonraki ifadeyi çalıştırmıştır.

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.

1. <%@ Page Language="C#" AutoEventWireup="true"


CodeFile="Default.aspx.cs" Inherits="_Default" %>

72
2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-
transitional.dtd">

3. <html xmlns="http://www.w3.org/1999/xhtml" >


4. <head runat="server">
5. </head>
6. <body>
7. <% Response.Buffer = true;%>
8. <p>Bu satır sunucunun tampon (buffer) hafızasında saklanan
ilk satır.
9. bu satırdan sonraki Response.Clear ile ne yazık ki
silinecek ve sayfada gözükmeyecek
10. <% Response.Clear();%>
11. <p>Bu yazı Clear metodundan sonra gösterilmiştir</p>
12. </body>
13. </html>
10.satırdaki komut ile sunucunun tampon hafızası silinmiş ve ziyaretçiye bu satırdan sonraki,
sayfanın değerleri gönderilecektir.

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;

Sayfa İçin Code-Behind’in Yazılması

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" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >


<head runat="server">
<title></title>
</head>
<body>

</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;

public partial class _Default : System.Web.UI.Page


{
protected void Page_Load(object sender, EventArgs e)
{
1. Response.Write("Şu an gördüğünüz yazı, flush metodu
ile browser‘a hemen gönderilecek. <br />");
2. Response.Flush();
3. Response.Write("Bu yazı hiçbir zaman brovser’da
gözükmeyecek, çünkü devam eden response.clear satırı
ile tampon hafızadan silinecek.<br/>");

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/>");

}
}

flush_clear_end.aspx sayfamızın kaynak kodlarındaki “Response.Write” ile sayfaya yazdırılmak


istenen 3. ve 7. satırlar, sayfada gözükmemektedir.

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

Sunucu sayfaları gönderdiğinde, bu sayfalar ziyaretçinin bilgisayarında geçici bir


bellekte (chace) saklanır. Browser ilk önce, adreste belirtilen sayfayı bu bellekte arar ve bulursa
görüntüler. Burada amaç “hız”dır. Ancak bazen sayfanın her seferinde sunucudan gönderilmesi
gerekebilir. Sunucuda belki birtakım değişkenlerin değeri değişecek, ya da birtakım
güncellemeler yapılıyor olabilecektir. Bu durumda sayfaların ziyaretçinin bilgisayarındaki geçi-
ci bellekte saklanmasını engellememiz gerekir. Bunu “expires” özelliği ile sağlayabiliriz.
Response.Expires ‘da verilen değerler saniye cinsindendir.

<%@ Page Language="C#" AutoEventWireup="true"


CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<% Response.Expires = 0;%>


<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title></title>
</head>
<body>

<p>Bu sayfa geçici bellekte saklanmayacak,


her seferinde sunucudan gönderilecektir.</p>

</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.

<%@ Page Language="C#" AutoEventWireup="true"


CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<% Response.ExpiresAbsolute = new DateTime (2008, 1, 27, 0, 0,
0);%>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title></title>
</head>
<body>

<p>Bu sayfa 1 Haziran 2008 saat 00:00:00 a kadar geçici bellekte


saklanacaktır.</p>

</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" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//TR"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<% Response.Expires = 0;%>


<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title></title>
</head>
<body>

<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

protected void Page_Load(object sender, EventArgs e)


{
// 1. yapı Birden Fazla anahtar kelime
// 1. yol

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.yapı Bir anahtar kelime


//1.yol
Response.Cookies["R"]="Beyaz"; //Hata

//2.Yol
HttpCookie cerez2 = new HttpCookie("sevilenRenk",
"Mavi");
Response.Cookies.Add(cerez2);
}

protected void Button1_Click(object sender, EventArgs e)


{
Response.Redirect("yonlendirilen.aspx");
}

80
yonlendirilen.aspx
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="yonlendirilen.aspx.cs" Inherits="yonlendirilen" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//TR"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >


<head runat="server">
<title>Untitled Page</title>
<%Response.Charset = "UTF-8"; %>
</head>
<body>
<form id="form1" runat="server">
<div>
<br />
<asp:Label ID="Label1" runat="server"
Text="Label"></asp:Label><br />
<br />
<br />
<asp:Label ID="Label2" runat="server"
Text="Label"></asp:Label>
<br />
<br />

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"];

HttpCookie cerez2 = Request.Cookies["sevilenRenk"];


//2.yol okuma

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);

Cookie’leri okumak için döngü yapısınıda kullanabilirsiniz;

System.Text.StringBuilder output = new


System.Text.StringBuilder();

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();

HttpResponse Nesnesinin Metotları

Önceden gördüğünüz write metoduna ek olarak, HttpResponse nesnesinin birkaç


kullanışlı metodu daha vardır.

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.

Array Flist=new Array("dosya1.txt","dosa2.txt");


Response.AddFileDependencies(Flist);

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;

byte[] Buffer = new byte[(int)FileSize];


MyFileStream.Read(Buffer, 0, (int)FileSize);
MyFileStream.Close();

Response.Write("<b>Dosya İçeriği: </b>");


Response.BinaryWrite(Buffer);

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();

Response.Write("<b>Dosya İçeriği: </b>");

85
Response.Write("<pre>");
Response.WriteFile(path);
Response.Write("</pre>");
MyFileStream.Close();

Response nesnesi ile Sunucunun, cevap (sayfayı gönderme) biçimlerini belirleyebiliriz.


Yukarıda bu nesnenin en çok kullanılan metot ve özellikleri örnekler ile anlatılmıştır.

Response Nesnesinin Özellik ve Metotlarına Toplu Bir Bakış


Özellikler
Özellikler Açıklama
Buffer Tampon hafızayı yönetmemizi sağlayan bir özeliktir.
CacheControl Çıkışların bir proxy sunucuda saklanmasını kontrol eden
özelliktir.

Charset (Charset name) Karakter set düzenlenmesini sağlar.


ContentType http içerik şeklini set eder. Bazı tipleri “text/html”,”image/gif”,
“image/jpeg”,”text,plain”. Tanımlı olan “text/html”dir.
Expires Sayfanın, kullanıcının bilgisayarında, geçici hafızada saklanıp
saklanamayacağını kontrol eder.
ExpiresAbsolute Expires özelliğine kesin bir tarih belirtir
IsClientConnected Sunucuya herhangi bir ziyaretçinin bağlı olup olmadığını kontrol
eder.
Pics (Pics_label) Resim etiketi ekler ( HTTP Header olarak)
Status Status property serverden gelen status line değeridir. Status değerleri
HTTP olarak tanımlanırlar.

Metotlar

Metot Tarifi

AddHeader(name, value) Belirli bir değere HTML başlığı ekler.


AppendToLog string Sunucu log dosyasına bir string ekler.
BinaryWrite (datatowrite) Binary bir değer yazar.

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.

Response Nesnesini Script İçerisinde Kullanılması

Code-behind ‘de yazdığımız kodları html’in içerisine gömebiliriz. Bunun için


kullanacağımız Visual Studio .NET dillerinden hangisini kullanacağımızı daha önceden
belirlemeliyiz.

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs"


AutoEventWireup="false" Inherits="WebApplication7.WebForm1" %>

Yukarıdaki kodda kullanacağımız dili C# olarak tanımladık. Bu diğer .NET dilerlide


olabilir.

Eğer HTML’nin içerisine kod gömmek istersek bunu <script>….</script> tagları


arasına yazmalıyız. Buna örnek olarak aşağıdaki kodları inceleyiniz.

<%@ Page Language="C#" AutoEventWireup="true"


CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//TR"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<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.

<%@ Page Language="C#" %>

<html>
<head runat="server">
</head>
<body>
<br /> <br />
<% string kategori = Request.QueryString
["kitapkategorisi"];
string kitapismi=Request.QueryString["ismi"];%>

Diğer sayfadan gönderdiğiniz kitap kategorisi değeri:

<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);

QueryString'e diğer sayfadan ulaşmak için Request.QueryString yazılır. QueryString'in


içerisindeki verilere ise indeks veya 'Key' değeri üzerinden şu yöntemler kullanılırarak
ulaşılabilir:

//Key değeri üzerinden ulaşmak için:


string str = Request.QueryString["Key"];
//veya
string str = Request.QueryString.Get("Key");

//Indeks üzerinden ulaşmak için:


string str = Request.QueryString[0];
//veya
string str = Request.QueryString.Get(0);

//Tüm verilere ulaşmak için ise for döngüsü kullanmalıyız. Çünkü QueryString'in
'Request.QueryString.Values' adlı bir property'si bulunmamaktadır.
for (int i = 0; i < Request.QueryString.Count; i++)
{
DropDownList1.Items.Add(Request.QueryString[i]);

91
}

QueryString'de 'Key' değerleri farklı olmak zorunda değildir. 'Key' değerlerinin aynı
olacağı durumlarda şuna dikkat edilmelidir:

//default.aspx.cs

protected void Page_Load(object sender, EventArgs e)


{
Response.Redirect("default2.aspx?1=bir&1=iki&1=üç");
}

//default2.aspx.cs

protected void Page_Load(object sender, EventArgs e)


{
for (int i = 0; i < Request.QueryString.Count; i++)
{
DropDownList1.Items.Add(Request.QueryString[i]);
}
}

Bu şekilde yazdığımız taktirde karşımıza şu sonuç çıkacaktır:

Burada aynı 'Key' değerine sahip veriler tek bir string olarak alınmıştır. Bu string
değerlerini birbirinden ayırmak için GetValues metodu kullanılır:

//default2.aspx.cs

protected void Page_Load(object sender, EventArgs e)


{
foreach (string str in Request.QueryString.GetValues("1")) //GetValues metodu
parametre olarak 'Key' veya indeks almaktadır.
{
DropDownList1.Items.Add(str);
}
}

Böylelikle QueryString içerisindeki aynı 'Key' değerine sahip verileri birbirinden


ayırmış oluruz:

92
Response.Redirect yerine Server.Transfer metodunu kullanmak

Server.Transfer metodu bilindiği üzere tarayıcının bir sayfaya


yönlendirilmesi sırasında tarayıcıdaki URL adresinde bir değişiklik yapmaz.
Dolayısıyla bu metodu kullanmak QueryString'in URL'de görünmemesini
sağlar. Örnek vermek gerekirse 2 adet aspx sayfası açıp, ilkine bir button
ikincisine ise bir Label nesnesi ekleyelim. Code-Behind tarafımız ise şöyle olsun:

//default.aspx.cs

protected void Page_Load(object sender, EventArgs e)


{
}

protected void Button1_Click(object sender, EventArgs e)


{
Server.Transfer("default2.aspx?id=Transfer Metodu", true); //Buradaki ikinci özellik
ise bool bir değer alıp QueryString gibi diğer sayfaya geçebilecek nesnelerinin gönderilip
gönderilmeyeceğini belirtir.
}

//default2.aspx.cs

protected void Page_Load(object sender, EventArgs e)


{
Label1.Text = Request.QueryString.Get(0);
}

Default.aspx sayfamız çalıştırıldığında tarayıcıdaki görüntü ilk başta şöyledir:

Daha sonrasında Button1'e basıldığında ise 2. sayfamız tarayıcıya gelmektedir:

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 eklenemeyen karakerler

QueryString'e '#', '+', '&' gibi bazı semboller eklenirken hatalar olmaktadır. Bu hataları
önlemek için Server.UrlEncode metodu kullanılmalıdır.

protected void Button1_Click(object sender, EventArgs e)


{
string encoded = Server.UrlEncode(TextBox1.Text);
Response.Redirect("default2.aspx?name=" + encoded);
}

Bu metod çalıştırıldığında karakterler QueryString vasıtasıyla


taşınabilecektir. Bu özelliğin kötü yanı QueryString'i uzatmasıdır. Ayrıca bazı
sorunlar da çıkarabilir. Örnek vermek gerekirse '&' karakterinden sonra '#'
karakteri gelirse bazı güvenlik önlemlerinden dolayı (cross-site scripting
attack gibi) ASP.NET hata verebilir.

Request.Querystring ve Form Kullanımı


Querystring ile form değişkenlerini işleyebilmek için, formun “get” metodu ile oluşturulması
gerekiyor. Formdaki diğer önemli parametremiz de querystring değişkenini oluşturacak, form
elemanlarının isimleridir. Zira bir sonraki aşamada querystring bu isim ile form alanındaki
verilen alacaktır. Örneğimizde de böyle bir durum çok basit olarak gösterilmiştir.
Kullanıcının tercihini belirten değişkenler formlar sayesinde alınıp, query.string ile aynı sayfada
veya başka sayfalarda işlenebilir; önce “querystringForm.asp” adında bir form sayfası
oluşturalım:

<%@ Page Language="C#" %>

<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>

<%@ Page Language="C#" %>

<html>

<head id="Head1" runat="server"> </head>


<body>
<% Response.Write ("Merhaba: <b> "+
Request.QueryString["isim"]+ "</b>");

Response.Write ("<br> Bugün nasılsınız?");%>

</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.

Response.Redirect("default2.aspx?isim=" + TextBox1.Text + "&soyisim=" + TextBox2.Text +


"&id=" + TextBox3.Text);

<%@ Page Language="C#" %>

<html >
<head id="Head1" runat="server">
<title></title>

<script runat="server">

protected void Button1_Click(object sender, EventArgs e)


{

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>

<%@ Page Language="C#" %>

<html >

<head id="Head1" runat="server">

</head>
<body>

<%Response.Write ("Merhaba: <b> "+ Request.QueryString["isim"]+


</b>");

Response.Write ("<br> Bugün nasılsınız?"); %>

</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">

protected void Button1_Click(object sender, EventArgs e)


{

Response.Write("Merhaba: <b> " +


Request.QueryString["TextBox1"] + "</b>");

Response.Write("<br> Bugün nasılsınız?");


}

</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)

Request.Form özelliği bir NameValueCollection nesnesi döndürür. Bu nesne


NameObjectCollectionBase den türetilir ve her biri birden fazla değere sahip olabilen anahtarlar
üretir. Bir Web formu, sunucu tarafından çalışan yalnızca tek bir form içerebilir. Ancak formlar
genellikle, <Form> imi içerisinde kümelenmiş her girdi kontrolü için bir adet olmak üzere
birden fazla girdi değeri içerirler. Eğer form aynı ada sahip birden fazla kontrol içerirse tarayıcı
aynı adlı kontrolleri değerlerini içeren virgülle ayrılmış bir liste gönderir. Bundan dolayı form
verileri aslında anahtar-değer çiftlerinden oluşan bir listedir; öyle ki, söz konusu değer tek bir
değer ya da virgülle ayrılmış bir değerler listesi olabilir.

Forms koleksiyonu bu değerler erişmemizi sağlar. Örneğin aşağıdaki formumuz birkaç


girdi kontrolü içermektedir. Code-Behind sayfası içindeki Load olayında yer alan kod,
Request.Form koleksiyonundan tüm form anahtarlarını ve değerlerini alır ve onları tarayıcıda
görüntüler.

Yukarıda verilen örnek Request.Form özelliği kullanarak yapıldığında form metodu “get”
yerine “post” olarak seçilir.

99
default.aspx

<%@ Page Language="C#" %>

<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

<%@ Page Language="C#" %>


<html>

<head id="Head1" runat="server">

</head>
<body>

<% Response.Write ("Merhaba: <b> "+ Request.Form["isim"]


+ "</b>");

Response.Write ("<br> Bugün nasılsınız?");%>

</body>
</html>

ASP. Net formları ile Request.Form özelliğini kullanma;


Default.aspx
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="Default.aspx.cs" Inherits="_Default" %>

<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>

<asp:TextBox id="TextBox1" style="Z-INDEX: 103; LEFT: 217px;


POSITION: absolute; TOP: 161px" runat="server" Width="144px"
Height="26px"></asp:TextBox>
<asp:DropDownList id="DropDownList1" style="Z-INDEX: 104; LEFT:
216px; POSITION: absolute; TOP: 204px" runat="server"
Width="147px" Height="56px"
OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged">
<asp:ListItem Value="ELAZIĞ"></asp:ListItem>
<asp:ListItem Value="MALATYA"></asp:ListItem>
<asp:ListItem Value="SİVAS"></asp:ListItem>
<asp:ListItem Value="RİZE"></asp:ListItem>
</asp:DropDownList>

<asp:RadioButton id="RadioButton1" style="Z-INDEX: 105; LEFT:


216px; POSITION: absolute; TOP: 249px" runat="server"
Width="67px" Height="16px" Text="Evet" Checked="True"
GroupName="secim" ></asp:RadioButton>
<asp:RadioButton id="RadioButton2" style="Z-INDEX: 106; LEFT:
289px; POSITION: absolute; TOP: 247px" runat="server"
Width="92px" Height="24px" Text="Hayır" GroupName="secim"
></asp:RadioButton>

<asp:Button id="Button1" style="Z-INDEX: 107; LEFT: 223px;


POSITION: absolute; TOP: 287px" runat="server" Width="82px"
Height="24px" Text="GİRİŞ" OnClick="Button1_Click"></asp:Button>

</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;

public partial class _Default : System.Web.UI.Page


{
protected void Button1_Click(object sender, EventArgs e)
{
Response.Write("<b>Form Alınan Form değerleri</b><br>");
foreach (String s in Request.Form.AllKeys)
{
if ((s != "__VIEWSTATE")&& (s !=
"__EVENTVALIDATION"))
{
Response.Write(s + "=" + Request.Form.Get(s) +
"<br>");
}
}
// Response.Write(Request.Form["TextBox1"] + "<br>");
}

102
Request.AcceptTypes özelliği (String dizisi)

Request.AcceptTeypesözelliği istemcinin tanıyabileceği bir string tipleri listesini içerir.


Kullanımına örnek olarak istemci tarafından kabul edilen string tiplerini basan aşağıdaki
döngüyü verebiliriz.

<%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ı;
<%

String[] arr = Request.AcceptTypes;


for (int indx = 0; indx < arr.Length; indx++)
{
Response.Write("Accept Type " + indx + ": " + arr[indx] +
"<br>");
}

%>
Çı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 özelliğe çerezlerde denir. Sayfanızın kullanıcı tanımak için sayfaya bağlanan


kullanıcının bilgisayarına ufak bir dosya atmasıdır.

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.

Örneğin tarayıcının kullaniciadi adında bir çerez gönderdiğini varsayalım.


“kullaniciadi” anahtar kelimesini kullanarak Request.Cookies koleksiyonuna erişmek suretiyle
çerezin içeriğini görüntüleyebilirsiniz.

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.

bool keyExists(String aKey)


{
HttpCookieCollection cerez2 = Request.Cookies;
System.Collections.IEnumerator e =
cerez2.GetEnumerator();
while (e.MoveNext())
{
if (e.Current.Equals(aKey))
return (true);
}
return (false);
}

Bunun bir başka yolu da aşağıdaki gibidir.


bool keyExists2(String aKey)
{
int i;
String[] keys;
keys = Request.Cookies.AllKeys;
for (i = 0; i < keys.Length; i++)
{
if (keys[i] == aKey)
return (true);
}
return (false);
}

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

<%@ Page Language="C#" AutoEventWireup="true"


CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//TR"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<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>

Bu webform da dikkat etmemiz gereken butonun onClick olayına “sayfayagit“ metodu


çağırılmıştır.

107
yonlendirilen.aspx

<%@ Page Language="C#" AutoEventWireup="true"


CodeFile="yonlendirilen.aspx.cs" Inherits="yonlendirilen" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//TR"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >

<head id="Head1" runat="server">

<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);
}

bool keyExists2(String aKey)


{
int i;
String[] keys;
keys = Request.Cookies.AllKeys;
for (i = 0; i < keys.Length; i++)
{
if (keys[i] == aKey)
return (true);
}
return (false);
}

</script>
<title>cerezoku</title>
</head>
<body>
</body>
</html>

Response nesnesinin Redirect özelliği ile “yonlendirilen.aspx” sayfası


çağrılmıştır ve oluşturulan çerez okunmuştur.

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;

File = Request.Files; // Load File collection into


HttpFileCollection variable.
a = File.AllKeys; // This will get names of all files into a
string array.
Response.Write(a.Length);
for (int i = 0; i < a.Length; i++)
{
Response.Write("File: " +
Server.HtmlEncode(a[i]) + "<br />");
Response.Write(" size = " +
File[i].ContentLength + "<br />");
Response.Write(" content type = " +
File[i].ContentType + "<br />");
}

Request.Headers Özelliği (NameValue Collection)

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.

Tıpkı Request.Form koleksiyonu gibi, Request.Headers koleksiyonu da


NameValueCollection’dan kalıtımla türetilmiştir.

Aşağıdaki işlemleri gerçekleştirmek için Request.Headers koleksiyonunu kullanabiliriz.

 ContentType başlığını kontrol ederek formu göndermek için kullanılan metodu


belirlemek.
 User-Agent başlığını çözümleyerek istemci tipini belirlemek.
 Content-Length başlığını kontrol ederek form verilerinin büyüklüğünü belirlemek.

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" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >


<head runat="server">
<title>Untitled Page</title>
</head>
<body>

<form id="form1" runat="server">


<div>

</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;

public partial class header : System.Web.UI.Page


{
protected void Page_Load(object sender, EventArgs e)
{
int loop1, loop2;
NameValueCollection coll;

coll = Request.Headers;

String[] arr1 = coll.AllKeys;


for (loop1 = 0; loop1 < arr1.Length; loop1++)
{
Response.Write("Key: " + arr1[loop1] + "<br>");
String[] arr2 = coll.GetValues(arr1[loop1]);
for (loop2 = 0; loop2 < arr2.Length; loop2++)
{
Response.Write("Value " + loop2 + ": " +
Server.HtmlEncode(arr2[loop2]) + "<br>");

111
}
}
}
}

Daha önce oluşturulan cookie bilgileri dahi bu özellik sayesinde öğrenilebilir.

Request.ServerVariables Özelliği (NameValueCollection)

Request.ServerVariables koleksiyonu istemciler tarafından her taleple birlikte


gönderilen çok sayıda kullanışlı değer içerir.

Koleksiyonun kendisi bir standart NameValuecollection’dur. ServerVariables


koleksiyonundan anahtar ve değerleri döndürmek amacıyla standart bir döngü kullanınca bir
öğe listesi göreceksiniz. Formun örnek kodunu yükleyerek bu değerlerin sizin tarayıcınıza
uygulandığını da göreceksiniz.

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.

APPL_PHYSICAL_PATH Uygulamanızın fiziksel dizin yolu


LOCAL_ADDR Uygulamanıza ev sahipliği yapan IP adresi.
LOGON_USER Tarayıcıyı kullanan kişin ağ kullanıcı adıdır.
PATH_INFO Talep edilen dosyanın tam fiziksel dizin yolu.
SERVER_NAME Kullanıcı tarafından talep edilen sunucunun adı.
SERVER_PORT IP port numarası.
HTTP_USER_AGENT Talepte bulunan istemcinin markası ve sürümü.

Asp’nin önceki sürümlerinde Request.ServerVariables koleksiyonu yavaştı. Fakat bu


sorun ASP.NET’te giderildi.
ServerVariables özelliğinin kullnımına ait bir örnek;
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >


<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>

<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>

ServerVariables tüm özelliklerinin çağrılması;

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;

String[] arr1 = coll.AllKeys;


for (loop1 = 0; loop1 < arr1.Length; loop1++)
{
Response.Write("<b>"+"Key: " + arr1[loop1] +"</b>"+
"<br>");
String[] arr2 = coll.GetValues(arr1[loop1]);
for (loop2 = 0; loop2 < arr2.Length; loop2++)
{
Response.Write("<b>"+"Value " + loop2 + ": " +
"</b>"+Server.HtmlEncode(arr2[loop2]) + "<br>");
}
}

}
}

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" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >


<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>

<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>

Request.Params Özelliği (NameValueCollection)

Bu özellik, QueryString, Form, ServerVariables ve Cookies koleksiyonundaki öğelerin


bir birleşimini içeren bir NameValueCollection döndürür.

<%@ Page Language="C#" AutoEventWireup="true"


CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >


<head runat="server">
<title>ASP.NET Example</title>

</head>
<body>
<form id="form1" runat="server">

<asp:Label id="lblValues" 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;

public partial class _Default : System.Web.UI.Page


{
protected void Page_Load(object sender, EventArgs e)
{
string paramInfo = "";

//Request.Params koleksiyounu elde etme.


NameValueCollection pColl = Request.Params;

// Her bir iterasyonda koleksiyona ait anahtar adını


elde etme
for (int i = 0; i <= pColl.Count - 1; i++)
{
paramInfo += "Anahtar (Key): " + pColl.GetKey(i) +
"<br />";

string[] pValues = pColl.GetValues(i);

// Her bir iterasyonda koleksiyona ait anahtarın


değerini elde etme
for (int j = 0; j <= pValues.Length - 1; j++)
{
paramInfo += "Değer (Value):" + pValues[j] +
"<br /><br />";

}
}

lblValues.Text = paramInfo;

}
}

118
Diğer Request Nesnesi Özelikleri

Şimdiye kadar gördüğümüz koleksiyon ve dizi özelliklerine ek olarak Request nesnesi


birkaç tek değerli özelliği de sahiptir.

ApplicationPath : Uygulamamızın sanal dizin yolunu elde eder.


<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

protected void Page_Load(object sender, EventArgs e)


{
Label1.Text = Request.ApplicationPath;
Image1.ImageUrl = Request.ApplicationPath + "/images/Image1.gif";

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>

Browser : ASP.NET2te browser özelliği HttpBrowserCapabilities nesnesi döndürür. Bu da


istemcinin yeteneğini belirleyebileceğimiz özellikleri ortaya çıkarır.
protected void Page_Load(object sender, EventArgs e)
{
HttpBrowserCapabilities bc = Request.Browser;
Response.Write("<p>Browser Capabilities:</p>");
Response.Write("Type = " + bc.Type + "<br>");
Response.Write("Name = " + bc.Browser + "<br>");
Response.Write("Version = " + bc.Version + "<br>");
Response.Write("Major Version = " + bc.MajorVersion +
"<br>");
Response.Write("Minor Version = " + bc.MinorVersion +
"<br>");
Response.Write("Platform = " + bc.Platform + "<br>");
Response.Write("Is Beta = " + bc.Beta + "<br>");
Response.Write("Is Crawler = " + bc.Crawler + "<br>");
Response.Write("Is AOL = " + bc.AOL + "<br>");
Response.Write("Is Win16 = " + bc.Win16 + "<br>");
Response.Write("Is Win32 = " + bc.Win32 + "<br>");

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.

protected void Page_Load(object sender, EventArgs e)


{
Label1.Text = Request.FilePath;

Mevcut sayfanın tam yolu:<br />


<asp:Label ID="Label1" runat="server" ForeColor="Brown"
/><br />

Form : Form değişkenlerinin bir koleksiyonunu okur.

InputStream : Tarayıcı tarafından gönderilen ham verilere doğrudan erişmemizi sağlayan


Stream nesnesi döndürür.

URL : Mevcut talebin URL’ini içerir.


Uri MyUrl = Request.Url;
Response.Write("URL Port: " + MyUrl.Port + "<br>");
Response.Write("URL Protocol: " +
Server.HtmlEncode(MyUrl.Scheme) + "<br>");

123
UrlReferrer : Tarayıcının mevcut talepte bulunmadan önce en son talep ettiği URL’yi içerir.

Request Nesnesinin Metotları


Önceden gördüğünüz özelliklere ek olarak, Request nesnesinin birkaç özel public
metoda sahiptir.

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.

MapImageCoordinates : Kullanıcı web formu üzerinde bir ImageButton tıklanıldığında tıklanan


noktanın x ve y koordinatlarını 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);

Request nesnesine toplu bakış


Koleksiyonları

ClientCertificate Client sertifikasını yakalar.


Cookies(name) Cookie’nin değerini alır.
Form(elemen_name) Form’daki bilgilerin değerini alır. Post etodu
ile kullanılır.
QueryString(variable_name) Query string içindeki değişken değerlerini

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 Değişkenleri Eklemek/Değiştirmek

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.

private void Page_Load(object sender, System.EventArgs e)


{
if (Session["sayac"]!=null)
{
Session["sayac"]=(int) Session["sayac"]+1;
}
else
{
Session["sayac"]=1;
}

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);

Örneğin, Session[“sayac”]=1 yerine Session.Add(“sayac”,1) yazabilirsiniz. İki şekilde de çıktı


aynıdır.

Örnek:

<%@ Page Language="C#" AutoEventWireup="true"


CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

protected void Button1_Click(object sender, EventArgs e)


{
Response.Redirect("session.aspx");
}
</script>
<html >
<head>
<title>Session</title>
</head>
<body>

<% Session["Bölüm"] = "Bilgisayar";

Session.Add("Okul", "Fırat Üniversitesi");

%>

<form id="form1" runat="server">


<asp:Button ID="Button1" runat="server" Text="Oturum
Değişkeni" OnClick="Button1_Click" />

</form>
</body>
</html>

127
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="session.aspx.cs" Inherits="session" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >


<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<% Response.Write("Bölüm : "+Session["Bölüm"]+"<br>");
Response.Write("Okul : "+ Session["Okul"]);
%>
</div>
</form>
</body>
</html>

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şkenleri Temizlemek

Session değişkenini birden fazla şekilde oluşturabildiğimiz gibi bunları yok etmek
içinde çeşitli yollar vardır.

Session[“sayac”]=null Null’a eşitlemek.


Session.Contents.Remove(“sayac”)
Session.Remove(“sayac”) Remove metodunu kullanmak.
Session.RemoveAll RemoveAll metodunu kullanmak.
Session.RemoveAt(int) Herhangi bir unsuru index kullanarak yok etmek.

Örnek:
<%@ Page Language="C#" %>

<html > <head> <title>Session</title> </head>


<body>

<form action ="session.aspx" method="post">


Lütfen formu doldurunuz:
<p>
AD :<input type="text" name="ad" size ="10" /> <br />
YAŞ: <input type="text" name="yas" size="10"/> <br /><br />
<input type="submit" value="GÖNDER"/>
</p>
</form>

129
</body>
</html>

<%@ Page Language="C#" CodeFile="session.aspx.cs" %>

<html >
<head > <title>Untitled Page</title> </head>
<body>
<% Session.Timeout=1;
string ad = Request.Form["ad"];
int yas = Int16.Parse(Request.Form["yas"]));

Session["yetiskin_kitap"] = "yetişkin kitapları";


Session["cocuk_kitap1ari"] = "çocuk kitapları";

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ü;

private void Page_Load(object sender, System.EventArgs e)


{
if(Session["Bilgi"]!=null)
{
Label1.Text=Session["Bilgi"].ToString();
}
}
private void btnEkle_Click(object sender, System.EventArgs e)
{
Session["Bilgi"]="Deneme";
Label1.Text=Session["Bilgi"].ToString();
}

WebForm2.aspx kodları ve Form’ un ekran görüntüsü;

private void Page_Load(object sender, System.EventArgs e)


{
if(Session["Bilgi"]!=null)
Label1.Text=Session["Bilgi"].ToString();
}

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ı

Bazı kullanıcılar, güvenlik kaygılarından dolayı bilgisayarlarında cookie


oluşturulmasına izin vermeyebilmektedirler: Bu durumda, cookieler kullanılamadığı gibi,
ASP’de session değişkenleri de kullanılamaz ve sayfalar arası süreklilik sağlanamamaktadır.
Böyle bir durum web geliştiriciler için en büyük handikaplardan birini oluşturmaktadır. Ancak
ASP.NET ile birlikte bu sorun da ortadan kalkmıştır. Artık cookilere gerek kalmadan, session
değişkeMeri kullanmak mümkündür.

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”

ifadesidir. Böylece artık uygulamamız, session değişkeni oluştururken ve kullanırken cookie


kullanmaz.
Peki ASP.NET değişkenlerin takibini cookie kullanmadan nasıl yapar?
Aslında cookie kullanarak yaptığından farklı bir mantık izlemez, burada da yine session
ID üretir fakat bunu cookie yerine sayfa URL adresine eller. Başka bir sayfaya herhangi bir
geçişte bu ID numarası da aktarılır. Böylece session değişkenlerinin oturum boyunca
kullanımında bir süreklilik sağlanır ve sunucu kullanıcıya ait değerleri kullanabilir.

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 Oturum Durumu

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.

Verilerin Bireylerle İlişkilendirilmesi

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.

Kullanıcı Kimliğini Belirlemek

Kullanıcının kimliğini belirlemenin tek yolu, o kullanıcının sadece kendisi tarafından ve


sunucu tarafından bilinebilecek bir bilgiyi size yollamasıdır. Bireylerin kimliğini saptamanın en
olay yolu kullanıcı adı – şifre kombinasyonunu kullanmaktır. Akıllı artlar şifre kavramını bir
adım öteye götürmektedir. Çünkü bu sayede kullanıcıların şifreleri ya da bir kenara yazması
önlenmektedir. İleriki zamanlarda parmak izi, ses, yüz, retina tanıma ve tanıma motorları gibi
biyometrik kimlik kontrol mekanizmaları şifre ve akıllı artları tamamen ortadan kaldıracaktır.

135
ASP.NET Oturum Durumunun Güvenliği

ASP.NET’in desteklediği güvenlik çeşitleri aşağıda bulunmaktadır.

Froms kimlik denetimi : Bu tipte, standart kullanıcı adı – şifre iletişim kutusunda tarayıcının
içerisine entegre edilmiştir.

Temel Kimlik Denetimi : Bu bir kullanıcının kimliğini belirlemenin en eski ve en az güvenli


yoludur. Kullanıcı kimlik bilgilerini girer ve tarayıcı bu bilgileri sunucuya düz metin olarak
girer.

Digest Kimlik Denetimi : Bu yöntemde sınama/yanıtlama yaklaşımı kullanılır. Sunucu


tarayıcıdan kimlik bilgisi isteyerek onu sunar. Tarayıcı, talep edilen URL’i, kullanıcı adını,
şifreyi, talep yönetimini ve sunucu tarafından sınama sırasında gönderilen ve nonce denilen özel
bir değeri hash ederek sunucuya yanıt verir.

Oturum Durumunu Kapatmak

Bazenr performansı belirlemek için yapacağınız ilk test oturum durumunu


kapatmak olacaktır. Bunu sağlamak için Web.Config dosyanızı açın. <sessionState>
unsuruna kadar ekranı kaydırın ve mode niteliğini off’a ayarlayın. Web.Config dosyanızı
kaydedin ve oluşturduğunuz web formunu çalıştırın. Yüklemenin hemen ardından
tarayıcıyı birkaç kez güncelleyin hatta F5 tuşuna basılı tutun. Şimdi <sessionState>
unsurunun mode niteliğini Inproc’ çevirin, Web.Config dosyasını kaydedin ve tarayıcıyı
güncelleme işlemini tekrarlayın. Aradaki farkı göreceksiniz çünkü bu işlemde Dataset’i
henüz tampon belleğe almadık. Tek bir makinede bu fark pek bir göze çarpmayacaktır.
Fakat performansı daha hassas bir şekilde ölçmek için bazı sunucu araçları kullanılırsa
gözleyebiliriz.

Oturum Sonlanmasına Neden Olacak Etmenler


Varsayılan olarak sunucu üzerinde açılan her
bir oturum 20 dakikalık zaman aşımı süresine
sahiptir. Sitemizi ziyaret eden kullanıcıların
Oturumun zaman aşımına Session verileri ile ne kadar süre
uğraması. (Timeout) durabilecekleri göz önüne alınarak bu süre
daha da düşürülebilir veya arttırılabilir. Sürede
yapılan ayarlamalar kesinlikle sunucuya ait
bellek tüketimini etkileyecektir.

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

APPLICATION (UYGULAMA) NESNESİ

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.

HttpApplication ve HttpApplicationState Nesneleri

Bağımsız Windows programlarının tüm sınıflar arasında paylaşılan değer ve nesneleri


içeren global değişkenleri olduğu gibi, C# web uygulamalarının da global değerleri ve nesneleri
olabilir. HttpApplicatonState nesnesi bu değişkenleri tutar. Web tabanlı koleksiyonların bir
çoğu gibi, bu da bir adlar ve değerler listesi olarak gerçekleştirilir. Burada ad indexlenmiş bir
string dizisidir.

HttpApplicatonState nesnesine doğrudan erişemeyiz. Bunun yerine buna bir


HttpApplication nesnesi ile erişebiliriz. ASP.NET çalışma sırasında bu nesnelerin sürekliliğini
sağlar. Oturum kapatılınca ASP.NET te bu uygulamayı kapatır. Bir kullanıcı sayfayı ilk defa
talep ediyorsa kullanım süresi dolunca veya uygulama kapatılınca ASP.NET olayları ortaya
çıkarır.

ApplicationState nesneleri birden fazla makine üzerinde paylaşılamaz. Yani oturuma


özgü bilgileri Application nesnesinde saklayamazsınız. Application nesnesinde sayfayı talep
eden kullanıcıya ait bilgiler saklanır. Oturuma özgü bilgiler SessionState sınıfında tutulur.

Application değişkeninin oluşturulması aynen Session değişkenleri gibidir.

Application["Değişken_ismi"]="Değişken_değeri";

Değişkeni elde etmek için : Response.Write(Application["değişken_ismi"]);

Örnek:

Diyelim ki sayfanızda bir oyun düzenliyorsunuz ve isteyen ziyaretçilerin bu oyuna katılmasını

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”

protected void Page_Load(object sender, EventArgs e)


{

Application.Add("Oyun", 0);

<%@ Page Language="C#" AutoEventWireup="true"


CodeFile="Oyun_giris.aspx.cs" Inherits="_Oyun_giris" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0


Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-
transitional.dtd">

<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">

<html xmlns="http://www.w3.org/1999/xhtml" >


<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<% Response.Write("<h3>Oyunumuza Hoş Geldiniz</h3>");
Application.Lock();

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;

Oyundan çıkmak istediğimizde;


“oyun_cikis.aspx”

<%@ Page Language="C#" AutoEventWireup="true"


CodeFile="oyun_cikis.aspx.cs" Inherits="oyun_cikis" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >


<head runat="server">
<title>Untitled Page</title>
</head>
<body>

<% Response.Write("<h3> Oyunumuza katıldığınız için teşekkür


ederiz.</h3>");

Application.Lock();

if ((int)Application["Oyun"] <= 0)
Application["Oyun"] = 0;
else
{ int deger = (int)Application["Oyun"];
deger -= 1;
Application["Oyun"] = deger;
}

141
Application.UnLock();

Response.Write("Şu anda oyunda " + Application["Oyun"] +


" kişi kaldı."); %>

<p><a href="Oyun.aspx"> Oyuna tekrar katıl.... </a></p>

</body>
</html>

Application Nesnesine Toplu Bakış


Metotlar
Yazım Contents.Remove
Application.koleksiyon Contents.RemoveAll
Application.metot Lock
Unlock

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.

Sitenizin kök dizinin de bir global.asax dosyasına sahip olabilirsiniz. Global.asax


dosyası özeldir. Bu dosya globaldir. Yani burada tanımlayacağınız değişkenler gerçekten
uygulamanızda globaldir. Dosya, System.Web.HttpApplication’ dan kalıtımla türetilen ve
uygulama düzeyinde olaylar ortaya çıkaran global adında bir sınıf tanımlar. Bu uygulama
örneğinin ömrü süresince olaylar aşağıdaki gibi sırayla ateşlenir.

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">

void Application_Start(object sender, EventArgs e)


{
// Application uygulaması çalıştığında devreye girer.

Application.Add("ToplamZiyaretci",0);

void Application_End(object sender, EventArgs e)


{
// Application uygulaması kapatıldığında devreye girer.

void Application_Error(object sender, EventArgs e)


{
// Uygulamada beklenedik bir hat meydana geldiğinden
çalışır.

void Session_Start(object sender, EventArgs e)


{
// Yeni bir oturum başladığında çalışır.
/*Uygulama seviyesinde bir değişken kullanmak
istediğimizden Application nesnesini kullandık.
* Eğer ilk kez oturum açılıyor ise varsayılan değeri 1
olarak ayarlıyoruz. İlk kez açılmıyorsa var olan değeri 1
arttırıyoruz.*/

if ((int)Application["ToplamZiyaretci"] == 0)
Application["ToplamZiyaretci"] = 1;
else
{
int deger = (int)Application["ToplamZiyaretci"];
deger += 1;
Application["ToplamZiyaretci"] = deger;

144
}

void Session_End(object sender, EventArgs e)


{
/* Oturum kapatıldığında devereye giren bu olayda,
uygulama seviyesindeki Application nesnesinde saklanan değerini
1 azaltıyoruz.
* Böylece online ziyaretçi sayısını 1 azaltmış
oluyoruz.*/
int deger = (int)Application["ToplamZiyaretci"];
deger -= 1;
Application["ToplamZiyaretci"] = deger;

// Oturum kapatıldığında çalışır.


// Note: The Session_End event is raised only when the
sessionstate mode
// is set to InProc in the Web.config file. If session
mode is set to StateServer
// or SQLServer, the event is not raised.

</script>

Default.aspx
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0


Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-
transitional.dtd">

<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 />

<asp:Label ID="Label1" runat="server" Text="Ad


Soyad :"></asp:Label>
<asp:TextBox ID="txtBilgi" runat="server" ></asp:TextBox>
<asp:Button ID="btnEkle" runat="server" Text="Session'a
Ekle" OnClick="btnEkle_Click" />
<br />

<br />
<a href="Default.aspx">Default</a> &nbsp; &nbsp; &nbsp;
<a href="session.aspx">Sayfa2</a>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<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;

public partial class _Default : System.Web.UI.Page


{
protected void Page_Load(object sender, EventArgs e)
{
lblSessionID.Text = Session.SessionID;

lblZiyaretciSayisi.Text =
Application["ToplamZiyaretci"].ToString();

146
protected void btnEkle_Click(object sender, EventArgs e)
{

Session["Kimlik"] = txtBilgi.Text; //Session’ a değer


atıyoruz.
}

<%@ Page Language="C#" AutoEventWireup="true"


CodeFile="Sayfa2.aspx.cs" Inherits="Sayfa2" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >


<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="lblAdSoyad" runat="server"
Text="Label"></asp:Label>
<br />
<br />
<a href="Default.aspx">Default</a> &nbsp; &nbsp; &nbsp;
<a href="Sayfa2.aspx">Sayfa2</a>

147
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<a
href="Sayfa3.aspx">Sayfa3</a>
</div>
</form>

</body>
</html>

Sayfa2.aspx.cs

protected void Page_Load(object sender, EventArgs e)


{

lblAdSoyad.Text = Session["Kimlik"].ToString();
//Session değerini okuyoruz.

Sayfa3.aspx

<%@ Page Language="C#" AutoEventWireup="true"


CodeFile="Sayfa3.aspx.cs" Inherits="oyun_cikis" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >


<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>

148
<asp:Label ID="lblAdSoyad" runat="server"
Text="Label"></asp:Label>
<br />
<br />
<a href="Default.aspx">Default</a> &nbsp; &nbsp; &nbsp;
<a href="session.aspx">Sayfa2</a>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<a
href="oyun_cikis.aspx">Sayfa3</a>
</div>

</form>

</body>
</html>

Sayfa3.aspx.cs

protected void Page_Load(object sender, EventArgs e)


{
lblAdSoyad.Text = Session["Kimlik"].ToString();

SERVER NESNESİ
HttpServerUtility NESNESİ

Server nesnesi sunucu üzerinde özellik ve metotlara ulaşmayı sağlar. Request,


Response, Session ve Application nesnelerini kullanarak web uygulamalarınızın birçok yönünü

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ı.

Geç bağlanan COM nesnelerini türetmeniz gerektiğinde, Server.CreateObject ya da


Server.CreateObjectClsID metodunu kullanabilirsiniz. CreateObject metodu nesneyi oluşturmak
için COM ProgramID (ProgID) stringinin ya da .NET Type tiplerini kullanır. Bir ProgID bir
sınıfı tanımlayan Stringdir. Windows, COM ProgID’leri registry veri tabanında,
HKEY_CLASSES_ROOT’a saklar. Bunu denemek için, sunucu üzerinde kurulu
örnekleyebileceğiniz bir COM nesnesine ihtiyacınız olacak. Bir DOMDocument örneği
oluşturun. Aşağıdaki program bir DOMDocument.3.0 nesnesi oluşturur, onu bir XML stringi ile
yükler ve ardından <item1>düğümünün metnini basar.

protected void Page_Load(object sender, EventArgs e)


{

DOMDocument30Class domDoc=new DOMDocument30Class();


IXMLDOMNode N;

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.

Örnek: SQL server ile bağlantı


protected void Page_Load(object sender, EventArgs e)
{
ADODB.Connection conn;
ADODB.Recordset rs;
string strConn = "DRIVER={SQL Server};
SERVER=(local);uid=sa;pwd=tjdwls;database=Northwind";
conn =
(ADODB.Connection)Server.CreateObject("ADODB.Connection");
rs =
(ADODB.Recordset)Server.CreateObject("ADODB.Recordset");

//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.

<%@ Page Language="C#" AutoEventWireup="true"


CodeFile="Default2.aspx.cs" Inherits="Default2" AspCompat="true"
%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >


<head runat="server">

152
<title>Untitled Page</title>
</head>
<body>

<p>Genel olarak <% Server.Execute("Default3.aspx");%>


kitaplarını okurum.</p>
</body>
</html>

<%@ Page Language="C#" AutoEventWireup="true"


CodeFile="Default3.aspx.cs" Inherits="Default3" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >


<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<% Response.Write("<b> Macera </b>");%>
</body>
</html>

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"
%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >


<head runat="server">
<title>Untitled Page</title>

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>

<%@ Page Language="C#" AutoEventWireup="true"


CodeFile="Default3.aspx.cs" Inherits="Default3" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >


<head runat="server">
<title>Untitled Page</title>
</head>
<body>

<% 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.

<%@ Page Language="C#" %>

<html > <head> </head>


<body>

<% 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.

Aşağıdaki komut çalışmakta olan 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"
%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >


<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server" method="post">
<div>
<p>Çalışılan sayfanın yolu
<% Response.Write(Server.MapPath("Default2.aspx"));%>.</p>
</div>
</form>
</body>
</html>

Server Nesnesine Toplu Bakış


Yazım
Server.özelli Özellikler

k ScriptTimeou

Server.metot t

Metot

156
CreateObject
(type_of_object)
Execute (yol)
GetlastError()
HTMLEncode(string)
MapPath(yol)
Transfer(yol)

Dosya Okuma, Yazma ve Ekleme


ASP.Net, dosyaları okumamıza ya da yazmamıza imkân veren sınıflar sağlar. İşletim sisteminde
tüm dosyalar byte tabanlıdır tahmin edeceğiniz gibi, C# dosyalardan okumak ya da yazmak için
metotlar içerir.

TextReader ve Stream Nesnesi

Dosya okuma için StreamReader yazma için ise StreamWriter nesnesi kullanılır.

protected void Page_Load(object sender, EventArgs e)


{
TextReader tr = new
StreamReader(Server.MapPath("veri.txt"));

//tek satır okuma Response.Write(tr.ReadLine());

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();

Sayfa yenilendikten sonra;

Var olan dosyaya ekleme yapmak için ise aşağıdaki komut satırı kullanılr.

TextWriter tw = new StreamWriter( Server.MapPath ("veri.txt") ,


true);

Text Dosyasının Başından Belirli Sayıda Karekter Okumak


StreamReader metodunun bir ozellığı ile text dosyamızın başlangıç karakterinden itibaren kaç
karakteri okuyacağımızı sunucuya bildirebiliriz veya kaçıncı karakterden itibaren
okutulacağınıda sunucuya bildirebiliriz. Aşağıdaki örnekte txt dosyası içinde bulunan bilginin

158
ilk 10 karakterini ekrana yazar.

protected void Page_Load(object sender, EventArgs e)


{

TextReader tr = new
StreamReader(Server.MapPath("veri.txt"));

char[] strBuffer = new char[50];


int d=tr.ReadBlock(strBuffer, 0,10);

string f = new string(strBuffer);


Response.Write(f);

tr.Close();

}
}

Eğer 10. Karakterden sonrakini görüntülemek istiyorsak


Response.Write(tr.ReadToEnd()); veya
Response.Write(tr.ReadLine());
Komutlarını kullanamak yeterlidir.

protected void Page_Load(object sender, EventArgs e)


{

TextReader tr = new
StreamReader(Server.MapPath("veri.txt"));

//tek satır okuma


char[] strBuffer = new char[50];
int d=tr.ReadBlock(strBuffer, 0,5);

/* string f = new string(strBuffer);

Response.Write(f);*/

Response.Write(tr.ReadToEnd());

tr.Close();

Form İle Bir Text Dosyasına Yazdırmak


ASP.NET sayfası üzerinden bir form sayesinde, ziyaretçilerin girdiği bilgiler alınıp,
sunucu üzerinde bir text dosyasına kaydedilebilir. Bu text dosyasındaki bilgiler daha sonra

159
kullanılmak üzere saklanabilir.

protected void Button1_Click(object sender, EventArgs e)


{
TextWriter tw = new
StreamWriter(Server.MapPath("veri.txt"),true);

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();
}

ASP.NET’ DE SÜRÜCÜ, KLASÖR VE DOSYA İŞLEMLERİ

Dosya ve Klasör İşlemleri

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 sınıfının hiçbir özelliği bulunmamaktadır. Bütün üye elemanları metotlardır.


Şimdi bu metotları ve kullanımlarını görelim.

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

Belirtilen yoldaki klasörün oluşturulma tarihini DateTime nesnesi olarak döndürür.


Response.Write(Directory.GetCreationTime(Server.MapPath("belgeler")));
14.02.2008 16:13:57

161
Directory.GetCurrentDirectory()

Çalışan programın hangi klasörde olduğunu verir.


Response.Write(Directory.GetCurrentDirectory());
C:\WINDOWS\system32

Directory.GetDirectories- string[]
Belirtilen yoldaki bütün klasörlerin ismini bir string türünden bir dizi döndürür.

Çalıştığımız bilgisayarın c dizini içerisindeki klasörleri adını listelemek istersek,

protected void Page_Load(object sender, EventArgs e)


{
string[] a;
a = Directory.GetDirectories(@"c:\");
foreach (string k in a)
{
Response.Write(k+"<br>");
}

Programı yeterli olacaktır.

162
Directory.GetDirectoryRoot(string yol)
Klasörün bulunduğu kök dizin bilgisini ve volume bilgilerini string olarak verir.

Directory.GetFiles(string yol) - string []


Belirtilen yoldaki bütün klasörün ismini string türünden diziye aktarır ve bu diziyi döndürür.

Directory.GetFileSystemEntries(string yol) - string []


Belirtilen yoldaki klasörün içinde bulunan bütün dosya ve klasörleri string türünden diziye
aktarır ve bu diziyi döndürür.

Directory.GetLastAccessTime(string yol) – DateTime


Belirtilen yoldaki klasöre son ne zaman ulaşıldığını DateTime nesnesi olarak döndürür.
Response.Write(Directory.GetLastAccessTime(Server.MapPath("belgeler"))
);

14.02.2008 18:25:52

Directory.GetLastWriteTime(string yol) – DateTime

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
}

Directory. GetParent(string yol)

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

Directory.Move(string kaynakklasörünyolu, string hedefklasörünyolu)


Kaynak klasörünyolu ile belirtilen klasörün içeriğini hedef klasörünyolu ile belirtilen klasörün
içerisine taşır. Kaynak klasör silinir.
Directory.Move(Server.MapPath("belgeler1"),
Server.MapPath("belgeler"));

Directory.SetLastAccessTime(string yol ,DateTime zaman)-DateTime

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.SetCreationTime(string yol,DateTime zaman) DateTime


Klasörün oluşturulma tarihini ikinci parametre ile verilen zaman değişkenine göre yeniden
düzenler.

Directory.SetCurrentDirectory(string yol)
Programın çalıştırıldığı klasörü yol ile belirtildiği gibi değiştirir.

Diğer özellikler öğreciler tarafından öğrenilecek

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))
{

using (StreamWriter sw = File.CreateText(path))


{
sw.WriteLine("Merhaba ");
sw.WriteLine("ve ");
sw.WriteLine("Hoşgeldin");
}
}

using (StreamWriter sw = File.AppendText(path))


{
sw.WriteLine("Bu");
sw.WriteLine("İlave");
sw.WriteLine("Metin");
}

165
using (StreamReader sr = File.OpenText(path))
{
string s = "";
while ((s = sr.ReadLine()) != null)
{
Response.Write(s+"<br>");
}
}
}

Copy(string kaynak, string hedef)


Kaynakta belirtilen dosya hedefe kopyalanılır. Hedefte kaynak ile aynı isimde dosya var ise
işlem başarısız olur, bunun için Copy metodunu aşağıdaki gibi kullanırız.

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);

FileStream Create(string yol) :


Belirtilen yoldaki dosya oluşturulur ve dosyaya ilişkin FileStream nesnesi döndürülür, tampon
değişkeni verilmemişse tampon miktarı ayarlanır.

string path = @"C:\Inetpub\wwwroot\WebSite\proje\veri1.txt";

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)

FileAttributes GetAttributes(string yol)


Belirtilen yoldaki FileAttributes numaralandırması ile özelliği döndürülür.
Response.Write(File.GetAttributes((path)));
Çıktı
Archive
Örnek:
Aşağıdaki program c:\ sürücüsü içindeki bütün dosya ve klasörlerin özelliklerini ekrana
yazdırıyor.

protected void Page_Load(object sender, EventArgs e)


{
string[] dizi = Directory.GetFileSystemEntries(@"c:\");

foreach (string i in dizi)


{
Response.Write(i + " = ");
Response.Write(File.GetAttributes(i));
Response.Write("<br>");
}
}

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);

FileMode Numaralandırmalarında bulunan semboller;


Append: Çıktı dosyanın sonuna eklenir.
Create: Yeni bir çıktı dosyası oluşturulur. Eğer dosya mevcutsa üzerine yazılır.
CreateNew: Yeni bir çıktı dosyası oluşturulur. Eğer dosya mevcutsa hata verir.
Open: Önceden mevcut bir dosyayı açar.
OpenOrCreate: Dosya mevcutsa dosyayı açar. Mevcut değilse dosyayı oluşturur.

168
Truncate: Belirtilen açılır ve için tamamen silinir.

FileAccess Numaralandırmalarında bulunan semboller;

Read: Dosya okumak için açılır.


ReadWrite: Dosya okumak ve yazmak için açılır.
Write: Dosya yazmak için açılır.

FileShare numaralandırmasında bulunan semboller;

Inheritable: Dosyanın yavru prosesler tarafından türetilebilmesini sağlar.


None: Dosyanın başka prosesler tarafından açılmasını engeller.
Read: Dosyanın başka proseslerce de açılmasını sağlar.
Write: Dosyaya başka proseslerinde yazıla bilmesini sağlar.
ReadWrite: Dosyanın başka proseslerce de açılıp okunması ve yazılmasını sağlar.

FileStream OpenRead(string yol)

Belirtilen dosya yalnız okumak için açılır. Geriye FileStream nesnesi döndürür.

StreamReader OpenText(string yol)


Belirtilen dosyayı yalnızca text metodunda okumak için açar ve geriye StreamReader nesnesi
döndürür.

FileStream OpenWrite(string yol)


Belirtilen dosyayı yazma metodunda açar ve 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.

protected void Page_Load(object sender, EventArgs e)


{
string path = @"C:\Inetpub\wwwroot\WebSite\proje\k";
DirectoryInfo k = new DirectoryInfo(path);
Response.Write("Özellikler : ");

169
Response.Write(k.Attributes + "<br>");

Response.Write("Oluşturulma tarihi : ");


Response.Write(k.CreationTime + "<br>");

Response.Write("Klasör varmı : ");


Response.Write(k.Exists + "<br>");

Response.Write("Uzantı : ");
Response.Write(k.Extension + "<br>");

Response.Write("Tam Yol : ");


Response.Write(k.FullName + "<br>");

Response.Write("Son erişim zamanı : ");


Response.Write(k.LastAccessTime + "<br>");

Response.Write("Son yazma zamanı : ");


Response.Write(k.LastWriteTime + "<br>");

Response.Write("Klasörün adı : ");


Response.Write(k.Name + "<br>");

Response.Write("Bir üst klasör : ");


Response.Write(k.Parent + "<br>");

Response.Write("Kök Dizin : ");


Response.Write(k.Root);

}
Çı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.

DirectoryInfo CreateSubdirectory(string yol)


Belirtilen yolda bir alt dizin 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 MoveTo(string hedef)


İlgili dizin içindeki dizin ve dosyalarla birlikte hedef ile belirtilen yere taşını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.

protected void Page_Load(object sender, EventArgs e)


{

string path = @"C:\Inetpub\wwwroot\WebSite\proje\veri.txt";

FileInfo k = new FileInfo(path);


Response.Write("Özellikler : ");

Response.Write(k.Attributes + "<br>");

Response.Write("Oluşturulma tarihi : ");


Response.Write(k.CreationTime + "<br>");

Response.Write("Dosya varmı : ");


Response.Write(k.Exists + "<br>");

Response.Write("Uzantı : ");
Response.Write(k.Extension + "<br>");

Response.Write("Dosya Tam adı :");


Response.Write(k.FullName + "<br>");

Response.Write("Son erişim zamanı : ");


Response.Write(k.LastAccessTime + "<br>");

Response.Write("Son yazma zamanı : ");


Response.Write(k.LastWriteTime + "<br>");

Response.Write("Dosya adı : ");


Response.Write(k.Name + "<br>");

Response.Write("Boyut :");

172
Response.Write(k.Length + "<br>");

Response.Write("Bulunduğu klasör: ");


Response.Write(k.DirectoryName + "<br>");

}
Çıktı

File sınıfında gördüğünüz AppendText(), Create(), CreateText(), Delete(), Open(),


OpenRead(), OpenText(), OpenWrite() metotları FileInfo sınıfında da vardır. Bu metotlar aynı
işleri yapmaktadır. Bu metotlara ek olarak FileInfo sınıfında aşağıdaki metotlar da bulunur.

FileInfo CopyTo(string hedef)


İlgili dosya hedef ile belirtildiği yere kopyalanır. Eğer aynı dosya hedefte varsa bu metot
başarısız olur.

FileInfo CopyTo(string hedef, bool a)


İkinci parametre true olarak girilirse hedef dosya varsa bile üzerine yazılır.

void MoveTo(string hedef)


İlgili dosya hedefte belirtilen yere taşınır.

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.

protected void Page_Load(object sender, EventArgs e)


{

string yol = @"C:\Inetpub\wwwroot\WebSite\proje\veri.txt";


string yol2 = @"C:\Inetpub\wwwroot\WebSite\proje\belgeler\veri.txt";
string yeniyol=Path.ChangeExtension(yol,"jpg");

Response.Write("Eski uzantı : ");


Response.Write(Path.GetExtension(yol) + "</b> <br>");
Response.Write("Yeni uzantı : ");
Response.Write("<b>" + Path.GetExtension(yeniyol) + "</b> <br>");
Response.Write("Yeni Yol : ");
Response.Write("<b>" + Path.Combine(yol, yol2) + "</b> <br>");
Response.Write("Klasör : ");
Response.Write("<b>" + Path.GetDirectoryName(yol) + "</b> <br>");
Response.Write("Dosya Adı : ");
Response.Write("<b>" + Path.GetFileName(yol) + "</b> <br>");
Response.Write("Uzantısız Dosya Adı : ");
Response.Write("<b>" + Path.GetFileNameWithoutExtension(yol)+"</b>
<br>");
Response.Write("Tam Yol : ");
Response.Write("<b>" + Path.GetFullPath(yol) + "</b> <br>");
Response.Write("Kök Dizin : ");
Response.Write("<b>" + Path.GetPathRoot(yol) + "</b> <br>");
Response.Write("Geçici Dosya Adı : ");
Response.Write("<b>" + Path.GetTempFileName() + "</b> <br>");
Response.Write("Geçici Dosya Dizini : ");
Response.Write("<b>" + Path.GetTempPath() + "</b> <br>");
Response.Write("Dosya Uzantısı Var mı? : ");
Response.Write("<b>" + Path.HasExtension(yol) + "</b> <br>");
Response.Write("Alt Dizin Ayıracı : ");
Response.Write("<b>" + Path.AltDirectorySeparatorChar + "</b> <br>");
Response.Write("Dizin Ayıracı : ");
Response.Write("<b>" + Path.DirectorySeparatorChar + "</b> <br>");
Response.Write("Geçersiz Yol Karakteri: ");
Response.Write("<b>"+Path.InvalidPathChars + "</b> <br>");
Response.Write("Yol Ayırıcı Karakter :");
Response.Write("<b>" + Path.PathSeparator + "</b> <br>");
Response.Write("Kök Dizin Ayıracı :");
Response.Write("<b>"+Path.VolumeSeparatorChar +"</b> <br>");

}
Çı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.NET, veritabanındaki bilgileri elde etmek veya veritabanında bulunan verileri


değiştirmek için geliştirilmiş bir veri tabanı aracıdır. ADO.NET , .NET sınıf kütüphanesindeki
System.Data isim alanındaki sınıfların tamamını temsil eder. ADO.NET’in klasik ADO ya göre
getirdiği yenilikler ile ADO kütüphanesinin geliştirildiği açıktır. Kısaca ADO.NET, .NET
platformu için geliştirilmiş, offline çalışma sistemini destekleyen, web uygulamaları gibi n-
katmanlı uygulamalarda büyük kolaylık sağlayan yeni bir veri erişim aracıdır diyebiliriz.
ADO.NET in diğer önemli özelliği ise doğrudan XML desteği vermesidir. Veriler http
protokolü ile XML formatına dönüştürülür.

ADO ile ADO.NET arasındaki temel farklar:

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 Nesne Modeli

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.

 System.Data.OleDb - Ole DB ile veritabanlarına bağlanmak için gereken sınıfları


içerir.
 System.Data.SqlClient - SQL Server 7.0 ve üstündeki versiyonlara bağlanmak için
gereken sınıfları içerir.
 System.Data.Odbc - ODBC ile veritabanlarına bağlanmak için gereken sınıfları içerir.
 System.Data.Oracle - Oracle veritabanına bağlanmak için gereken sınıfları içerir.

System.Data.OleDb isim alanı 3 tane sınıf içerir. Bunlar:

 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

OleDb servislerini kullanmadan Sql Server sunucusuna doğrudan bağlanıp


performansını artmak istiyorsak bu isim alanı altında bulunan ve MS SQL Server için özel
olarak geliştirilmiş sınıfları kullanmalıyız.

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.

Uygulamaya geçmeden önce şu adımları uygulamamız gerekiyor. İlk olarak bir


veritabanı tasarlayalım. Biz bunun için bir Access veritabanı hazırlayalım, veritabanının
yapısını aşağıdaki resimde görebilirsiniz.

Access veritabanı oluşturulması

Hazırladığımız fakulte veritabanını C:\Inetpub\wwwroot\WebSite\Veritabani klasörüne


kopyalayalım.

179
Veritabanı İle Bağlantıyı Gerçekleştirmek

SQL Server sunucusuna bağlantı

//veri kaynağına erişmek için çeşitli bilgiler hazırlanır.


String kaynak = ”Provider =SqlOleDb; server=SunucuAdı; uid=Kullanıcı;
pwd=Sifre; database=Northwind;”;

//bağlantı nesnesi kaynak ile oluşturulur.

SqlConnection baglanti=new SqlConnection (kaynak);


//bağlantı nesnesinin Open() metodu kullanılarak bağlantı açılır.
Baglanti.Open();

SQL Server İle Örnek


Sql sunucusu ile bağlantı ilk yapan programımızı bir not defterine yazıp ilk.aspx olarak
wwwroot dizinine kaydedip,Localhosttan çağıralım.

<% @Page language='c#' debug='true' %>


<% @Import namespace='System.Data' %>
<% @Import namespace='System.Data.SqlClient' %>

<SCRIPT runat='server'>

void Page_Load(Object Sender, EventArgs e)


{
SqlConnection baglantı;
baglantı = new SqlConnection("server=localhost;uid=sa; pwd=;
database=pubs;");
baglantı.Open();
Response.Write(""+ baglantı.Database + "Veritabanı İle Bağlantı Açıldı "
+"<BR>");
Response.Write("SQL Sunucusunun Versiyonu " + baglantı.ServerVersion); }
</SCRIPT>

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ı.

OleDb Üzerinden Access Veritabanına Erişim

protected void Page_Load(object sender, EventArgs e)


{
string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source="+Server.MapPath("fakulte.mdb");

//bağlantı nesnesi kaynak ile oluşturulur.


OleDbConnection conn = new OleDbConnection(connStr);

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'>

void Page_Load(Object Sender, EventArgs e)


{
SqlConnection baglantı;
baglantı = new
SqlConnection("server=localhost;uid=sa;pwd=;database=pubs;");
try
{
baglantı.Open();
Response.Write(""+ baglantı.Database + "Veritabanı İle Bağlantı Açıldı "
+"<BR>");
Response.Write("SQL Sunucusunun Versiyonu " + baglantı.ServerVersion
baglantı.Close();
}
catch(SqlException sx)
{
Response.Write("Bağlantı Başarısız: " + sx.Message);
}
}
</SCRIPT>

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)
{

string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data


Source=" + Server.MapPath("fakulte1.mdb");

OleDbConnection conn = new OleDbConnection(connStr);

try
{
conn.Open();
Response.Write("Bağlantı Gerçekleştirildi");
}
catch (Exception ex)
{
Response.Write(ex.Message);
}

conn.Close();

183
OleDbCommand ve OleDbDataReader

OleDbCommand nesnesi bir veri kaynağında ki tablodan SQL cümleciği kullanarak


sorgulama yapmamızı sağlar. OleDbDataReader sınıfı ise OleDbCommand nesnesinin
çalıştırılması ile elde edilen sonuçları okumak için kullanılır. OleDbDataReader sınıfında ki
çeşitli metotlar yardımıyla sorgulama sonucu elde edilen bilgiler okunur. OleDbCommand
nesnesini 3 değişik şekilde oluşturabiliriz:

OleDbCommand Nesnesinin Oluşturulması:

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.

string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +


Server.MapPath("fakulte.mdb");

OleDbConnection conn = new OleDbConnection(connStr);

conn.Open();
Response.Write("Bağlantı Gerçekleştirildi");
String sorgu = "Select Adı, Soyadı FROM Bilgiler";
OleDbCommand komut = new OleDbCommand(sorgu, conn);

conn.Close();

2) İkinci yöntem OleDbCommand nesnesinin CommandType özelliğini TableDirect


olacak şekilde ayarlamaktır. Bu şekilde hazırlanan OleDbCommand nesnesi ile komutu
çalıştırdıktan sonra bir tablonun tamamı elde edilir.

184
protected void Page_Load(object sender, EventArgs e)
{

string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +


Server.MapPath("fakulte.mdb");

OleDbConnection conn = new OleDbConnection(connStr);

conn.Open();
Response.Write("Bağlantı Gerçekleştirildi");
OleDbCommand komut = new OleDbCommand("Bilgiler", conn);
komut.CommandType = CommandType.TableDirect;

conn.Close();

3) Üçüncü yöntem ise veritabanındaki Stored Procedure dediğimiz yordamları çalıştırmak


ve bu yordamlara parametre geçmek için kullanılan yöntemlerdir. Veritabanındaki
Stored Procedure yordamlarına parametre göndermek için OleDbCommand sınıfının
Parameters özelliğinin Add() metodu kullanılabilir.

protected void Page_Load(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();
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.

OleDbCommand Nesnesinin Çalıştırılması:

OleDbCommand ile temsil edilen sorguların çalıştırılması 4 farklı şekilde olabilir.

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.

Örnek: Veri tabanına kayıt eklemek,

<%@ Page Language="C#" AutoEventWireup="true"


CodeFile="Default.aspx.cs" Inherits="_Default" %>

186
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >


<head runat="server">
<title>Basit Kayıt Ekleme</title>
</head>
<body>
<strong><span style="color: #009900; font-family: Verdana">
Kayıt Ekleme için aşağıdaki formu doldurunuz...</span></strong>

<form id="form1" runat="server">


<asp:Label ID="Label1" style="z-index:auto;position:absolute; left:
16px; top: 44px;" runat="server" Text="Numarası:" Font-Names="Verdana"
Font-Bold="True" ForeColor="#0033FF"></asp:Label>
<asp:Label ID="Label2" style="position:absolute; left: 16px; top:
79px;" runat="server" Text="Adı:" Font-Names="Verdana" Font-
Bold="True" ForeColor="#0033FF"></asp:Label>
<asp:Label ID="Label3" style="position:absolute; left: 16px; top:
112px;" runat="server" Text="Soyadı:" Font-Names="Verdana" Font-
Bold="True" ForeColor="#0033FF"></asp:Label>
<asp:Label ID="Label4" style="position:absolute; left: 16px; top:
145px;" runat="server" Text="Bölümü:" Font-Names="Verdana" Font-
Bold="True" ForeColor="#0033FF"></asp:Label>
<asp:Label ID="Label5" style="position:absolute; left: 16px; top:
180px;" runat="server" Text="Danışmanı:" Font-Names="Verdana" Font-
Bold="True" ForeColor="#0033FF"></asp:Label>
<asp:label ID="Label6" runat="server" style="position:absolute; left:
196px; top: 240px;" text=" " Width="154px"></asp:label>

<asp:TextBox ID="TextBox1" runat="server" style="z-index:auto;


position:absolute; left: 196px; top: 46px;"></asp:TextBox>
<asp:TextBox ID="TextBox2" style="position:absolute; left: 196px; top:
79px;" runat="server"></asp:TextBox>
<asp:TextBox ID="TextBox3" style="position:absolute; left: 196px; top:
111px;" runat="server"></asp:TextBox>
<asp:TextBox ID="TextBox4" style="position:absolute; left: 196px; top:
144px;" runat="server"></asp:TextBox>
<asp:TextBox ID="TextBox5" style="position:absolute; left: 196px; top:
179px;" runat="server"></asp:TextBox>
<asp:Button ID="Button1" style="position:absolute; left: 196px; top:
206px;" runat="server" Text="Kayıt" OnClick="Button1_Click"
Width="153px"/>
<asp:Button ID="Button2" style="position:absolute; left: 16px; top:
210px;" runat="server" Text="Formu Temizle" Width="125px"
OnClick="Button2_Click" />
</form>
</body>
</html>

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;

public partial class _Default : System.Web.UI.Page


{
protected void Page_Load(object sender, EventArgs e)
{
Label6.Text = "";
}

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);
}
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 = "";
}
}

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);
}

string sorgu1 = "SELECT COUNT(*) FROM Bilgiler";

OleDbCommand komut1 = new OleDbCommand(sorgu1, conn);


int kayıt = (int)komut1.ExecuteScalar();
conn.Close();
Label1.Text = "Toplam Kayıt Sayısı:"+ kayıt;

}
Çıktı:
Toplam Kayıt Sayısı : 10

ExecuteReader() Metodu:

Çalıştırılan Command nesnesinden geriye kayıt kümesi döndürmek için kullanılır.

Bu metodun SQL sorgusunun SELECT komutu içerdiği durumlarda kullanıldığı sıklıkla


görülür. SELECT komutu ile bir veritabanından bir sorgu yapılarak bir kayıt kümesi elde edilir.
Elde edilen bu kayıt kümesi OleDbDataReader nesnesine aktarılır. OleDbDataReader ile bu
kayıt kümesinden çeşitli yollardan çeşitli yollardan veriler elde edilebilir. ExecuteReader()
metoduna örnek vermeden OleDbDataReader sınıfının özelliklerini inceleyelim.

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ı”];

Bizim oluşturduğumuz Bilgiler tablosundaki “Adı” sütunu 2. sütun olduğu için


yukarıdaki her iki ifade de aynı değeri verecektir. Ayrıca OleDbDataReader sınıfındaki
GetInt32(), GetByte(), GetString() metotları ile de özel değerler elde edilebilir.
Aşağıdaki örnekte ExecuteReader() metodu kullanılarak OleDbDataReader nesnesi ile
Bilgiler tablosunda ki üyelerin numarası, adı ve soyadı ekrana yazdırılıyor.

Örnek: Veri tabanından veri elde etmek,

protected void Page_Load(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);
}

string sorgu = "SELECT * FROM Bilgiler";

OleDbCommand komut = new OleDbCommand(sorgu, conn);


OleDbDataReader ord = komut.ExecuteReader();

string [] a={"Numarası","Adı","Soyadı","Bölümü","Danışmanı"};

TableRow r1 = new TableRow();

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);

string sorgu1 = "SELECT COUNT(*) FROM Bilgiler";

// OleDbCommand komut1 = new OleDbCommand(sorgu1, conn);

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();
}

/* Pasif olan kısımlar aynı işi yapıyor…*/

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.

OleDbDataReader ve OleDbConnection nesneleri ile işimiz bittiğinde Close() metodu


ile bu nesneler için ayrılmış kaynakları serbest bırakırız.

Örnek: Veritabanından veri silmek,


Veri silmek için DELETE komutu kullanılır.

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);

192
}
string a=TextBox1.Text;
string sorgu1 = @"delete from Bilgiler WHERE Numarası='" + a +
"'";
OleDbCommand db_komut= new OleDbCommand(sorgu1 ,conn);

int sayi =db_komut.ExecuteNonQuery();


Response.Write("kayıtlar silindi.." + sayi.ToString());

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)
{

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 a=TextBox1.Text;
string b=TextBox2.Text;
string sorgu2 = @"UPDATE Bilgiler SET Numarası='"+ b +"' WHERE
Numarası='"+a+"'";
OleDbCommand db_update_komut= new OleDbCommand(sorgu2 ,conn);

int sayi = db_update_komut.ExecuteNonQuery();


Response.Write("kayıt güncellendi.." + sayi.ToString());
conn.Close();
}

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.

DataSet, DataAdapter, DataTable, DataRow, DataColumn

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.

DataSet veri kaynağından bağımsız olarak veriler üzerinde işlem yapmamızı ve


gerektiğinde DataAdapter yardımıyla DataSet üzerindeki verileri tekrar veri kaynağına
aktarmamızı sağlar.

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.

DataColumn dc= new DataColumn("No",typeof(int));

Sütunun boş değer kabul edip etmeyeceği belirtilir.

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;

Otomatik olarak artacak değerin başlangıç değeri.

dc.AutoIncrementSeed=10;

Artan değerin her kayıt eklemede ne kadar artacağı.

dc.AutoIncrementStep=1;

Sütunun hangi isim ile temsil edildiğini belirtir.

dc.Caption="No";

Sütunun veri tipini bildirir.

dc.DataType=typeof(int);

Bir sütundaki verinin varsayılan değerini belirler.

dc.DefaultValue=(Object)"*";

Sütunun içereceği maximum karakter sayısını belirler.

dc.MaxLength=10;

Sütunun bir sütun koleksiyonunda kaçıncı sırada olduğunu verir. Okunabilir bir özelliktir.

Response.Write(dc.Ordinal);

Sütunun tekil değerler içerip içermeyeceği belirtilir.

195
dc.Unique=true;

Sütunun hangi tabloya ait olduğunu verir.

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.

Data Set Uygulaması:

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;

public partial class Data_set : System.Web.UI.Page


{
protected void Page_Load(object sender, EventArgs e)
{
string connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=" + Server.MapPath("fakulte.mdb");
OleDbConnection baglan = new OleDbConnection(connStr);
try
{
baglan.Open();
}
catch (Exception ex)
{
Response.Write(ex.Message);
}

string sorgu = "SELECT * FROM Bilgiler";


OleDbDataAdapter adp = new OleDbDataAdapter(sorgu, baglan);
DataSet ds = new DataSet();

196
adp.Fill(ds, "Bilgiler");

foreach (DataColumn dc in ds.Tables["Bilgiler"].Columns)


Response.Write("<center>"+"Sütun Adı : " + dc.Caption + ",
Veri Tipi : " + dc.DataType.ToString() +"</center>"+ "<br>");

Response.Write("<center>----------------Bilgiler
Tablosu--------------</center>" + "<br>");

TableRow r1 = new TableRow();

foreach (DataColumn dc in ds.Tables["Bilgiler"].Columns)


{
TableCell c1 = new TableCell();
c1.Controls.Add(new LiteralControl(dc.Caption));
r1.Cells.Add(c1);
}
Table1.Rows.Add(r1);

// Response.Write(dc.Caption+" .... ");

// Response.Write("<br>");

//
Response.Write("-----------------------------------------------------"
);

foreach (DataRow dr in ds.Tables["Bilgiler"].Rows)


{ TableRow r = new TableRow();
object[] dizi = dr.ItemArray;
foreach (object i in dizi)
{
TableCell c = new TableCell();
c.Controls.Add(new LiteralControl(i.ToString()));
r.Cells.Add(c);
//Response.Write(i.ToString()+"<br>");

}
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.

foreach (DataColumn dc in ds.Tables["Bilgiler"].Columns)


Response.Write("<center>"+"Sütun Adı : " + dc.Caption + ",
Veri Tipi : " + dc.DataType.ToString() +"</center>"+ "<br>");

Komut satırlarıyla Bilgiler tablosun da ki sütunlar ve veri tipleri ekrana yazdırıldı.

foreach (DataRow dr in ds.Tables["Bilgiler"].Rows)


{ TableRow r = new TableRow();
object[] dizi = dr.ItemArray;
foreach (object i in dizi)
{
TableCell c = new TableCell();
c.Controls.Add(new LiteralControl(i.ToString()));
r.Cells.Add(c);
//Response.Write(i.ToString()+"<br>");

}
Table1.Rows.Add(r);

Bu foreach döngüsünde ise Bilgiler tablosundan kayıtlar okunup dizi nesnesine


aktarılıyor ve ardından ekrana yazdırılıyor.

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.

DataAdapter nesnesinin Update() metodu çağrıldığında DataSet’te bulunan verilerin


veritabanına ne şekilde kaydedileceğini, DataAdapter nesnesinin InsertCommand özelliği
belirlemektedir. InsertCommand nesnesinin CommandText özelliği ile yeni kayıt eklemek için
gerekli SQL cümleciği yazılmaktadır. Connection özelliğine ise bağlantı nesnesi atanmaktadır.
Parameters özelliğinin Add() metodu ile veritabanındaki her bir sütunun veri türü ve hangi
parametreye denk geldiği belirtilmektedir.

Önceki sayfalarda ExeCuteNonQuery() metoduyla veritabanına bir kayıt eklemiştik.


Burada ise OleDbDataAdapter nesnesinin InsertCommand özelliğini kullanarak veritabanına
kayıt ekleyeceğiz.

DataRow ve DataAdapter Uygulaması (Kayıt Ekleme)


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.Data.OleDb;

public partial class _Default : System.Web.UI.Page


{
protected void Page_Load(object sender, EventArgs e)
{
Label6.Text = "";

protected void Button1_Click(object sender, EventArgs e)


{

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.

DataSet nesnelerinin veritabanında güncellenmesi için yapmamız gereken en önemli iş,


DataSet’te yapılan her değişikliğin DataAdapter ile nasıl bir ilişkisinin olduğunu belirlemektir.
Örneğin DataSet’e eklenen bir kayıt için DataAdapter nesnesin InsertCommand nesnesinin
InsertCommand nesnesinin CommandText özelliğini uygun bir SQL sorgusu ile belirtmemiz
gibi. Diğer bir önemli nokta ise DataSet’teki veri türleri ile gerçek veritabanındaki sütunların
tipi arasındaki uyumluluktur. Bu uyumluluğu sağlamak için Parameters’in Add() metodunda
ikinci parametre olarak OleDbType numaralandırıcısı ile uygun bir veri türü seçilmektedir.

201
GridView Kontrolünde Update,Delete İşlemleri

Access veri kaynağına bağlanacağımız bir web sayfamız olacak. Bu sayfada


kullancağımız GridView kontrolünü veri güncelleme ve silme işlemleri için
kullanacağız. Bu örneği geliştirebilmemiz için, GridView kontrolünü Access
veritabanımıza bağlayacak bir DataSource kontrolüne ihtiyacımız var. Access
veritabanlarına bağlanmak ve ilgili veritabanı üzerindeki tablolarda işlem
yapabilmek için, .net Framework 2.0 ile gelen yeni nesnelerden birisi olan
AccessDataSource kontrolünü kullanacağız. Oluşturduğunuz tabloyu, web sitemiz
için standart olarak açılan klasörün altına kopyalayın.

Öncelikli olarak, AccessDataSource kontrolümüzü aşağıdaki aspx kodları ile sayfaya


ekleyelim.

<asp:AccessDataSource ID="AccessDataSource1" runat="server"


DataFile="~/fakulte.mdb"
SelectCommand="SELECT [Numarası], [Adı], [Soyadı],
[Bölümü], [Danışmanı] FROM [Bilgiler]"
UpdateCommand="UPDATE [Bilgiler] Set
Adı=@Adı,Soyadı=@Soyadı,Bölümü=@Bölümü, Danışmanı=@Danışmanı WHERE
Numarası=@Numarası" >
<UpdateParameters>
<asp:Parameter Name="Adı"></asp:Parameter>
<asp:Parameter Name="Soyadı"></asp:Parameter>
<asp:Parameter Name="Numarası></asp:Parameter>
<asp:Parameter Name="Bölümü></asp:Parameter>
<asp:Parameter Name="Danışmanı></asp:Parameter>
</UpdateParameters>

</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.

UpdateCommand özelliğindeki Sql sorgusunda yer alan parametreler,


AccessDataSource kontrolünün UpdateParameters koleksiyonunda birer Parameter
nesnesi olarak tanımlanırlar. Basitçe burada parametrelerimizin isimlerini Name
özellikleri ile belirledik. DataSource bileşenleri için, SelectCommand ve
UpdateCommand komutları dışında kullanılabilecek diğer komutlarda,
DeleteCommand ve InsertCommand’ dir. Bunların herbirinin parametre
koleksiyonları farklıdır. Yani DeleteCommand için parametre koleksiyonu
DeleteParameters iken, InsertCommand için InsertParameters’ dır.

203
<form id="form1" runat="server">
<div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<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&#246;l&#252;m&#252;"
HeaderText="B&#246;l&#252;m&#252;"
SortExpression="B&#246;l&#252;m&#252;" />
<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.

Bir önemli özelliğimiz ise, yine properties penceresinden erişebileceğiniz AllowPaging.


Eğer GridView imizde veriler fazla olduğunda otomatik olarak sayfalama yapmak
istersek bu değeri true olarak değiştirmemiz gerekecektir.

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.

Silme işlemide güncelleme(Update) işleminin benzeridir.


<asp:AccessDataSource ID="AccessDataSource1" runat="server"
DataFile="~/fakulte.mdb"
SelectCommand="SELECT [Numarası], [Adı], [Soyadı],
[Bölümü], [Danışmanı] FROM [Bilgiler]"
UpdateCommand="UPDATE [Bilgiler] Set
Adı=@Adı,Soyadı=@Soyadı,Bölümü=@Bölümü, Danışmanı=@Danışmanı WHERE
Numarası=@Numarası"
DeleteCommand ="DELETE FROM [Bilgiler] WHERE
Numarası=@Numarası">

<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

.Net platformunda XML’in önemi çok büyüktür. Çünkü hem Framework’ün


konfigürasyon dosyalarının çoğu XML tabanlıdır hem de ADO.NET gibi büyük bir kütüphane
XML ile iç içe çalışmaktadır. XML yeni neslin iletişim dilidir. Günümüzde farklı platformdaki
sistemler birbirleri ile haberleşirken XML dilini kullanırlar. Daha doğrusu XML bu haberleşme
için bir araç olmuştur. Bunda elbette ki XML dilinin herhangi bir platforma özgün olmamasının
büyük payı vardır. Biz bu kısımda var olan XML belgelerini C# ile nasıl düzenleyebileceğimize
ve XML belgelerinde ki bilgileri nasıl elde edebileceğimize bakacağız.

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.

02531042, İBRAHİM, ÖZ, BİLGİSAYAR, ERKAN TANYILDIZI


02531029, ŞABAN, KAYABEY, BİLGİSAYAR, ERKAN TANYILDIZI

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

<?xml version="1.0" encoding="utf-8" ?>


<yemekler>
<menu adı="Seçenek 1">
<corba>Mercimek</corba>
<ana_yemek>Döner</ana_yemek>
<tatlı>Kadayıf</tatlı>
</menu>
<menu adı="Seçenek 2">
<corba>Domates Çorbası</corba>
<ana_yemek>Balık</ana_yemek>
<tatlı>Künefe</tatlı>
</menu>
</yemekler>

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.

XmlDocument. Load() Metodu

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)

<?xml version="1.0" encoding="utf-8"?>

<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>

Şekil–4.2: Yukarıdaki kodların çıktısını gösteren şekil

(loadmetodu.aspx)

213
<%@ Import Namespace="System.Xml" %>

<html xmlns="http://www.w3.org/1999/xhtml" >

<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>

Xd isimli bir XmlDocument nesnesi oluşturulmuştur. Xd nesnesinin load metodu ile


kitaplar.xml belgesi yüklenmiştir ve OuterXml ile elde edilen bilgi Response.Write ile
yazdırılmıştır.

System.Xml İsim Alanı

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.

XmlTextWriter: XML akımlarını dosya sisteminde oluşturmak için kullanılır.

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.

Şimdi XML belgelerinden okuma yapan ve XML belgelerine yazma yapan


XmlTextWriter ve XmlTextReader sınıflarını inceleyelim. Öncelikle her iki sınıfında özet sınıf
olduğunu belirtelim. Bu sınıflar sırasıyla XmlWriter ve XmlReader sınıfından türemiştir.
XmlTextWriter ve XmlTextReader sınıfları XML belgesi ile bir akım gibi çalıştığı için daha
yüksek performansa sağlanır. Bu iki grup sınıfın yaptığı işler tamamen aynıdır.

XmlTextReader Sınıfı

XMLTextReader, bir XML belgesinden okuma yapmamızı sağlar. Bir XmlTextReader


nesnesi oluşturmanın birçok yolu vardır. Yani XmlTextReader sınıfının birçok bir çok yapıcı
metodu vardır. Bunlardan en sık kullanılan üçü aşağıda verilmiştir.

XmlTextReader(string dosya_yolu): Bu yapıcı metot ile parametrede belirtilen XML


belgesine ilişkin bir nesne oluşturulur. Örnek:

string dosya="ilkuygulama.xml";
XmlTextReader= new XmlTextReader(dosya);

XmlTextReader(Stream akım): Oluşturulan nesne, parametre ile belirtilen Stream türünden


bir nesneye ilişkindir. Stream nesnesi bir FileStream olabileceği gibi NetworkStream de olabilir.
Örnek:

string dosya=”ilkuygulama.xml”;
FileStream fs=new FileStream(dosya, FileMode.Open)
XmlTextReader= new XmlTextReader(fs);

XmlTextReader(XmlTextReader text_reader): Bu yapıcı metot ile XmlTextReader


nesnesine ilişkin yeni bir nesne oluşturulur.

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

<?xml version="1.0" encoding="utf-8" ?>


<yemekler>
<menu adı="Seçenek 1">
<corba>Mercimek</corba>
<yemek>
<ana_yemek>Döner</ana_yemek>
<ana_yemek>Adana</ana_yemek>
</yemek>
<tatlı>Kadayıf</tatlı>
</menu>
<menu adı="Seçenek 2">
<corba>Domates Çorbası</corba>
<yemek>
<ana_yemek>Balık</ana_yemek>
<ana_yemek>Tavuk</ana_yemek>
</yemek>
<tatlı>Künefe</tatlı>
</menu>
</yemekler>

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";

XmlTextReader xtr = new XmlTextReader(yol);

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.

Tablo-: XmlNodeType numaralandırıcısının diğer sembolleri


Attribute CDATA Comment
Document DocumetFragment DocumentType
Element EndElement EndEntity
Entity EntityReference None
Notation ProcessingInstruction XmlDecleration
Text Whitespace XmlDecleration

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.

XmlTextReader sınıfının diğer iki önemli metodu MoveToAttribute() ve


MoveToElement ‘tir. Bu metotlar elemanın ya da niteliğin sıra indeksine göre XmlTextReader
imlecini ilgili elmana konumlandırır. Bu özellik ve metotların yanı sıra XmlTextReader
sınıfının birçok özelliği ve metodu bulunmaktadır. Bunların tamamına MSDN kütüphanesinden
erişebilirsiniz.

ReadChar Metodu:

218
Bir Xml belgesinden karakterleri okumak için kullanılır. Kullanılış şekli aşağıdaki
gibidir.

public int ReadChars(


char[] kelime,
int başlangıç,
int sayı
);
Kelime: Okunanan karakterlerin saklandığı dizidir.
Başlangıç : Metodun okuma işlemine başlayacağı karakterin indexini belirtir.
Sayı: Kaç karakterin okunacağı belirtilir.
Şimdi ReadChar metodunun kullanılışı hakkında daha fazla bilgi edinmek için bir xml
belgesinden belirlediğimiz sayıda karakter okuyan bir program yazalım.
(ConsoleApplication)

using System;
using System.Xml;

// ReadChar metodunu kullanarak Xml Belgesinden Veri Okuma


public class okuxml
{
private const String dosyaadı = "nesne.xml";

public static void Main()


{
XmlTextReader oku = null;
try
{
// ReadChars metodunun değişkenleri tanımlandı
Char []kelime;
int sayı = 0;
int karaktersay;
// Xml Belgesi İle Oku metodu Bağlantısı Kuruldu
oku = new XmlTextReader(dosyaadı);
oku.WhitespaceHandling = WhitespaceHandling.None;

219
// ReadChars metodunun değişken değerleri girildi
karaktersay = 15;
kelime = new Char[karaktersay];

// Xml Belgesinden İçerik Okunur


oku.MoveToContent();
while ( (sayı = oku.ReadChars(kelime,0,karaktersay)) > 0 )
{
// Okunan Karakterler Ekrana Yazdırıldı.
Console.WriteLine (" Okunan Karakter Sayısı:" + sayı);
Console.WriteLine (" Okunanan Kelime: [{0}]", new
String(kelime,0,sayı));
// Kelime adlı dizi sıfırlandı
Array.Clear(kelime,0,karaktersay);
}
}
finally
{
if (oku!=null)
oku.Close();
}
Console.Read();
}
}

Yukarıdaki programda dosyaadı ile nesne.xml belgesini programa dahil ettik ve


yazdığımız kodlarla 15 er karakter belgeden okunup ekrana yazdırıldı. Programı derlemeden
önce oluşturduğumuz nesne.xml belgesini ConsoleApplication ile aynı klasöre atmayı
unutmayalım.

220
Şekil–4.4: Yukarıdaki kodların çıktısını gösteren şekil

Programla Yolu İle XML Dosyası Oluşturma:

Programla yolu ile XML dosyalarını oluşturmak için XmlTextWriter sınıfını


kullanabiliriz. XmlTextWriter sınıfı her bir düğüm çeşidini yazdırmak için Write ile başlayan
birçok metoda sahiptir. XmlTextWriter sınıfının kullanımı oldukça basittir. Konunun daha iyi
anlaşılabilmesi için aşağıdaki uygulamayı yazıp inceleyelim.

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

Programı derleyip çalıştırdıktan sonra C sürücüsünde oluşturulan xml dosyasını


çalıştırdığımızda yukarıdaki görüntüyü elde ederiz.

Uygulama3.xml dosyasından da görüldüğü gibi düzenli ve okunabilir bir XML dosyası


oluşturuldu. Şimdi programı ve XmlTextWriter sınıfını daha yakından inceleyelim. Öncelikle
Xml belgesini oluşturacak bilgiler bir Hashtable koleksiyonu şeklinde oluşturuldu. Daha sonra
bu Hashtable nesnesi okunarak XML belgesine aktarıldı.

XmlTextWriter Sınıfı

XmlTextWriter sınıfının 3 tane yapıcı metodu vardır. Bütün yapıcı metotlar


oluşturulacak XML dosyasına ilişkin bilgileri parametre olarak alır. Bu metotlar aşağıdaki
gibidir:

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.

XmlTextWriter(Stream akım, System.Text.Encoding kodlama): Bu yapıcı metot ile


oluşturulacak XML dosyasına ilişkin akım bilgisi alınmaktadır. Bu akım bir NetworkStream
olabileceği gibi bir FileStream nesnesi de olabilir. İkinci parametrenin işlevi birinci metodun ki
ile aynıdır.

XmlTextWriter(TextWriter tw): Bu yapıcı metot ile oluşturulacak XML belgesinin


System.IO isim alanında bulunan TextWriter üzerinden yapılacağı bildiriliyor.

Bu programda biz birinci yapıcı metodu kullandık. Encoding parametresi olarak

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.

XML belgesinin bizim rahat okuyabileceğimiz bir formatta oluşturulması için

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.

<!—Türkçe İngilizce Sözlük-->

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.

DOM(Document Object Model)

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.

XmlTextReader xr=new XmlTextReader("C:/uygulama4.xml");


XmlDocument xd=new XmlDocument();
xd.Load();

XmlDocument sınıfının sık kullanılan bazı özellikleri aşağıda verilmiştir.

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.

NextSibling: Üzerinde çalışılan düğümden hemen sonra gelen düğümü verir.

PreviousSibling: Üzerinde çalışılan düğümden bir önce gelen düğümü 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.

Name: Bir düğümün ismini verir.

Value: Bir düğüme ilişkin değeri verir.

NodeType: Düğümün hangi tipte olduğunu XmlNodeType numaralandırması ile verir.

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)

void Page_Load(Object Sender,EventArgs e)


{
XmlDocument xd = new XmlDocument();
XmlNode ndkitap;

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.

Şekil–4.6: Yukarıdaki kodların çıktısını gösteren şekil

.XmlDocument Sınıfının Kullanımına Bir Örnek:


(Uygulama5)

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();
}
}

Şekil–4.7: Yukarıdaki kodların çıktısını gösteren şekil

ASP.NET ‘ten Xml’e Bağlantı


(xml1.aspx)

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.

<% @Page language="C#" debug="true" %>


<%@ Import Namespace="System.Xml" %>

<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"));

satırıyla uygulamamızda kullanacağımız ilkuygulama.xml belgesi programa dahil edilmiştir.

Response.Write (xd.OuterXml);

satırında OuterXml özelliği ile okunan veri yazdırılmıştır.

230
Şekil–5.1: Yukarıdaki kodların çıktısını gösteren şekil

Uygulama

Oluşturacağımız bir ASP.NET sayfasıyla ADO.NET tekniklerini kullanarak bir


veritabanından elde ettiğimiz verileri XML belgesi şeklinde yazalım.(WebApplication43)

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.

private void Button1_Click(object sender, System.EventArgs e)


{

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ı

Veritabanıyla bağlantı yapabilmek için SqlConnection cn; SqlCommand cm;


SqlDataReader dr; nesnelerini tanımladık. Hangi veritabanını kullanacağımızı programa sunmak
için aşağıdaki kodu yazdık.

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";

ExecuteReader(); ile sorgu nesnesinden alınan bilgiler dr isimli DataReader nesnesine


atandı.

cm = new SqlCommand(sorgu, cn);

233
dr = cm.ExecuteReader();

object türünden DataReader nesnesinden okunan veriler stringe çevrilerek TextBoxlara


yazıldı ve tablodaki kolon isimleri yazacağımnız xml belgesinde kullanılmak üzere dizi isimli
dizide saklandı.

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.

Hashtable Uyeler =new Hashtable();


Uyeler.Add(TextBox1.Text,"");
Uyeler.Add(TextBox2.Text,"");
Uyeler.Add(TextBox3.Text,"");
Uyeler.Add(TextBox4.Text,"");
Uyeler.Add(TextBox5.Text,"");
XmlTextWriter xw=new XmlTextWriter ( "C : / Inetpub / wwwroot /
WebApplication43/ adonetxml.xml ", System.Text.Encoding.GetEncoding("windows-
1254"));
xw.Formatting=Formatting.Indented;
xw.WriteStartDocument();
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++;
}
xw.WriteEndElement();
xw.WriteEndDocument();

234
xw.Close();
cn.Close();
}
}

TextBoxlardan alınan bilgiler Uyeler isimli diziye atandı.

XmlTextWriter xw=new XmlTextWriter ( "C : / Inetpub / wwwroot /


WebApplication43/ adonetxml.xml ", System.Text.Encoding.GetEncoding("windows-
1254"));

XmlTextReader nesnesi ile oluşturacağımız xml belgesinin adı, konumu ve karakter


bilgisini tanımladık.

xw.Formatting=Formatting.Indented

Xml belgesini formatlı bir şekilde görebilmek için Formatting.Indented özelliğini kullandık.

xw.WriteComment("Uyeler Tablosu");

Sayfanın başlığını yazdırdık.

xw.WriteStartElement("Uyeler");

Xml belgesi yazılırken başlangıç elemanı belirlendi.

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.

Tablodan oku butonuna bastıktan sonraki görüntü;

Şekil–5.3: Yukarıdaki kodların çıktısını gösteren şekil

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

1) Her Yönüyle C#, Sefer Algan (Pusula Yayınları)


2) www.programlama.com
3) www.csharpnedir.com
4) Msdn Dökümanları
5) www.msakademik.net
6) C#® Developer's Guide to ASP.NET, XML, and ADO.NET By
Jeffrey P. McManus, Chris Kinsman
7) Demirkol, Zafer : C# ile ASP.NET (İstanbul : Pusula Yayınevi, 2005).
8) Jones, A.Russell : ASP.NET with C#, South of ireland (Dublin: Sybex
Yayınevi, 2002).
9) http://www.aspindir.com
10) http://www.godoro.com/Divisions/Ehil/Mecmua/Magazines/Columns/txt/html/
article_ProgrammingAdvice.html

237

You might also like