عنوان
|
نويسنده
|
مشاهده
|
تعداد
آراء |
امتياز
|
State Management در ASP. NET 2.0 (بخش سوم) |
مديريت وب |
11355 |
5 |
4 |
با توجه به جایگاه داده در عصر حاضر و لزوم نگاه جامع به این مقوله مهم ، بر آن شدیم تا محوریت فعالیت های خود را بر روی این موضوع متمرکز نمائیم . از این رو گروه فابک با شعار فناوری اطلاعات برای کسب وکار شکل گرفت و خدمات خود را از طریق سایت www.fabak.ir به مخاطبان محترم عرضه می نماید
 |
State Management در ASP. NET 2.0
State Management در ASP. NET 2.0 (بخش
سوم)
آنچه تاكنون گفته شده است :
بخش اول |
مفاهيم اوليه
|
: |
ضرورت مديريت state در برنامه های وب |
بخش
دوم |
view state |
: |
نحوه ايمن سازی اطلاعات ذخيره شده در
view state
|
در اين بخش به بررسی
نحوه نگهداری
member variable
و اشياء سفارشی در view state خواهيم پرداخت .
اجازه دهيد قبل از تشريح موارد فوق ، در ابتدا اشاره ای به انواع متعيرها داشته
باشيم .
انواع متغيرها
پس از ايجاد ساختار اوليه يك كلاس ، می بايست عناصر داده پايه را
به آن اضافه نمود .
در كد زير ، سه member variable تعريف شده است كه اطلاعاتی
را در ارتباط با product ( شامل نام ، قيمت و
URL آن كه به يك فايل
image اشاره می نمايد )
در خود نگهداری می نمايند .
Public Class
Product
Private name As String
Private price As Decimal
Private imageUrl As String
End Class |
يك متغير محلی صرفا" تا
زمانی وجود خواهد داشت كه فعاليت متد جاری ادامه
داشته باشد . به عبارت ديگر ، يك member variable ( و يا فيلد ) به عنوان بخشی از كلاس تعريف می
شود و برای تمامی متدهای موجود در كلاس قابل دسترس و استفاده است . اين نوع متغيرها
، پس از ايجاد شی ، ايجاد خواهند شد و تا زمانی كه شی مورد نظر به فعاليت خود ادامه
می دهد ، آنها نيز فعال و به حيات خود ادامه خواهند داد .
زمانی كه يك member variable تعريف می گردد ، می بايست با
صراحت قابليت دستيابی به آن مشخص گردد . قابليت دستيابی پذيری مشخص می نمايد كه چه
بخش هائی از كد قادر به خواندن و تغيير اين متغير می باشند . مثلا" اگر شی
A شامل يك متغير خصوصی (Private
) باشد ، شی B قادر به خواندن و تغيير آن نخواهد
بود و
صرفا" شی A قادر به انجام اين كار خواهد بود . به عبارت
ديگر ، اگر شی A دارای يك متغير عمومی (
public ) باشد ، هر شی ديگر موجود در برنامه اين آزادی عمل
را خواهد داشت كه اقدام به خواندن و تغيير اطلاعات ذخيره شده در آن نمايد .
متغيرهای محلی از هيچگونه كليد واژه قابليت دستيابی پذيری حمايت نمی نمايند چراكه
اين نوع متغيرها هرگز نمی توانند برای ساير كد های موجود در خارج از متد جاری در
دسترس باشند .
در يك برنامه ساده
ASP. NET ، اكثر member variables خصوصی خواهند بود چراكه اكثر كد
نوشته شده توسط پياده كنندگان در يك كلاس صفحه وب قرار می گيرد .
به موازات تلاش جهت ايجاد عناصر نرم افزاری با قابليت استفاده مجدد ، اهميت قابليت
دستيابی پذيری افزايش خواهد يافت .
جدول 1 انواع سطوح دستيابی را نشان می دهد .
كليد واژه |
قابليت دستيابی
پذيری |
Public |
امكان دستيابی توسط
هر كلاس |
Private |
صرفا" امكان دستيابی به آن توسط متدهای درون كلاس
جاری وجود دارد
. |
Friend |
امكان دستيابی به آن توسط متدهای موجود در هر كلاس
موجود در اسمبلی جاری ( فايل كد ترجمه شده ) وجود دارد. |
Protected |
امكان دستيابی به آن توسط متدهای موجود در كلاس جاری
و يا هر كلاسی كه از اين كلاس مشتق
شده باشد ، وجود دارد |
جدول 1 انواع سطوح
دستيابی
توجه داشته باشيد كه
كليد واژه " قابليت دستيابی پذيری " ، صرفا" در ارتباط با member
variable بكار گرفته نمی شود
و از آن در ارتباط با متدها ، خصلت ها و رويدادها نيز استفاده می
گردد.
ذخيره Member variables در
view state
هر گونه اطلاعاتی كه در يك member variable
صفحه ASP. NET ذخيره می گردد ، بطور اتوماتيك و پس
از اتمام پردازش و ارسال صفحه برای سرويس گيرنده از بين می رود ( به عنوان نمونه
متغير counter در مثال ارائه شده در
بخش اول
) .
برای حل مشكلاتی اين
چنين می توان تمامی member variables
را در زمان بروز رويداد Page.PreRender در
view state ذخيره و زمانی كه رويداد
Page.Load ايجاد می گردد آنها را بازيابی كرد . رويداد
Load هر مرتبه كه صفحه ايجاد می شود ، محقق می گردد . در
زمان postback ، در ابتدا رويداد Load محقق شده و در ادامه ساير رويدادهای مرتبط با كنترل ها ايجاد
خواهند شد .
مثال
در كد زير از روش فوق در ارتباط با متغيری با نام
Contents ، استفاده شده است . در اين صفحه يك text box
به همراه دو button ارائه شده است .
كاربر در خصوص ذخيره و يا بازيابی داده از view state
تصميم می گيرد . روتين های
مربوط به رويداد كليك هر يك از دكمه های
موجود بر روی فرم ، مسئوليت ذخيره و بازيابی داده در متغير
Contents را برعهده دارند . در روتين های فوق ضرورتی به ذخيره و بازيابی
مقدار متغير contents در
view state وجود ندارد چراكه
اين مسئوليت به روتين های رويدادهای Load و PreRender
واگذار شده است تا در زمان آغاز و اتمام پردازش صفحه ، وظايف اشاره شده ( ذخيره و
بازيابی ) را انجام دهند .
<%@
Page
Language="VB"
Culture="fa-IR"
UICulture="fa"
%>
<script
runat="server">
Private
Contents As
String
Protected
Sub Page_Load(ByVal
sender As
Object,
ByVal e
As EventArgs)
Handles
Me.Load
If Me.IsPostBack
Then
Contents =
CType(ViewState("Text"),
String)
End If
End Sub
Protected Sub
Page_PreRender(ByVal
sender As
Object,
ByVal e
As System.EventArgs)
Handles
Me.PreRender
ViewState("Text") =
Contents
End
Sub
Protected Sub
cmdSave_Click(ByVal
sender As
Object,
ByVal e
As EventArgs)Handles
cmdSave.Click
Contents = txtValue.Text
txtValue.Text = ""
End
Sub
Protected Sub
cmdLoad_Click(ByVal
sender As
Object,
ByVal e
As EventArgs)
Handles cmdLoad.Click
txtValue.Text = Contents
End
Sub
</script>
<html
xmlns="http://www.w3.org/1999/xhtml"
dir="rtl"
>
<head
id="Head1"
runat="server">
<title>ذخيره
member variable</title>
</head>
<body
style="font-family:
Tahoma">
<form
id="form1"
runat="server">
<div>
<asp:TextBox
ID="txtValue"
runat="server"
Height="153px"
TextMode="MultiLine"
Width="341px"
Font-Names="Tahoma"
>نحوه ذخيره و
بازيابی متغيرهای member در view state</asp:TextBox><br
/>
<br
/>
<asp:Button
ID="cmdSave"
runat="server"
Text="ذخيره
" Font-Names="Tahoma"
/>
<asp:Button
ID="cmdLoad"
runat="server"
Text="بازيابی"
Font-Names="Tahoma"
/>
</div>
</form>
</body>
</html>
|
شكل 1 ، خروجی برنامه فوف را نشان می دهد .

