ASP.NET2005
هل تريد التفاعل مع هذه المساهمة؟ كل ما عليك هو إنشاء حساب جديد ببضع خطوات أو تسجيل الدخول للمتابعة.

state managementدرasp.net(بخش سوم وچهارم)

اذهب الى الأسفل

state managementدرasp.net(بخش سوم وچهارم) Empty state managementدرasp.net(بخش سوم وچهارم)

پست  asie ahmadi الإثنين نوفمبر 23, 2009 1:37 pm

State Management در ASP. NET 2.0 (بخش سوم)


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

http://www.srco.ir/Articles/images/StateManagement2.jpg
در زمان استفاده از روش فوق می بايست از ذخيره اطلاعات غيرضروری در 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 قابل دستيابی نبوده و عملا" از بين خواهند رفت . برای غلبه بر محدوديت فوق ، از روش های متعدد ديگری می توان استفاده كرد .
________________________________________
samanvilli
State Management در ASP. NET (بخش چهارم)


يكی از مهمترين محدوديت های view state ، شعاع استفاده از اطلاعات ذخيره شده در آن توسط ساير صفحات وب است . اطلاعات ذخيره شده در view state صرفا" توسط صفحه ای كه آنها را ايجاد كرده است قابل استفاده می باشند و ساير صفحات نمی توانند از اطلاعات فوق استفاده نمايند . به عنوان مثال ، در صورتی كه كاربر به صفحه ای ديگر حركت و يا هدايت شود ، اطلاعات ذخيره شده در view state قابل دستيابی نبوده و عملا" از بين خواهند رفت . برای غلبه بر محدوديت فوق ( انتقال اطلاعات از يك صفحه به صفحه ديگر )، از روش های متعدد ديگری می توان استفاده كرد .
در اين بخش ، با روش انتقال اطلاعات از يك صفحه به صفحه ای ديگر با استفاده از cross-page posting آشنا خواهيم شد .

cross-page posting
يكی از امكانات جديد ارائه شده در ASP. NET 2.0 ، امكان postback يك صفحه به صفحه ای ديگر است ( برخلاف گزينه پيش فرض كه هر صفحه به خود postback می گردد ) .
بدين منظور خصلت جديد PostBackUrl در كنترل هائی نظير ImageButton ، LinkButton و Button پيش بينی شده است . برای استفاده از ويژگی فوق كافی است مقدار PostBackUrl برابر با آدرس صفحه مقصد در نظر گرفته شود . بدين ترتيب ، پس از كليك بر روی دكمه موجود بر روی فرم ، صفحه به همراه تمامی مقادير كنترل های ورودی موجود بر روی آن برای آدرس مشخص شده ارسال می گردد .

مثال
در اين مثال بر روی فرم وب از دو كنترل text box و يك كنترل button استفاده شده است ( صفحه Crosspage1.aspx ) . پس از كليك بر روی‌ دكمه موجود بر روی فرم ، اطلاعات موجود بر روی فرم برای صفحه ای با نام Crosspage2.aspx ارسال می گردد .

صفحه Crosspage1.aspx
<%@ Page Language="VB" Culture="fa-IR" UICulture="fa-IR" %>

<script runat="server">
</script>

<html xmlns="http://www.w3.org/1999/xhtml" dir="rtl" >
<head id="Head1" runat="server">
<title>صفحه اول </title>
</head>
<body style="font-family: Tahoma">
<form id="form1" runat="server" >
<div>
نام <asp:TextBox ID="txtFirstName" runat="server"></asp:TextBox><br /><br />
نام خانوادگی &nbsp;<asp:TextBox ID="txtLastName" runat="server"></asp:TextBox>&nbsp;<br />
<br />
<asp:Button runat="server" ID="cmdPost"
PostBackUrl="CrossPage2.aspx"
Text="ارسال به صفحه ديگر" Font-Names="Tahoma" /><br />
</div>
</form>
</body>
</html>

صفحه Crosspage1.aspx شامل هيچگونه كدی نمی باشد .
پس از اجرای كد فوق و كليك بر روی دكمه "ارسال به صفحه ديگر" ، صفحه برای CrossPage2.aspx ارسال می گردد . صفحه Crosspage2.aspx با استفاده از خصلت Page.PreviousPage قادر به برقراری ارتباط با صفحه Crosspage1.aspx خواهد بود .
كد زير نحوه دريافت و نمايش عنوان صفحه قبلی را در صفحه Crosspage2.aspx نشان می دهد .

صفحه Crosspage2.aspx
<%@ Page Language="VB" Culture="fa-IR" UICulture="fa-IR" %>

<script runat="server">
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
If PreviousPage IsNot Nothing Then
lblInfo.Text = "شما از صفحه ای با عنوان " & _
"<b>" & PreviousPage.Header.Title & "</b>" & _
" به اين صفحه آمده ايد" & "<br />"
End If
End Sub
</script>

<html xmlns="http://www.w3.org/1999/xhtml" dir="rtl" >
<head id="Head1" runat="server">
<title>صفحه دوم</title>
</head>
<body style="font-family: Tahoma">
<form id="form1" runat="server" >
<div>
<asp:Label ID="lblInfo" runat="server" Font-Size="Small"></asp:Label>
</div>
</form>
</body>
</html>

