تبلیغات
آموزشASP.NET - State Management در ASP. NET 2.0 (بخش سوم)
 
فردا روشن اسن به
آموزشASP.NET
صفحه نخست         تماس با مدیر         پست الکترونیک        RSS         ATOM
 
 
سه شنبه 24 اسفند 1389 :: نویسنده : ارش کاکاوند

در این بخش به بررسی نحوه نگهداری 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  آشنا خواهیم شد .





نوع مطلب :
برچسب ها :
لینک های مرتبط :


جمعه 24 شهریور 1396 12:07 ق.ظ
My developer is trying to persuade me to move to .net from PHP.
I have always disliked the idea because of the costs.
But he's tryiong none the less. I've been using WordPress on a number
of websites for about a year and am concerned about switching to
another platform. I have heard fantastic things about blogengine.net.
Is there a way I can import all my wordpress posts into it?
Any kind of help would be greatly appreciated!
پنجشنبه 23 شهریور 1396 10:35 ب.ظ
Your style is unique in comparison to other people I've read stuff from.
Thanks for posting when you've got the opportunity,
Guess I will just book mark this blog.
چهارشنبه 15 شهریور 1396 02:33 ب.ظ
hi!,I really like your writing so a lot! share we be in contact extra about your post on AOL?
I need a specialist in this space to unravel my problem.
Maybe that's you! Taking a look ahead to see
you.
دوشنبه 30 مرداد 1396 09:56 ق.ظ
I'm not sure where you're getting your info, but good topic.

I needs to spend some time learning more or understanding more.
Thanks for wonderful information I was looking for this information for my mission.
دوشنبه 25 اردیبهشت 1396 08:45 ق.ظ
If you wish for to take a great deal from this
article then you have to apply such methods to your won webpage.
 
لبخندناراحتچشمک
نیشخندبغلسوال
قلبخجالتزبان
ماچتعجبعصبانی
عینکشیطانگریه
خندهقهقههخداحافظ
سبزقهرهورا
دستگلتفکر


درباره وبلاگ

سلام من آرش کاکاوند دانشجوی رشته کامپیوتر هستم و ورود شما رابه دنیای aspخوش امدمیگم.حتما نظر بدین تا من کارم رو بهتر ادامه بدم

مدیر وبلاگ : ارش کاکاوند
مطالب اخیر
نویسندگان
صفحات جانبی
نظرسنجی
شما کدام یک از برنامه های زیر را برای طراحی وب انتخاب می کنید؟








جستجو

آمار وبلاگ
کل بازدید :
بازدید امروز :
بازدید دیروز :
بازدید این ماه :
بازدید ماه قبل :
تعداد نویسندگان :
تعداد کل پست ها :
آخرین بازدید :
آخرین بروز رسانی :