شكل 1 : ذخيره Member variables در view state
در
زمان استفاده از روش فوق می بايست از ذخيره اطلاعات غيرضروری
در view state اجتناب گردد ، چراكه در چنين مواردی ، حجم
خروجی صفحه نهائی افزايش می يابد . اين موضوع می تواند كاهش سرعت انتقال صفحه را به
دنبال داشته باشد .
در صورت ضرورت استفاده از رويكرد فوق برای ذخيره member
variable در view state ، می
بايست از آن
در موارد كاملا" خاص استفاده
شود .
ذخيره اشياء سفارشی
پياده كنندگان می توانند اشياء خود را در view state
ذخيره نمايند . برای ذخيره يك آيتم در view state ، می
بايست امكان تبديل آن به مجموعه
ای از بايت ها وجود داشته باشد تا بتوان آن را
در يك
فيلد ورودی مخفی ذخيره كرد . به فرآيند فوق serialization می
گويند . در صورتی كه
اشياء تعريف شده توسط پياده كنندگان قابليت تبديل به مجموعه ای از
بايت ها را نداشته باشند ( به صورت پيش فرض اين قابليت
وجود ندارد ) ، در زمان
استقرار آنها در view state
يك پيام خطاء مواجه خواهيم شد.
برای ايجاد قابليت serializable در اشياء تعريف شده ، می بايست
خصلت [Serializable] را به تعريف كلاس اضافه
كرد .
كد زير نحوه انجام اين كار را نشان می دهد .
<Serializable()> _
Public
Class Customer
Public
FirstName As
String
Public LastName
As
String
Public
Sub
New(ByVal
firstName As
String,
ByVal lastName
As
String)
Me.FirstName = firstName
Me.LastName = lastName
End
Sub
End
Class |
با توجه به اين كه
در كلاس Customer خصلت serializable تعريف شده است ،
امكان ذخيره آن در view state وجود
خواهد داشت .
Dim
customer1 As
New Customer("MyFirstName","MyLastName")
ViewState("CurrentCustomer")
= customer1 |
در زمان استفاده از اشياء سفارشی ، پس از بازيابی داده از
view state می بايست آنها را تبديل ( cast )
كرد.
Dim
customer1 As
Customer
customer1 =
CType(ViewState("CurrentCustomer"),
Customer) |
آيا تمامی اشياء دات نت را می توان در view state
ذخيره كرد ؟
پس از بررسی مستندات
يك كلاس و با مشاهده خصلت [Serializable] ،
امكان ذخيره شی مورد نظر در
view state وجود خواهد داشت . در صورتی كه شی مورد نظر فاقد
خصلت فوق باشد
، امكان ذخيره آن در view state وجود نخواهد
داشت .
در چنين مواردی می توان از روش های ديگر state management
كه در بخش های بعدی به آنها اشاره خواهيم كرد، استفاده كرد.
يكی از مهمترين محدوديت
های view state ، شعاع استفاده
از اطلاعات ذخيره شده در آن توسط ساير صفحات وب است . اطلاعات ذخيره شده در
view state صرفا" توسط صفحه ای كه آنها را ايجاد كرده
است قابل استفاده خواهند بود و ساير صفحات قادر به استفاده از اطلاعات نخواهند بود
. به عنوان مثال ، در صورتی كه كاربر به صفحه ای ديگر حركت و يا هدايت شود ،
اطلاعات ذخيره شده در view state قابل دستيابی نبوده و
عملا" از بين خواهند رفت . برای غلبه بر محدوديت فوق ، از روش های متعدد ديگری می
توان استفاده كرد .
در بخش چهارم ، با روش های انتقال اطلاعات از يك صفحه به صفحه ای ديگر نظير
cross-page posting و query string آشنا خواهيم شد .