Blog Home  Yalcomania'n�n Yeri Feed your aggregator (RSS 2.0)  
Yalçın Uzun - Saturday, August 02, 2008
Kişisel Blog
 
 Saturday, August 02, 2008

Dün bir problemle uğraşırken çok ilginç bir şey keşfettim ve bunu paylaşmak istedim.

Konu SessionID ve global.asax hakkında.

Bunu bir örnek üzerinden anlatmak isterim:

Önce Default.aspx’e bir adet HyperLink kontrolü atalım. Maksat, bu linkten Open In New Browser diyerek test edeceğimiz sayfadan birden fazla açmak. Böylelikle aynı session’a sahip birden fazla sayfaya sahip olabileceğiz.

Şöyle bir kod yeterli olacaktı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>Untitled Page</title>

</head>

<body>

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

    <div>

    <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="~/Default2.aspx">Test Sayfam</asp:HyperLink> 

    </div>

    </form>

</body>

</html>

 

Daha sonra ikinci sayfamıza (Default2.aspx) gelelim ve  sonra form load’a session Id’yi gösteren bir kod yazalım.

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

 

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

    {

        Response.Write(Session.SessionID);

    }

</script>

 

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

Projemizi çalıştırdığımızda çok ilginç bir şeyle karşılaşıyoruz. Default.aspx’te Link üzerinden Open In New Tab dediğimizde her sayfanın farklı bir session Id’yle açıldığını görüyoruz.

 

Uğraştığım problemin çözümü için hayati önemli bir durumdu bu. Kafayı yiyerek İki tane çözüm buldum:

Birincisi bir sayfanın herhangi bir yerinde session’a bir değer atarsam problem kendiliğinden çözülüyordu. Şöyle ki (Default.aspx’te)

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

 

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

    {

        //Ne yazdığınızın hiç bir önemi yok

        Session["Hede"] = "hödö";

    }

</script>

 

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

<head runat="server">

    <title>Untitled Page</title>

</head>

<body>

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

    <div>

    <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="~/Default2.aspx">Test Sayfam</asp:HyperLink> 

    </div>

    </form>

</body>

</html>

 

Burası çalıştıktan sonra tüm sayfalarım aynı session ID’yi verdi. Ancak bu yine bir çözüm değildi. Kullanıcı bu sayfaya uğramadan direk sessionID’nin kullanıldığı sayfaya (yani Default2.aspx’e) erişebilirdi.

Hal böyle olunca ben de Global.asax kullanmaya karar verdim ve oldukça ilginç bir şey keşfettim:

Projeye Global.asax ekleyince hiç bir şey yapmasınız bile Session Id’ler doğru çalışıyor.

Acaba bu sadece Visual Studio’nun web server’ındaki bir sorun mu diye düşündüm ve projeyi IIS’te test ettim ve farkettim ki IIS de aynı şekilde davranıyor.

Buradan çıkardığım sonuç şu:

 

Eğer SessionID kullanacaksanız, projenizde mutlaka Global.asax kullanın, yoksa sürprizlere uğraşmak zorunda kalabilirsiniz.

İlginç !

Saturday, August 02, 2008 11:54:40 AM (GTB Standard Time, UTC+02:00)  #    Comments [0]    | 
 Thursday, July 31, 2008

--Dolaşılacak tabloyla ilgili bilgileri atmak için önce bir temp tablo oluşturulur.

CREATE TABLE #OgrencilerTemp

(

KayitNo int IDENTITY(1, 1),

OgrenciID int

)

--İlgili bilgiler temp tabloya insert select yardımıyla atılır.

INSERT INTO #OgrencilerTemp

SELECT OgrenciID

FROM Ogrenciler

--Koyatıları dönmek için kullanılacak değişkenler

declare @KayitSayisi int

declare @KayitNo int

--Başlangıç verileri set edilir.

SET @KayitSayisi = @@ROWCOUNT

SET @KayitNo = 1

--Kullanılacak bilgiler değişkenlere aktarılır.

--Örnekte sadece 1 tane kullandım.

declare @OgrenciID int

--Tek tek kayıtlar dönmeye başlanır

WHILE @KayitNo <= @KayitSayisi

BEGIN

--İlgili veriler değişlenlere aktarılır

select @OgrenciID=OgrenciID from #OgrencilerTemp where KayitNo=@KayitNo

--Bilgi nerede kullanılacaksa kullanılır.

exec spBirseylerYap @KayitNo

--Sayac'ı 1 arttırır.

Set @KayitNo=@KayitNo+1

END

--Temp tablo silinir.

DROP TABLE #OgrencilerTemp

Thursday, July 31, 2008 4:42:08 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]    | 
 Monday, July 28, 2008

