Durum Yönetimi Bu gün dersimizde durum yönetimine (state management) değineceğiz. Önce adı DurumYonetimi isimli yeni bir site oluşturalım. Burada programın otomatik olarak oluşturacağı Default.aspx dosyasını ve App_Data dizinini silelim. Bunu yapmak için dosya ve dizini ayrı, ayrı sağ tuş ile tıklayıp delete seçeneğini seçelim. Web sitemize yeni bir sayfa eklemek için Website menüzünden Add New Item seçeneğini seçtikten sonra bu siteye adları BasitSayac.aspx Sifregir.aspx PreRenderOlay.aspx DurumYonetimOrnek.aspx KurabiyeOrnek.aspx SorguKatar.aspx SorguKatarAlan.aspx UyeleriKoru.aspx Sayfa1.aspx Sayfa2.aspx Olan sayfalar ekleyelim. BasitSayac.aspx Partial Class BasitSayac Private Sub cmdekle_click(byval sender As System.Object, ByVal e As System.EventArgs) Handles cmdekle.click If Me.ViewState("Sayac") = Nothing Then Me.ViewState("Sayac") = 1 Else Me.ViewState("Sayac") = CType(Me.ViewState("Sayac"), Integer) + 1 lblsayac.text = "Sayaç: " & CType(Me.ViewState("Sayac"), Integer)
Aşağıdaki programda Session durumu kullanılmaktadır. Sifregir.aspx Partial Class Sifregir Protected Sub cmdbaglan_click(byval sender As Object, ByVal e As System.EventArgs) Handles cmdbaglan.click If Not Me.IsPostBack Then Session("SifreDeneme") = 0 Else Session("SifreDeneme") = Session("SifreDeneme") + 1 If txtsifre.text = "mt486" Then Session("SifreDeneme") = 0 ElseIf Session("SifreDeneme") >= 3 Then lblhata.text = "şifrenizi 3 defa hatalı girdiniz. artık şifre girmenize izin verilmeyecek" txtsifre.visible = False PreRenderOlay.aspx Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load txtx.text = "Merhaba arkadaşlar"
Protected Sub txtx_prerender(byval sender As Object, ByVal e As System.EventArgs) Handles txtx.prerender If Me.IsPostBack Then txtx.text = "İşini bitirdim" Sayfaları deneyiniz ViewState, bir istemci tarafından istenen bir sayfada bulunan web kontrollerinin değerlerini tekrar yerine koymak veya bu değerleri izlemek için kullanılır. Bu değerler sadece o sayfa için geçerlidir ve bir sayfadan diğer sayfaya ViewState ile aktarılamaz. ViewState bir sayfadaki kontrollerin değerlerini otomatik olarak yerine koyar. ViewState sayfa içinde VIEWSTATE adında gizli bir form elemanı içinde tututulur. Render olayını anlamak ve ViewState özelliğini anlamak için bir sayfanın sunucu içindeki yaşam döngüsünü anlatan aşağıdaki grafik yararlı olacaktır.
PreRender olayını ve ViewState özelliğini kullanan bir sayfa UyeleriKoru.aspx Partial Class UyeleriKoru Private BilgiSakla As String Private Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load If Me.IsPostBack = True Then ' Değişkeni geri yükle BilgiSakla = CType(Me.ViewState("Text"), String) Private Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles MyBase.PreRender ' Persist variables. Me.ViewState("Text") = BilgiSakla Private Sub cmdkaydet_click(byval sender As Object, ByVal e As EventArgs) _ Handles cmdkaydet.click ' Metin kutusundaki bilgiyi BilgiSakla değişkenine yükle BilgiSakla = txtbilgi.text txtbilgi.text = "" Private Sub cmdyukle_click(byval sender As Object, ByVal e As EventArgs) _ Handles cmdyukle.click 'BilgiSakla değişkenindeki bilgiyi Metin kutusuna yükle txtbilgi.text = BilgiSakla
Session durumuna bir başka örnek olarak aşağıda verilen ve bir sınıfın bilgilerini bir oturum boyunca saklayan sayfa örneğini inceleyelim. Öncelikle bu sayfada kullanılacak olan Mobilya sınıfını oluşturabilmek için App_Code dizini içinde Mobilya.vb dosyası oluşturalım. Bu dosya içe aşağıdaki kodu yazalım. Namespace DurumYonetim Public Class Mobilya Public Ad As String Public Betimleme As String Public Fiyat As Decimal Public Sub New(ByVal Ad As String, _ ByVal Betimleme As String, _ ByVal Fiyat As Decimal) Me.Ad = Ad Me.Betimleme = Betimleme Me.Fiyat = Fiyat End Namespace Şimdi DurumYonetimOrnek.aspx sayfamızı aşağıdaki gibi oluşturalım. DurumYonetimOrnek.aspx Imports DurumYonetim Partial Class DurumYonetimOrnek
Private Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load If Me.IsPostBack = False Then ' Mobilya nesnelerini oluşturunuz Dim Esya1 As New Mobilya("Sofa", "Bellona", 74.99) Dim Esya2 As New Mobilya("Masa", "İstikbal", 866.75) Dim Esya3 As New Mobilya("Gardrop", "Tepe Mobilya", 300.11) aktarınız ' Mobilya nesnelerini uturum durumuna Session("Mobilya1") = Esya1 Session("Mobilya2") = Esya2 Session("Mobilya3") = Esya3 ' Add rows to list control. lstmobilyalar.items.clear() lstmobilyalar.items.add(esya1.ad) lstmobilyalar.items.add(esya2.ad) lstmobilyalar.items.add(esya3.ad) ' Oturum durumu ile ilgili bazı bilgileri göster ' Bu konfigürasyon durumunu ayarlamak için önemlidir lbldurum.text = "Durum ID: " & Session.SessionID lbldurum.text &= "<br>nesne Sayısı: " & Session.Count.ToString() lbldurum.text &= "<br>mode: " & Session.Mode.ToString() lbldurum.text &= "<br>kuarbiyesiz mi: " lbldurum.text &= Session.IsCookieless.ToString() lbldurum.text &= "<br>yeni mi: " & Session.IsNewSession.ToString() lbldurum.text &= "<br>zaman aşımı (dakika): " & Session.Timeout.ToString() Private Sub cmdayrıntı_click(byval sender As Object, ByVal e As EventArgs) _ Handles cmdayrıntı.click
If lstmobilyalar.selectedindex = -1 Then lblkayıt.text = "No item selected." Else ' Verilen indekse bağlı olarak doğru nesne anahtarını oluşturunuz Dim Key As String Key = "Mobilya" & (lstmobilyalar.selectedindex + 1).ToString() ' Nesneyi oturum durumunda alarak ekranda gösteriniz Dim Esya As Mobilya = CType(Session(Key), Mobilya) lblkayıt.text = "Ad: " & Esya.Ad & "<br>" lblkayıt.text &= "Üretici: " & Esya.Betimleme & "<br>" lblkayıt.text &= "Fiyat: " & Esya.Fiyat.ToString() & " YTL." Aşağıdaki iki sayfa Session Kullanarak bilgi aktarımına ve bir sayfadan diğerine geçmek için kullanılan response.redirect komutuna örnektir. Sayfa1.aspx Partial Class Sayfa1
Protected Sub cmdgitabsolute_click(byval sender As Object, ByVal e As System.EventArgs) Handles cmdgitabsolute.click Response.Redirect("http://localhost/mt486_I/DurumYonet/Say fa2.aspx") Protected Sub cmdgit_click(byval sender As Object, ByVal e As System.EventArgs) Handles cmdgit.click Response.Redirect("Sayfa2.aspx") Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Session("test") = "Test metin" Sayfa2.aspx Partial Class Sayfa2 Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load If Session("test") <> "" Then lblbilgi.text = Session("test") & " başarılı bir şekilde oturum durumundan okundu" Else lblbilgi.text = " Oturum durumu bilgisi bulunamadı."
Sorgu katarı (QueryString ) kullanarak bilgi aktarımına örnek olarak aşağıdaki iki sayfa oluşturalım. SorguKatar.aspx SorguKatarAlan.aspx SorguKatar.aspx sayfasının kodu: Partial Class SorguKatar Private Sub Page_Load(ByVal sender As Object, _ ByVal e As EventArgs) Handles MyBase.Load ' Add sample values. lstmobilya.items.add("sofa") lstmobilya.items.add("tül Perde") lstmobilya.items.add("isparta Halı") lstmobilya.items.add("antik Lamba") lstmobilya.items.add("jakuzi") Private Sub cmdbilgiver_click(byval sender As Object, _ ByVal e As EventArgs) _ Handles cmdbilgiver.click If lstmobilya.selectedindex = -1 Then lblhata.text = "Önce bir mobilya _ seçmelisiniz." Else ' Kullanıcıyı bu verileri kullanan sayfaya yönlendir Dim Url As String = "SorguKatarAlan.aspx?"
Url &= "Mobilya=" & _ lstmobilya.selecteditem.text & "&" _ Url &= "DetayTercih=" & _ chkdetay.checked.tostring() Response.Redirect(Url) SorguKatarAlan.aspx sayfasının kodu : Partial Class SorguKatarAlan Private Sub Page_Load(ByVal sender As Object, _ ByVal e As EventArgs) Handles MyBase.Load lblbilgi.text = "Seçilen Mobilya: " & _ Request.QueryString("Mobilya") & "<br>" _ lblbilgi.text &= "Detay tercihi: " & _ Request.QueryString("DetayTercih")