در اين مقاله با يک روش جديد و مختص
ASP.NET بنام
Context
جهت تبادل مقادير ميان صفحات يک برنامه
آشنا می شويد.
Asp.net
دارای امکانات خوبی جهت انتقال مقادير و متغيرها ميان صفحات می باشد. خوشبختانه
علاوه بر امکان استفاده از روش های قديمی مانند متغيرهای
Application
،Session
و QueryString،
قابليت جديدی نيز به اين مجموعه اضافه شده است که بسيار کارآمد هم می باشد. اين
امکان جديد شئ Context
می باشد و از اين قابليت می توان در کنار
Server.Transfer
بخوبی استفاده نمود. استفاده از
Context همانند استفاده از
Session
است:
Context.Items.Add("NameOfVariable","ValueOfVariable");
Server.Transfer("WebForm2.aspx");
در صفحه دوم جهت
بازيابی مقدار ذخيره شده بصورت زير عمل می کنيم:
Label1.Text=Context.Items["NameOfVariable"].ToString();
بنابراين، در صفحه دوم می
توانيم مقدار ارسالی را در قالب يک شئ از تايپ
object دريافت کنيم که
لازم است قبل از استفاده، آن را به تايپ مورد نظر تبديل يا Cast
کنيم. اين روش شايد برای تعداد محدودی از مقادير يا متغيرها کارآمد باشد، اما اگر
تعداد زيادی از اين متغيرها را بخواهيم به ازای هر کاربر يا Session
نگهداری کنيم در اين صورت ممکن است دچار مشکل شويم يا به علت اشکالات تايپی در نام
اين نوع متغيرها به خطای منطقی در برنامه برخورد نمائيم. جهت حل اين معضل از روش
زير استفاده می کنيم.
Imports System.Collections
Public Class StaticContainer
Private Shared thing As Hashtable
Public Shared Sub InitThing()
thing = New Hashtable()
End Sub
Public Shared Sub KillThing()
thing.Clear()
thing = Nothing
End Sub
Public Shared Sub AddContainer(ByVal key As Object)
thing.Add(key, New ArrayList())
End Sub
Public Shared Sub RemoveContainer(ByVal key As Object)
thing.Remove(key)
End Sub
Public Shared Sub AddToContainer(ByVal newname As
String, ByVal index As Integer,
ByVal stuff As String, ByVal key As Object)
Dim temp As ArrayList = thing.Item(key)
thing.Remove(key)
Dim t As New triple()
t.name = newname
t.ID = index
t.data = stuff
temp.Add(t)
thing.Add(key, temp)
End Sub
Public Shared Function GetEntry(ByVal x As Integer,
ByVal key As Object) As triple
Dim temp As ArrayList = thing.Item(key)
Dim result As triple
If temp.Count > x And x >= 0 Then
result = CType(temp(x), triple)
End If
Return result
End Function
End Class
Public Structure triple
Public name As String
Public ID As Integer
Public data As String
End Structure
جهت استفاده از کلاس فوق لازم است در
فايل Global.asax
تغييرات زير را اعمال کنيم:
Sub
Application_Start(ByVal sender As Object, ByVal e As EventArgs)
' Fires when the application is started
StaticContainer.InitThing()
End Sub
Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
' Fires when the session is started
Session.Add("key", DateTime.Now.Ticks.ToString("x"))
StaticContainer.AddContainer(Session.Item("key"))
End Sub
Sub Session_End(ByVal sender As Object, ByVal e As EventArgs)
' Fires when the session ends
StaticContainer.RemoveContainer(Session.Item("key"))
End Sub
Sub Application_End(ByVal sender As Object, ByVal e As EventArgs)
' Fires when the application ends
StaticContainer.KillThing()
End Sub
برای ذخيره شناسه يا
ID مربوط
Container و کاربر از Session
استفاده نموديم. هنگامی که برنامه برای اولين بار اجرا می شود Hashtable
مورد نظر ايجاد شده و هنگامی که Session شروع
می شود فضای مربوط به نگهداری مقادير به ازای هر کاربر نيز ايجاد می گردد. نحوه
استفاده از اين برنامه فوق بصورت زير است:
StaticContainer.AddToContainer(TextBox1.Text, Integer.Parse(TextBox2.Text),
TextBox3.Text, Session.Item("key"))
Dim t As triple = StaticContainer.GetEntry(Integer.Parse(TextBox4.Text),
Session.Item("key"))
ListBox1.Items.Add(t.name)
ListBox1.Items.Add(t.ID.ToString())
ListBox1.Items.Add(t.data)
همانگونه که ملاحظه می فرمائيد ديگر
نيازی به تبديل به تايپ های مختلف نداشته و در عوض بجای ساختار
triple
شما هر نوع ساختاری را با هر نوع تعداد متغير را می توانيد تعريف و استفاده نمائيد.
منبع:
http://www.dotnetjunkies.com/tutorials.aspx?tutorialid=600