İki de bir unutup durduğum bir şey olduğu için buraya yazayım dedim. En azından her seferinde makale okumak zorunda kalmam.

Aktif hale getirmek için:

ALTER DATABASE Database SET ENABLE_BROKER

C# kodları: (Unutulmaması gereken şey sorguda mutlaka sütun adları kullanılmalı ve from kısmı FQN (dbo.Hede) olmalı)

Global değişkenler:

SqlConnection con = new SqlConnection("server=.;database=Northwind;trusted_connection=true");

SqlCommand com;

SqlDependency dep;

SqlDataAdapter da;

DataTable dt;

 

 

private void Form1_Load(object sender, EventArgs e)

{

   Control.CheckForIllegalCrossThreadCalls = false;

   VeriCek();

}

void VeriCek()

{

   com = new SqlCommand("select ogrenciId,ogrenciAd,OgrenciSoyad from dbo.ogrenciler", con);

   dep = new SqlDependency(com);

   dep.OnChange += new OnChangeEventHandler(dep_OnChange);

   SqlDependency.Start(con.ConnectionString);

   da = new SqlDataAdapter(com);

   dt = new DataTable();

   da.Fill(dt);

   dgVeriler.DataSource = dt;

}

void dep_OnChange(object sender, SqlNotificationEventArgs e)

{

   VeriCek();

}

 

Monday, July 28, 2008 5:29:08 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]    | 
 Wednesday, July 23, 2008

Sayfalar arası veri transferinde QueryString ve Session’a güzel bir alternatif ASP.NET 2.0’da gelen CrossPage Posting’dir. Bu makalede cross page posting kullanarak DatagridView üzerinden başka bir sayfaya post yapmayı inceleyeceğiz.

Eğer cross page posting hakkında bir bilginiz yoksa bu makaleyi okumadan önce Ekin Özçiçekçiler’in makalesini okumanız faydalı olacaktır. ( http://www.yazilimuzmani.com/Articles/Details.aspx?aId=1000000795 )

Öncelikle iki sayfaya ihtiyacımız olacak:

1- Post yapacak sayfa. (Örnekte bir datagridview barındıran AktifBildirimlerim.aspx)

2- Post edilerek gönderilen datayı kullanacak sayfa. (Örnekte BildirimDetay.aspx)

AktifBildirimlerim.aspx sayfasında bulunan gridview’e post yapması için her satıra bir düğme eklememiz gerekiyor. (Buton,ImageButton vb..) OnClick olayını da ShowDetay adlı bir metoda bağlıyoruz.

<asp:TemplateField>

      <ItemTemplate>

        <asp:ImageButton ImageUrl="../Resimler/search.png" ID="MyGridLinkButton" runat="server" OnClick="ShowDetay"/>

       </ItemTemplate>

</asp:TemplateField>

 

Daha sonra ShowDetay metodunu yazmaya başlıyoruz.

    public void ShowDetay(object sender, EventArgs e)

    {

        //Grid'in hangi satırından geldiğini anlıyorum

        ImageButton btnEdit = sender as ImageButton;

        GridViewRow row = (GridViewRow)btnEdit.NamingContainer;

 

        //O satıra ait ID'yi DataKeys’den yakalıyorum

        int bildirimId= Convert.ToInt32(this.GridView1.DataKeys[row.DataItemIndex].Value);

       

        //Bu sayfada öbür tarafa göndermek istediğim veriyi bu class’ta oluşturduğum bir property’e aldım.

        //Bu değer istenirse bir label'a veya başka bir kontrole de atılabilir.

        //Böylelikle diğer sayfadan PreviousPage.FindControl diyerek değeri de alınabilir.

        this.BildirimId = bildirimId;

 

        //Sayfayı diğer bir sayfaya post etmek için Server.Transfer metodunu kullanıyorum.

        Server.Transfer("BildirimDetay.aspx", true);

    }

 

Bu sayfayla işimiz bitti. Şimdi BildirimDetay.aspx sayfasında yapmamız tek şey kaldı:

AktifBildirim.aspx sayfasında property kullandığım için bunu BildirimDetay.aspx’te class olarak göstermemiz gerekir. Çünkü PreviousPage özelliği geriye Page tipi döndürür.  Böyle olunca da onun üzerinden sayfadaki property’e erişemeyiz.    Bunun için BildirimDetay.aspx’e reference directive’ini eklemek gerekir.

<%@ Reference Page="~/BackOffice/AktifBildirimlerim.aspx" %>

Eğer bir sayfaya sadece tek bir sayfadan post geleceğinden eminseniz Reference yerine PreviousPageType directive’ini kullanmanız daha doğru olur. Bunu yaptığınızda  PreviousPage özelliği Page tipi değil, PreviousPageType’da belirttiğiniz sayfa tipinde döner. Böylelikle cast işlemine gerek kalmaz. Ancak bu yaptığımız örnekte, BildirimDetay.aspx’e birden fazla sayfadan post geleceği için ben Reference kullandım.

Eğer AktifBildirim.aspx sayfasında veriyi tutmak için property değil de kontrol kullansaydık buna gerek kalmayacaktı. PreviousPage.FindControl metodu ile veriye erişebilecektik.

Bütün hazırlıklarımız bittiğine göre artık kodumuzu yazabiliriz:

    protected void Page_Load(object sender, EventArgs e)

    {

        //Diğer sayfadan post olarak gelmişse gerekli işlemleri yapıyor.

        if (PreviousPage!=null)

        {

            //PreviousPage'den gelen sayfaya cast edip BildirimId'yi yakalıyorum.

            int bildirimId=(PreviousPage as BackOffice_AktifBildirimlerim).BildirimId;

           

            //Buralarda yakaladığım Id'yi kullanıyorum

            ucBildirimDetayAll1.BildirimId = bildirimId;

            ViewState["myID"] = ucBildirimDetayAll1.BildirimId;

            ucBildirimDetayAll1.Update();   

        }

    }

 

Her türlü sorunuz ve görüşünüz için çekinmeden yalcin.uzun@bilgeadam.com a mail atabilirsiniz.

Wednesday, July 23, 2008 1:50:15 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]    | 
 Wednesday, July 09, 2008