شكل 1 ، نحوه انتقال اطلاعات از يك صفحه به صفحه ديگر را نشان می دهد يكی از مهمترين محدوديت های view state ، شعاع استفاده از اطلاعات ذخيره شده در آن توسط ساير صفحات وب است . اطلاعات ذخيره شده در view state صرفا" توسط صفحه ای كه آنها را ايجاد كرده است قابل استفاده می باشند و ساير صفحات نمی توانند از اطلاعات فوق استفاده نمايند . به عنوان مثال ، در صورتی كه كاربر به صفحه ای ديگر حركت و يا هدايت شود ، اطلاعات ذخيره شده در view state قابل دستيابی نبوده و عملا" از بين خواهند رفت . برای غلبه بر محدوديت فوق ( انتقال اطلاعات از يك صفحه به صفحه ديگر )، از روش های متعدد ديگری می توان استفاده كرد .
در اين بخش ، با روش انتقال اطلاعات از يك صفحه به صفحه ای ديگر با استفاده از cross-page posting آشنا خواهيم شد .

cross-page posting
يكی از امكانات جديد ارائه شده در ASP. NET 2.0 ، امكان postback يك صفحه به صفحه ای ديگر است ( برخلاف گزينه پيش فرض كه هر صفحه به خود postback می گردد ) .
بدين منظور خصلت جديد PostBackUrl در كنترل هائی نظير ImageButton ، LinkButton و Button پيش بينی شده است . برای استفاده از ويژگی فوق كافی است مقدار PostBackUrl برابر با آدرس صفحه مقصد در نظر گرفته شود . بدين ترتيب ، پس از كليك بر روی دكمه موجود بر روی فرم ، صفحه به همراه تمامی مقادير كنترل های ورودی موجود بر روی آن برای آدرس مشخص شده ارسال می گردد .

مثال
در اين مثال بر روی فرم وب از دو كنترل text box و يك كنترل button استفاده شده است ( صفحه Crosspage1.aspx ) . پس از كليك بر روی‌ دكمه موجود بر روی فرم ، اطلاعات موجود بر روی فرم برای صفحه ای با نام Crosspage2.aspx ارسال می گردد .

صفحه Crosspage1.aspx
<%@ Page Language="VB" Culture="fa-IR" UICulture="fa-IR" %>

<script runat="server">
</script>

<html xmlns="http://www.w3.org/1999/xhtml" dir="rtl" >
<head id="Head1" runat="server">
<title>صفحه اول </title>
</head>
<body style="font-family: Tahoma">
<form id="form1" runat="server" >
<div>
نام <asp:TextBox ID="txtFirstName" runat="server"></asp:TextBox><br /><br />
نام خانوادگی &nbsp;<asp:TextBox ID="txtLastName" runat="server"></asp:TextBox>&nbsp;<br />
<br />
<asp:Button runat="server" ID="cmdPost"
PostBackUrl="CrossPage2.aspx"
Text="ارسال به صفحه ديگر" Font-Names="Tahoma" /><br />
</div>
</form>
</body>
</html>

صفحه Crosspage1.aspx شامل هيچگونه كدی نمی باشد .
پس از اجرای كد فوق و كليك بر روی دكمه "ارسال به صفحه ديگر" ، صفحه برای CrossPage2.aspx ارسال می گردد . صفحه Crosspage2.aspx با استفاده از خصلت Page.PreviousPage قادر به برقراری ارتباط با صفحه Crosspage1.aspx خواهد بود .
كد زير نحوه دريافت و نمايش عنوان صفحه قبلی را در صفحه Crosspage2.aspx نشان می دهد .

صفحه Crosspage2.aspx
<%@ Page Language="VB" Culture="fa-IR" UICulture="fa-IR" %>

<script runat="server">
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
If PreviousPage IsNot Nothing Then
lblInfo.Text = "شما از صفحه ای با عنوان " & _
"<b>" & PreviousPage.Header.Title & "</b>" & _
" به اين صفحه آمده ايد" & "<br />"
End If
End Sub
</script>

<html xmlns="http://www.w3.org/1999/xhtml" dir="rtl" >
<head id="Head1" runat="server">
<title>صفحه دوم</title>
</head>
<body style="font-family: Tahoma">
<form id="form1" runat="server" >
<div>
<asp:Label ID="lblInfo" runat="server" Font-Size="Small"></asp:Label>
</div>
</form>
</body>
</html>

شكل 1 ، نحوه انتقال اطلاعات از يك صفحه به صفحه ديگر را نشان می دهد

http://www.srco.ir/Articles/images/StateManagement3.jpg
در صفحه Crosspage2.aspx قبل از تلاش برای دستيابی به شی PreviousPage ، مقدار آن با null بررسی می گردد . در صورتی كه مقدار آن معادل null باشد ، cross-page postback محقق نشده است . اين بدان معنی است كه صفحه Crosspage2.aspx مستقيما" درخواست شده است و يا به خود postback شده است . در چنين مواردی شی PreviousPage قابل دسترس نخواهد بود .

asie ahmadi
کاربر عادی
کاربر عادی

تعداد پستها : 16
تاريخ التسجيل : 2009-11-08

بازگشت به بالاي صفحه اذهب الى الأسفل

بازگشت به بالاي صفحه

- مواضيع مماثلة

 
صلاحيات هذا المنتدى:
شما نمي توانيد در اين بخش به موضوعها پاسخ دهيد