جستجو در محصولات

گالری پروژه های افتر افکت
گالری پروژه های PSD
جستجو در محصولات


تبلیغ بانک ها در صفحات
ربات ساز تلگرام در صفحات
ایمن نیوز در صفحات
.. سیستم ارسال پیامک ..
State Management در ASP. NET 2.0 (بخش سوم)
-(3 Body) 
State Management در ASP. NET 2.0 (بخش سوم)
Visitor 1134
Category: کامپيوتر

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 ،  خروجي برنامه فوف را نشان مي دهد .

 ذخيره Member variables در view state
شكل 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  آشنا خواهيم شد .

برگرفته از سايت سخا روش

Add Comments
Name:
Email:
User Comments:
SecurityCode: Captcha ImageChange Image