3. Web Geliştirmeye Giriş ASP.NET
3.1. Introduction
Önceki bölümde, kullanılan programlama dilinden bağımsız olan web geliştirme ilkeleri tanıtılmıştır. Şu anda, web geliştirme pazarında üç teknoloji hakimdir:
- J2EE, bir Java geliştirme platformudur. Çeşitli uygulama sunucularına kurulan Struts teknolojisiyle birlikte kullanılan J2EE platformu, esas olarak büyük projelerde kullanılmaktadır. Kullanılan dil olan Java sayesinde, bir J2EE uygulaması başlıca işletim sistemlerinde (Windows, Unix, Linux, Mac OS, ...) çalışabilir.
- PHP ise işletim sisteminden bağımsız bir yorumlu dildir. Java'nın aksine, bu nesne yönelimli bir dil değildir. Ancak PHP5 sürümü, dile nesne kavramını getirmelidir. Erişimi kolay olan PHP, küçük ve orta ölçekli projelerde yaygın olarak kullanılmaktadır.
- ASP.NET, yalnızca .NET platformuna sahip Windows makinelerde (XP, 2000, 2003, ...) çalışan bir teknolojidir. Kullanılan geliştirme dili, .NET ve c.a.d ile uyumlu herhangi bir dil olabilir. Microsoft dilleri (C#, VB.NET, J#), Borland’ın Delphi’si, Perl, Python vb. dahil olmak üzere ondan fazla dil mevcuttur.
Önceki bölümde, bu üç teknolojinin her biri için kısa örnekler sunulmuştu. Bu belge, ASP.NET diliyle yapılan VB.NET web geliştirme sürecini ele almaktadır. Bu dilin bilindiğini varsayıyoruz. Bu nokta önemlidir. Burada yalnızca web geliştirme bağlamındaki kullanımına odaklanacağız. MVC web geliştirme metodolojisinden bahsederek bu konuyu daha ayrıntılı olarak açıklayalım.
MVC modeline uygun bir web uygulaması şu şekilde yapılandırılacaktır:

3 katmanlı veya 3 seviyeli olarak adlandırılan bu mimari, MVC (Model View Controller) modeline uymayı amaçlar:
- kullanıcı arayüzü V'dir (görünüm)
- uygulama mantığı C'dir (denetleyici)
- veri kaynakları ise M'dir (Model)
Kullanıcı arayüzü genellikle bir web tarayıcısıdır, ancak ağ üzerinden web hizmetine istekler gönderen ve bu hizmetin gönderdiği sonuçları biçimlendiren bağımsız bir uygulama da olabilir. Uygulama mantığı, kullanıcı isteklerini işleyen komut dosyalarından oluşur. Veri kaynağı genellikle bir veritabanıdır, ancak basit düz dosyalar, bir LDAP dizini, uzak bir web hizmeti vb. de olabilir. Geliştiricinin, bu üç varlık arasında büyük bir bağımsızlık sağlaması önemlidir; böylece bunlardan biri değiştiğinde, diğer ikisinin değişmesi gerekmez veya çok az değişir.
- Uygulamanın iş mantığı, istek-yanıt diyaloğunu kontrol eden sınıftan ayrı sınıflara yerleştirilecektir. Böylece, yukarıdaki [Logique applicative] bloğu aşağıdaki öğelerden oluşabilir:

[Logique Applicative] bloğunda ise
- uygulamanın giriş kapısı olan denetleyici sınıfı.
- uygulamanın mantığı için gerekli sınıfları bir araya getiren [Classes métier] bloğu. Bu sınıflar istemciden bağımsızdır.
- servlet için gerekli verileri elde etmek üzere gerekli sınıfları bir araya getiren [Classes d'accès aux données] bloğu; bu veriler genellikle kalıcı verilerdir (BD, dosyalar, WEB hizmeti, ...)
- Uygulamanın görünümlerini oluşturan ASP sayfaları bloğu.
Basit durumlarda, uygulama mantığı genellikle iki sınıfa indirgenir:
- istemci-sunucu iletişimini sağlayan denetleyici sınıfı: isteğin işlenmesi, çeşitli yanıtların oluşturulması
- kontrolörden işlenecek verileri alan ve karşılığında sonuçları kontrolöre sağlayan iş sınıfı. Bu iş sınıfı, kalıcı verilere erişimi kendisi yönetir.
Web geliştirmenin özgünlüğü, kontrolör sınıfının ve sunum sayfalarının yazılmasına dayanır. İşletme sınıfları ve veri erişim sınıfları, hem web uygulamalarında hem de Windows uygulamalarında, hatta konsol türü uygulamalarda kullanılabilen klasik .NET sınıflarıdır. Bu sınıfların yazılması, nesne yönelimli programlama konusunda iyi bir bilgi birikimi gerektirir. Bu belgede, bu sınıflar VB.NET dilinde yazılacaktır; dolayısıyla bu dilin iyi bir şekilde bilindiği varsayılmaktadır. Bu bağlamda, veri erişim koduna gereğinden fazla ayrıntı girmeye gerek yoktur. ASP.NET ile ilgili kitapların neredeyse tamamında, ADO.NET'e ayrılmış bir bölüm bulunmaktadır. Yukarıdaki şema, verilere erişimin, web bağlamında kullanıldıklarının farkında olmayan tamamen klasik .NET sınıfları aracılığıyla sağlandığını göstermektedir. Web uygulamasının takım lideri olan denetleyici, ADO.NET ile ilgilenmek zorunda değildir. Kontrolörün tek bilmesi gereken, ihtiyaç duyduğu verileri hangi sınıftan ve nasıl talep edeceği. Hepsi bu kadar. Kontrolöre ADO.NET kodunu eklemek, yukarıda açıklanan MVC kavramına aykırıdır ve bunu yapmayacağız.
3.2. Araçlar
Bu belge öğrencilere yöneliktir, bu nedenle internetten indirilebilen ücretsiz araçlarla çalışacağız:
- .NET platformu (derleyiciler, belgeler)
- Cassini web sunucusunu da içeren WebMatrix geliştirme ortamı
- çeşitli SGBD araçları (MSDE, MySQL)
Okuyucunun, bu farklı araçların nereden bulunabileceğini ve nasıl kurulacağını gösteren "Web Araçları" ekine bakması önerilir. Çoğu zaman, sadece üç araca ihtiyacımız olacaktır:
- web uygulamalarını yazmak için bir metin düzenleyici.
- VB.NET kodunu yazmak için bir geliştirme aracı (bu kod önemli olduğunda). Bu tür araçlar genellikle kod yazma yardımı (otomatik kod tamamlama) ve kod yazılırken ya da derleme sırasında sözdizimsel hataları bildirir.
- Yazılan web uygulamalarını test etmek için bir web sunucusu. Bu belgede Cassini ele alınacaktır. IIS sunucusuna sahip okuyucular, Cassini'yi IIS ile değiştirebilirler. Her ikisi de .NET ile uyumludur. Ancak Cassini yalnızca yerel istekleri (localhost) yanıtlayabilirken, IIS harici makinelerden gelen istekleri de yanıtlayabilir.
VB.NET ile geliştirme yapmak için mükemmel bir ticari ortam, Microsoft'un Visual Studio.NET'sidir. Bu çok zengin özelliklere sahip IDE, her türlü belgeyi (VB.NET kodu, HTML belgeleri, XML, stil sayfaları vb.) yönetmeye olanak tanır. Kod yazımı sırasında, otomatik kod "tamamlama" özelliği sayesinde çok değerli bir yardım sunar. Bununla birlikte, geliştiricinin verimliliğini önemli ölçüde artıran bu aracın, sahip olduğu avantajların bir dezavantajı da vardır: geliştiriciyi, etkili olsa da her zaman uygun olmayan standart bir geliştirme moduna hapseder.
Cassini sunucusunu [WebMatrix] dışında kullanmak mümkündür ve bunu sık sık yapacağız. Sunucunun yürütülebilir dosyası <WebMatrix>\<sürüm>\WebServer.exe konumunda bulunur; burada <WebMatrix>, [WebMatrix]'in kurulum dizini ve <version> ise sürüm numarasıdır:

Bir DOS penceresi açalım ve Cassini sunucusunun klasörüne gidelim:
E:\Program Files\Microsoft ASP.NET Web Matrix\v0.6.812>dir
...
29/05/2003 11:00 53 248 WebServer.exe
...
[WebServer.exe] komutunu herhangi bir parametre olmadan çalıştıralım:

Yukarıdaki panel, [WebServer/Cassini] uygulamasının üç parametre kabul ettiğini gösteriyor:
- /port: web hizmetinin bağlantı noktası numarası. Herhangi bir değer olabilir. Varsayılan değer 80'dir
- /path: diskteki bir klasörün fiziksel yolu
- /vpath: önceki fiziksel klasöre bağlı sanal klasör.
Örneklerimizi, bu belgenin farklı bölümleri için chap1, chap2, ... klasörlerini içeren, kök dizini P olan bir dosya ağacına yerleştireceğiz. Bu fiziksel P klasörüne sanal yol V'yi eşleştireceğiz. Ayrıca, Cassini'yi aşağıdaki DOS komutuyla çalıştıracağız:
Örneğin, sunucunun fiziksel kök dizinini [D:\data\devel\aspnet\poly] ve sanal kök dizinini [aspnet] olarak belirlemek istiyorsak, web sunucusunu başlatmak için kullanacağımız DOS komutu şöyledir:
Bu komutu bir kısayola ekleyebilirsiniz. Cassini başlatıldığında görev çubuğuna bir simge yerleştirilir. Bu simgeye çift tıklayarak sunucunun Durdur/Başlat paneline erişebilirsiniz:

Panel, başlatılırken kullanılan üç parametreyi gösterir. İki adet başlatma/durdurma düğmesi ve web ağacının kök dizinine yönlendiren bir test bağlantısı sunar. Bu bağlantıyı takip ediyoruz. Bir tarayıcı açılır ve URL [http://localhost/aspnet] sayfası istenir. Yukarıdaki [Physical Path] alanında belirtilen klasörün içeriğini elde ediyoruz:

Örnekte, istenen URL bir web belgesine değil bir klasöre karşılık geldiğinden, sunucu belirli bir web belgesi yerine bu klasörün içeriğini görüntüledi. Bu klasörde [default.aspx] adlı bir dosya varsa, bu dosya görüntülenecektir. Örneğin, aşağıdaki dosyayı oluşturup Cassini web dizin yapısının kök dizinine (burada d:\data\devel\aspnet\poly) yerleştirelim:
Şimdi bir tarayıcıyla URL [http://localhost/aspnet] adresini açalım:

Görüyoruz ki aslında görüntülenen URL ve [http://localhost/aspnet/default.aspx]'tir. Belgenin devamında, Cassini'nin Cassini(path,vpath) notasyonu ile nasıl yapılandırılması gerektiğini açıklayacağız; burada [path], sunucunun web dizin ağacının kök klasörünün adı, [vpath] ise buna ilişkin sanal yoldur. Cassini(path,vpath) sunucusunda, [http://localhost/vpath/XX] URL’sinin fiziksel yol [path\XX]’e karşılık geldiğini hatırlayalım. Tüm belgelerimizi <webroot> adını vereceğimiz bir fiziksel kök dizin altına yerleştireceğiz. Böylece <webroot>\chap2\here1.aspx dosyasından bahsedebileceğiz. Her okuyucu için bu <webroot> kökü, kendi kişisel bilgisayarındaki bir klasör olacaktır. Buradaki ekran görüntülerinde bu klasörün genellikle [d:\data\devel\aspnet\poly] olduğu görülecektir. Ancak testler farklı bilgisayarlarda yapıldığından, bu her zaman böyle olmayacaktır.
3.3. İlk örnekler
VB.NET ile oluşturulan dinamik web sayfalarının basit örneklerini sunacağız. Okuyucunun, geliştirme ortamının doğru şekilde kurulduğunu doğrulamak için bunları test etmesi önerilir. Bir ASP.NET sayfasını oluşturmanın birkaç yolu olduğunu göreceğiz. Geliştirme çalışmalarımızın devamı için bunlardan birini seçeceğiz.
3.3.1. Temel örnek - varyant 1
Gerekli araçlar: bir metin düzenleyici, Cassini web sunucusu
Bir önceki bölümdeki örneği ele alıyoruz. Aşağıdaki [heure1.aspx] dosyasını oluşturuyoruz:
<html>
<head>
<title>Demo asp.net </title>
</head>
<body>
Il est <% =Date.Now.ToString("T") %>
</body>
</html>
Bu kod, özel bir <% ... %> etiketine sahip HTML kodudur. Bu etiket içine VB.NET kodu yerleştirilebilir. Buradaki kod
kodu, o anki saati temsil eden bir C karakter dizisi üretir. <% ... %> etiketi daha sonra bu C karakter dizisiyle değiştirilir. Dolayısıyla, C karakter dizisi 18:11:01 ise, VB.NET kodunu içeren HTML satırı şu şekilde olur:
Yukarıdaki kodu [<webroot>\chap2\heure1.aspx] dosyasına yerleştirelim. Cassini'yi (<webroot>,/aspnet) çalıştıralım ve bir tarayıcıyla URL [http://localhost/aspnet/chap2/heure1.aspx] adresini açalım:

Bu sonucu elde ettiğimizde, geliştirme ortamının doğru bir şekilde kurulduğunu anlarız. [heure1.aspx] sayfası, VB.NET kodunu içerdiği için derlenmiştir. Derleme işlemi sonucunda bir dll dosyası oluşturulmuş, bu dosya bir sistem klasörüne kaydedilmiş ve ardından Cassini sunucusu tarafından çalıştırılmıştır.
3.3.2. Temel örnek - varyant 2
Gerekli araçlar: bir metin düzenleyici, Cassini web sunucusu
[heure1.aspx] belgesi, HTML kodunu ve VB.NET kodunu bir arada içerir. Bu kadar basit bir örnekte bu bir sorun teşkil etmez. Daha fazla VB.NET kodu eklemek gerekirse, HTML kodunu VB kodundan daha fazla ayırmak istenir. Bunu, VB kodunu bir <script> etiketi içine alarak gerçekleştirebiliriz:
<script runat="server">
' HTML kodu tarafından görüntülenecek verilerin hesaplanması
...
</script>
<html>
....
' hesaplanan değerlerin komut dosyası kısmı tarafından görüntülenmesi
</html>
[heure2.aspx] örneği bu yöntemi göstermektedir:
<script runat="server">
Dim maintenant as String=Date.Now.ToString("T")
</script>
<html>
<head>
<title>Demo asp.net </title>
</head>
<body>
Il est
<% =maintenant %>
</body>
</html>
[heure2.aspx] belgesini Cassini web sunucusunun (<webroot>,/aspnet) [<webroot>\chap2\heure2.aspx] dizin yapısına yerleştiriyoruz ve bir tarayıcıyla belgeyi çağırıyoruz:

3.3.3. Temel örnek - varyant 3
Gerekli araçlar: bir metin düzenleyici, Cassini web sunucusu
VB kodunu ve HTML kodunu iki ayrı dosyaya yerleştirerek bu ayrıştırma sürecini daha da ileriye götürüyoruz. HTML kodu [heure3.aspx] belgesinde, VB kodu ise [heure3.aspx.vb] belgesinde yer alacaktır. [heure3.aspx] dosyasının içeriği şu şekilde olacaktır:
<%@ Page Language="vb" src="heure3.aspx.vb" Inherits="heure3" %>
<html>
<head>
<title>Demo asp.net</title>
</head>
<body>
Il est
<% =maintenant %>
</body>
</html>
İki temel fark vardır:
- henüz bilinmeyen özniteliklere sahip [Page] yönergesi
- hiçbir yerde başlatılmamış olmasına rağmen HTML kodunda [maintenant] değişkeninin kullanılması
[Page] yönergesi burada, sayfayı başlatacak olan VB kodunun başka bir dosyada olduğunu belirtmek için kullanılır. Bu dosyayı belirten ise [src] özniteliğidir. VB kodunun, [heure3] adlı bir sınıfa ait olduğunu göreceğiz. Geliştiriciye görünmez bir şekilde, bir .aspx dosyası, [Page] adlı bir temel sınıftan türetilen bir sınıfa dönüştürülür. Burada, HTML belgemiz, görüntülemesi gereken verileri tanımlayan ve hesaplayan sınıftan türetilmelidir. Bu durumda, [heure3.aspx.vb] dosyasında tanımlanan [heure3] sınıfıdır. Ayrıca, VB ve [heure3.aspx.vb] belgeleri ile HTML ve [heure3.aspx] belgeleri arasındaki bu üst-alt ilişki belirtilmelidir. Bu bağlantıyı belirten öznitelik [inherits]'tir. Bu öznitelik, [src] özniteliğinin işaret ettiği dosyada tanımlanan sınıfın adını belirtmelidir.
Şimdi sayfanın VB kodunu inceleyelim:
Public Class heure3
Inherits System.Web.UI.Page
' görüntülenecek web sayfası verileri
Protected maintenant As String
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'web sayfasındaki veriler hesaplanıyor
maintenant = Date.Now.ToString("T")
End Sub
End Class
Aşağıdaki noktalara dikkat edilmelidir:
- VB kodu, [System.Web.UI.Page] sınıfından türetilmiş bir [heure3] sınıfını tanımlar. Bu her zaman böyledir; bir web sayfası her zaman [System.Web.UI.Page] sınıfından türetilmelidir.
- Sınıf, [maintenant] adlı korumalı (protected) bir öznitelik bildirir. Korunan bir özniteliğe, türetilmiş sınıflardan doğrudan erişilebileceği bilinmektedir. Bu sayede, HTML ve [heure3.aspx] belgeleri, kodlarında [maintenant] verisinin değerine erişebilir.
- [maintenant] özniteliğinin başlatılması, [Page_Load] yordamında gerçekleştirilir. Daha sonra göreceğimiz üzere, [Page] türündeki bir nesneye web sunucusu tarafından bir dizi olay bildirilir. [Load] olayı, [Page] nesnesi ve bileşenleri oluşturulduğunda gerçekleşir. Bu olayın işleyicisi, [Handles MyBase.Load] yönergesi ile belirlenir.
- Olay işleyicisinin adı [XX] herhangi bir isim olabilir. İmzası ise yukarıda belirtilen şekilde olmalıdır. Şu an için bunun üzerinde durmayacağız.
- Web sayfasının görüntülemesi gereken dinamik verilerin değerlerini hesaplamak için genellikle [Page.Load] olay yöneticisi kullanılır.
[heure3.spx] ve [heure3.aspx.vb] belgeleri, [<webroot>\chap2] içine yerleştirilir. Ardından bir tarayıcı kullanarak web sunucusuna (<webroot>,/aspnet) URL ve [http://localhost/aspnet/chap2/heure3.aspx] dosyalarını talep ederiz:

3.3.4. Temel örnek - 4. varyant
Gerekli araçlar: bir metin düzenleyici, Cassini web sunucusu
Önceki örnekle aynı örneği kullanıyoruz, ancak tüm kodu tek bir dosyada yeniden birleştiriyoruz: [heure4.aspx]:
<script runat="server">
' görüntülenecek web sayfası verileri
Private maintenant As String
' muhtemelen page_load
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'web sayfasının verileri hesaplanıyor
maintenant = Date.Now.ToString("T")
End Sub
</script>
<html>
<head>
<title>Demo asp.net</title>
</head>
<body>
Il est
<% =maintenant %>
</body>
</html>
Örnek 2'deki diziyi tekrar görüyoruz:
Bu sefer, VB kodu prosedürler halinde yapılandırılmıştır. Önceki örnekteki [Page_Load] prosedürü burada da yer almaktadır. Burada, tek başına bir .aspx sayfasının (ayrı bir dosyadaki VB koduyla bağlantılı olmayan), varsayılan olarak [Page] sınıfından türetilmiş bir sınıfa dönüştürüldüğünü göstermek istiyoruz. Böylece bu sınıfın özniteliklerini, yöntemlerini ve olaylarını kullanabiliriz. Burada da bu sınıfın [Load] olayını kullanarak bunu yapıyoruz.
Test yöntemi öncekilerle aynıdır:

3.3.5. Temel örnek - varyant 5
Gerekli araçlar: bir metin düzenleyici, Cassini web sunucusu
Örnek 3'te olduğu gibi, VB kodunu ve HTML kodunu iki ayrı dosyaya ayırıyoruz. VB kodu, [heure5.aspx.vb] dosyasına yerleştirilir:
Public Class heure5
Inherits System.Web.UI.Page
' görüntülenecek web sayfası verileri
Protected maintenant As String
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'web sayfasının verileri hesaplanır
maintenant = Date.Now.ToString("T")
End Sub
End Class
HTML kodu, [heure5.aspx] içine yerleştirilmiştir:
<%@ Page Inherits="heure5" %>
<html>
<head>
<title>Demo asp.net</title>
</head>
<body>
Il est
<% =maintenant %>
</body>
</html>
Bu sefer, [Page] yönergesi artık HTML kodu ile VB kodu arasındaki bağlantıyı belirtmiyor. Web sunucusu, VB kodunu derlemek için artık bu kodu bulamıyor (src özniteliği yok). Bu derlemeyi bizim yapmamız gerekiyor. Bu nedenle, bir DOS penceresinde VB ve [heure5.aspx.vb] sınıflarını derliyoruz:
dos>dir
23/03/2004 18:34 133 heure1.aspx
24/03/2004 09:47 232 heure2.aspx
24/03/2004 10:16 183 heure3.aspx
24/03/2004 10:16 332 heure3.aspx.vb
24/03/2004 14:31 440 heure4.aspx
24/03/2004 14:45 332 heure5.aspx.vb
24/03/2004 14:56 148 heure5.aspx
dos>vbc /r:system.dll /r:system.web.dll /t:library /out:heure5.dll heure5.aspx.vb
Compilateur Microsoft (R) Visual Basic .NET version 7.10.3052.4
Yukarıda, derleyicinin [vbc.exe] yürütülebilir dosyası, DOS makinesindeki PATH içindeydi. Eğer öyle olmasaydı, SDK.NET'in kurulduğu klasör ağacında bulunan [vbc.exe] dosyasının tam yolunu belirtmek gerekirdi. [Page]'ten türetilen sınıflar, DLL ve [system.dll, system.web.dll] dosyalarında bulunan kaynaklara ihtiyaç duyar; bu nedenle derleyicinin /r seçeneği ile bu dosyalara referans verilir. /t :library seçeneği, bir DLL dosyası oluşturulmasını istediğimizi belirtmek için kullanılır. /out seçeneği ise oluşturulacak dosyanın adını belirtir; bu örnekte [heure5.dll]. Bu dosya, [heure5.aspx] web belgesinin ihtiyaç duyduğu [heure5] sınıfını içerir. Ancak web sunucusu, ihtiyaç duyduğu DLL dosyalarını belirli konumlarda arar. Bu konumlardan biri, dizin yapısının kökünde bulunan [bin] klasörüdür. Bu kök, bizim <webroot> olarak adlandırdığımız yerdir. IIS sunucusu için bu genellikle <sürücü>:\inetpub\wwwroot şeklindedir; burada <sürücü>, DLL'in kurulduğu sürücüdür (C, D, ...) sürücüsüdür. Cassini sunucusu için bu kök dizin, sunucuyu başlattığınızda kullandığınız /path parametresine karşılık gelir. Bu değerin, görev çubuğundaki sunucu simgesine çift tıklayarak elde edilebileceğini hatırlatalım:

<webroot>, yukarıdaki [Physical Path] özniteliğine karşılık gelir. Dolayısıyla, <webroot>\bin adlı bir klasör oluşturup [heure5.dll] dosyasını bu klasöre yerleştiriyoruz:

Hazırız. Cassini sunucusundan (<webroot>,/aspnet) URL [http://localhost/aspnet/chap2/heure5.aspx] dosyasını talep ediyoruz:

3.3.6. Temel örnek - varyant 6
Gerekli araçlar: bir metin düzenleyici, Cassini web sunucusu
Şimdiye kadar, dinamik bir web uygulamasının iki bileşeni olduğunu gösterdik:
- sayfanın dinamik kısımlarını hesaplamak için VB kodu
- sayfada bu değerlerin görüntülenmesi için bazen VB kodunu da içeren HTML kodu. Bu kısım, web istemcisine gönderilen yanıtı temsil eder.
- bileşene sayfanın denetleyici bileşeni, 2. bileşene ise sunum bileşeni denir. Sunum bileşeni, mümkün olduğunca az VB kodu içermeli, hatta hiç VB kodu içermemelidir. Bunun mümkün olduğunu göreceğiz. Burada, yalnızca bir denetleyici bulunan ve sunum bileşeninin bulunmadığı bir örnek gösteriyoruz. Sunum bileşeninin yardımı olmadan, denetleyici müşteriye verilecek yanıtı kendisi oluşturur.
Sunum kodu şu şekilde olur:
Görüldüğü gibi, içinde artık HTML kodu bulunmuyor. Yanıt doğrudan denetleyicide oluşturuluyor:
Public Class heure6
Inherits System.Web.UI.Page
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' yanıt oluşturuluyor
Dim HTML As String
HTML = "<html><head><title>heure6</title></head><body>Il est "
HTML += Date.Now.ToString("T")
HTML += "</body></html>"
' yanıt gönderiliyor
Response.Write(HTML)
End Sub
End Class
Denetleyici burada yanıtın yalnızca dinamik kısımlarını değil, yanıtın tamamını oluşturur. Ayrıca yanıtı da gönderir. Bunu, [Page] sınıfının [HttpResponse] türündeki [Response] özelliğini kullanarak yapar. Bu, sunucunun istemciye verdiği yanıtı temsil eden bir nesnedir. [HttpResponse] sınıfı, istemciye gönderilecek olan HTML akışına yazmak için [Write] yöntemine sahiptir. Burada, gönderilecek HTML akışının tamamını [HTML] değişkenine aktarıyoruz ve bunu [Response.Write(HTML)] aracılığıyla istemciye gönderiyoruz.
Cassini sunucusundan (<webroot>,/aspnet) [http://localhost/aspnet/chap2/heure6.aspx] URL’sini talep ediyoruz:

3.3.7. Sonuç
Bundan sonra, dinamik bir web belgesindeki VB ve HTML kodlarını iki ayrı dosyaya yerleştiren 3. yöntemi kullanacağız. Bu yöntemin avantajı, bir web sayfasını iki bileşene ayırmasıdır:
- sayfanın dinamik kısımlarını hesaplamak için yalnızca VB kodundan oluşan bir denetleyici bileşeni
- müşteriye gönderilen yanıt olan bir sunum bileşeni. Bu bileşen, dinamik değerlerin görüntülenmesi için bazen VB kodunu da içeren HTML kodundan oluşur. Her zaman sunum bölümünde VB kodunu en aza indirgemeyi hedefleyeceğiz; ideal olan ise hiç içermemesidir.
- yöntemde gösterildiği gibi, denetleyici web uygulamasından bağımsız olarak derlenebilir. Bu, yalnızca koda odaklanma ve her derlemede tüm hataların listesini elde etme avantajı sağlar. Denetleyici derlendikten sonra web uygulaması test edilebilir. Önceden derleme yapılmazsa, derleme işlemini web sunucusu gerçekleştirir ve hatalar tek tek bildirilir. Bu durum zahmetli bulunabilir.
Aşağıdaki örnekler için şu araçlar yeterlidir:
- uygulamanın HTML ve VB belgelerini oluşturmak için bir metin düzenleyici (belgeler basit olduğunda)
- IDE geliştirme aracı, NET sınıflarını oluşturmak için kullanılır; böylece bu tür bir aracın kod yazımına sağladığı yardımdan yararlanılabilir. Bu tür bir araç örneği olarak CSharpDevelop (http://www.icsharpcode.net) verilebilir. Kullanım örneği ekte ([Les outils du développement web]) gösterilmiştir.
- Uygulamanın tanıtım sayfalarını oluşturmak için WebMatrix aracını kullanın (bkz. ek [Les outils du développement web]).
- Cassini sunucusu
Tüm bu araçlar ücretsizdir.