AJAX Tool Kit'te bulunan Modal PopUp kontrolünü kullanmışsanız bilirsiniz ki, göstermek istediğiniz panel kontrolü (veya div, artık ne kullanmışsanız) sayfa yüklenirken bir kaç saniye ekranda kalır. Bu da kötü bir görüntüye sebep olur. Bu durumdan kurtulmanın çözümü gayet basit:

Tek yapmanız gereken panel'e style="display:none" attribute'unu eklemek.

Cümle içinde kullanmak gerekirse:

<asp:Panel style="display:none" ID="myModalPop" runat="server">Burası artık açılışta gözükmeyecek</asp:Panel>

 

Wednesday, July 09, 2008 1:38:10 AM (GTB Standard Time, UTC+02:00)  #    Comments [0]    | 
 Tuesday, June 03, 2008

Vatani görevimi tamamladım ve tekrar Bilge Adam'daki görevime geri döndüm.

Sorularınız ve görüşleriniz için yeniden yalcin.uzun@bilgeadam.com a mail atabilirsiniz...

Tuesday, June 03, 2008 5:58:04 PM (GTB Standard Time, UTC+02:00)  #    Comments [2]    | 
 Tuesday, October 09, 2007

İlk Visual Studio AddIn Projem.

Oracle JDeveloper ‘da bulunup gıpta etttiğim bir özelliğin addin’ini yazdım.

Kod sayfasında addini çalıştırdığınızda tüm global değişkenleri listeliyor.
Daha önce property’ye dönüşmüş olanlar varsa onları listeden çıkartıyor.

Siz sadece set ve get’lerden istediklerinizi seçiyorsunuz. Propertylerini addin yazıyor.

Daha önce AddIn projesi yapmamış olanlar için ve DTE namespace’i  (macrolarda da kullanılan) için güzel bir örnek.
Ayrıca regular expression kullanımı için de örnek teşkil edebilir. (değişken tanımlamalarını ve property’leri bulmak için kullandım)

Şu an üşengeçlikten desteklemediğim şeyler:
VB dili
int x=4; gibi bir değişken tanımlama.
hede x=new hede(); gibi bir değişken tanımlama.


Onun dışında gayet güzel çalışıyor. (En azından bende)

Kolay gelsin...
Yalçın








İndirmek için tıklayınız: YalcomaniaPropertyBuilderAddIn.rar (62,38 KB)
Tuesday, October 09, 2007 4:10:34 PM (GTB Standard Time, UTC+02:00)  #    Comments [0]    | 
 Monday, October 08, 2007

Bir projemde Regular Expression kullanmam gerekti. Ancak piyasadaki uygulamalar tüm diller için yazıldığı için orada düzgün çalışan expression'lar .net'e gelince çalışmıyordu. Bunun üzerine oldukça basit olan bu uygulamayı yazdım.



İndirmek için tıklayınız: Yalcomania_RegEx_Editor.rar (44,51 KB)
Monday, October 08, 2007 1:27:06 PM (GTB Standard Time, UTC+02:00)  #    Comments [1]    | 
Copyright © 2008 Yalçın Uzun