0

نحوه نگهداری Member Variables و اشیاء سفارشی ASP .NET

 
amirpetrucci0261
amirpetrucci0261
کاربر طلایی1
تاریخ عضویت : تیر 1388 
تعداد پست ها : 27726
محل سکونت : http://zoomstar.ir/

نحوه نگهداری Member Variables و اشیاء سفارشی ASP .NET
چهارشنبه 10 آذر 1389  5:18 AM

نحوه نگهداری Member Variables و اشیاء سفارشی ASP .NET




در این بخش به بررسی نحوه نگهداری 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 خصوصی خواهند بود چراکه اکثر کد نوشته شده توسط پیاده کنندگان  در یک کلاس صفحه وب قرار می گیرد .
به موازات تلاش جهت ایجاد عناصر نرم افزاری با قابلیت استفاده مجدد ، اهمیت قابلیت دستیابی پذیری افزایش خواهد یافت .

در زیر انواع سطوح دستیابی رامشاهده می کنید.
کلید واژه      قابلیت دستیابی پذیری
Public      امکان دستیابی توسط هر کلاس
Private      صرفا” امکان دستیابی به آن توسط متدهای درون کلاس جاری وجود دارد .
Friend      امکان دستیابی به آن توسط متدهای موجود در هر کلاس موجود در اسمبلی جاری ( فایل کد ترجمه شده  ) وجود دارد.
Protected      امکان دستیابی به آن توسط متدهای موجود در کلاس جاری و یا هر کلاسی که از این کلاس مشتق شده باشد ، وجود دارد



توجه داشته باشید که کلید واژه ” قابلیت دستیابی پذیری ” ، صرفا” در ارتباط با  member variable بکار گرفته نمی شود و از آن در ارتباط با متدها ، خصلت ها و رویدادها نیز استفاده می گردد.
ذخیره Member variables در view state
هر گونه اطلاعاتی که در یک member variable صفحه ASP. NET ذخیره می گردد ، بطور اتوماتیک و  پس از اتمام پردازش و ارسال صفحه برای سرویس گیرنده از بین می رود .
برای حل مشکلاتی این چنین می توان تمامی  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>

در زمان استفاده از روش فوق می بایست از ذخیره اطلاعات غیرضروری در 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  آشنا خواهیم شد
تشکرات از این پست
دسترسی سریع به انجمن ها