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

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


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

State Management در ASP. NET 2.0 (بخش پنجم)
آنچه تاكنون گفته شده است :

 بخش اول

 مفاهيم اوليه

:

 ضرورت مديريت state در برنامه هاي وب

 بخش دوم  

 view state   

:  نحوه ايمن سازي اطلاعات ذخيره شده در view state
 بخش سوم  

view state

: نحوه نگهداري Member Variables و اشياء سفارشي
 بخش چهارم

cross-page posting

: انتقال اطلاعات از يك صفحه به صفحه اي ديگر

در  بخش چهارم با نحوه انتقال اطلاعات از يك صفحه به صفحه ديگر با استفاده از cross-page posting آشنا شديم . در اين بخش بحث خود را بر روي cross-page posting  ادامه داده و با نحوه دريافت اطلاعات بيشتر از صفحه مبداء آشنا خواهيم شد . 

نحوه دريافت اطلاعات از صفحه مبداء
در مثال ارائه شده در
بخش چهارم با نحوه عملكرد cross-page postback  آشنا شديم و با بررسي يك مثال كاربردي ، عنوان صفحه مبداء در صفحه مقصد استخراج و  در خروجي نمايش داده شد. شايد براي بسياري از خوانندگان اين سوال مطرح شده باشد كه چگونه مي توان اطلاعاتي ديگر نظير مقادير درج شده در text boxes موجود بر روي صفحه مبداء ( CrossPage1.aspx ) را در صفحه مقصد ( CrossPage2.aspx ) بازيابي و از آنها استفاده كرد؟
در زمان پيكربندي يك صفحه براي عمليات cross-page posting ، اغلب پياده كنندگان تمايل به دريافت اطلاعات از صفحه مبداء را دارند . اين اطلاعات مي تواند شامل كنترل هاي موجود بر روي صفحه مبداء و يا خصلت هاي عمومي صفحه مبداء باشد .

دريافت مقادير كنترل ها
كلاس Page داراي يك خصلت با نام PreviousPage است . در صورتي كه صفحه مبداء و مقصد در يك برنامه مشابه ASP.NET باشند ، خصلت PreviousPage در صفحه مقصد شامل يك مرجع به صفحه مبداء خواهد بود .
در صورتي كه صفحات مبداء و مقصد  در برنامه هاي متفاوتي باشند ، خصلت PreviousPage مقداردهي اوليه نخواهد شد و نمي توان از طريق صفحه مقصد مستقيما" به مقادير كنترل هاي موجود بر روي صفحه مبداء دستيابي داشت . در چنين مواردي مي توان با استفاده از ديكشنري Form اقدام به خواندن داده ارسال شده نمود . همچنين ، در چنين مواردي امكان خواندن مقادير ذخيره شده در view state صفحه مبداء وجود نخواهد داشت . در صورتي كه بخواهيم مقاديري را در صفحه مبداء ذخيره نمائيم و آنها را براي يك صفحه مقصد و در يك برنامه ديگر قابل دسترس نمائيم  ، مي توان مقادير مورد نظر را به عنوان رشته درون فيلدهاي مخفي بر روي صفحه مبداء ذخيره و در صفحه مقصد از طريق Request.Form به آنها دستيابي داشت .
با استفاده از مرجع در خصلت  PreviousPage مي توان عمليات جستجو بر روي صفحه مبداء را به منظور بازيابي و استخراج مقادير مورد نظر توسط متد FindControl انجام داد .
كد زير نحوه بازيابي مقادير درج شده در  كنترل هاي  Textbox موجود بر روي صفحه مبداء (CrossPage1.aspx) را نشان مي دهد .

بازيابي مقادير كنترل هاي موجود در صفحه مبداء
(Script section صفحه مقصد )

<script runat="server">
Protected
Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
  If PreviousPage IsNot Nothing Then
    Dim
txtSourceFirstName As TextBox
    Dim txtSourceLastName As TextBox
    txtSourceFirstName = CType(PreviousPage.FindControl("txtFirstName"), TextBox)
    txtSourceLastName = CType(PreviousPage.FindControl("txtLastName"), TextBox)
    lblInfo.Text = " نام و نام خانوادگي دريافت شده از صفحه مبداء " & _
                     
 txtSourceFirstName.Text & " " & txtSourceLastName.Text
  End If
End
Sub
</
script>

متد FindControl ، كنترل هاي مورد نظر را در فهرست جاري نام جستجو مي نمايد . در صورتي كه قصد جستجوي  كنترل موجود در كنترل ديگر را داشته باشيم ( نظير يك تمپليت ) ، مي بايست در ابتدا يك مرجع به آْن را ايجاد و عمليات جستجو  را در آن فهرست انجام داد . 

دريافت مقادير خصلت هاي عمومي 
در صفحه مقصد يك cross-page posting ، مي توان مقادير فيلدهاي عمومي موجود در صفحه مبداء را دريافت كرد . بدين منظور صفحه مبداء خصلت هائي عمومي را با توجه به اهداف عملياتي برنامه تعريف مي نمايد تا در ادامه صفحه مقصد بتواند به آنها دستيابي داشته باشد ( به عنوان يك توصيه امنيتي پيشنهاد شده است كه حجم اين گونه اطلاعات عمومي كمتر در نظر گرفته شود تا آسيب پذيري كد در مقابل حملات كاهش يابد ) .
براي دريافت فيلدهاي عمومي صفحه مبداء ، در ابتدا  مي بايست يك مرجع به صفحه مبداء را تعريف كرد . بدين منظور مي توان از روش هاي مختلفي استفاده كرد . استفاده از دايركتيو   PreviousPageType @  در صفحه مقصد كه به كمك آن صفحه مبداء مشخص مي گردد ، يكي از روش هاي موجود در اين زمينه است .
كد زير نحوه انجام اين كار را مشخص مي نمايد .

<%@ PreviousPageType VirtualPath="~/CrossPage1.aspx" %>

پس از استقرار دايركتيو فوق در صفحه مقصد ، خصلت PreviousPage به كلاس صفحه مبداء اشاره خواهد داشت ( به عنوان يك مرجع ) . در ادامه  مي توان مستقيما"  به اعضاء عمومي موجود در صفحه مبداء دستيابي داشت .
به عنوان مثال، در صورتي كه قصد داشته باشيم از مقادير موجود در دو text box صفحه مبداء‌ استفاده نمائيم (صفحه CrossPage1.aspx)، مي توان خصلت هائي را به منظور استفاده از متغيرهاي كنترل به آن اضافه كرد .
در نمونه كد زير دو خصلت به كلاس CrossPage1 اضافه شده است تا بتوان از مقادير كنترل هاي Textbox در صفحه مقصد استفاده كرد . 

Public ReadOnly Property FirstNameTextBox() As TextBox
    Get
       Return
txtFirstName
    End Get
End Property

Public ReadOnly Property LastNameTextBox() As TextBox
    Get
      Return
txtLastName
    End Get
End Property

در صورتي كه صفحه مقصد شامل دايركتيو PreviousPageType باشد كه توسط آن  به صفحه مبداء اشاره مي گردد ، مي توان به خصلت هاي عمومي صفحه مبداء دستيابي داشت .

 مثال 
براي بازنويسي مثال ارائه شده در بخش چهارم  مراحل زير را انجام مي دهيم .
مرحله اول: بازنويسي صفحه CrossPage1.aspx . كد فوق مشابه كد نوشته شده در بخش چهارم  است با اين تفاوت كه براي دستيابي به نام و نام حانوادگي درج شده در هر Textbox يك خصلت عمومي با نام FullName تعريف شده است تا نام و نام خانوادگي ورودي را در خود نگهداري نمايد .

صفحه  Crosspage1.aspx

<%@ Page Language="VB" Culture="fa-IR" UICulture="fa-IR" %>

<script runat="server">
  Public
ReadOnly Property FullName() As
String
     
Get
        
Return txtFirstName.Text & " " & txtLastName.Text
     End Get
 
End Property
</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 ) بدون نياز به تغيير ساير بخش هاي برنامه تغيير داد . مثلا" ، در صورتي كه تصميم داشته باشيم از كنترل هاي مختلفي براي درج نام در صفحه CrossPage1.aspx استفاده نمائيم ، مي بايست بر روي كد مربوط به خصلت FullName متمركز گرديد . تغيير فوق صرفا" در صفحه CrossPage1.aspx اعمال مي گردد و ضرورتي به تغيير صفحه CrossPage2.aspx وجود نخواهد داشت .

مرحله دوم : بازنويسي صفحه CrossPage2.aspx . در بازنويسي صفحه فوق در اولين اقدام از دايركتيو PreviousPageType @ براي معرفي كلاس صفحه مبداء استفاده شده است تا به كمك آن بتوان به اعضاء عمومي تعريف شده در صفحه مبداء دستيابي داشت . براي دستيابي به خصلت عمومي FullName ، از PreviousPage.FullName استفاده شده است .

صفحه  Crosspage2.aspx

<%@ Page Language="VB"  Culture="fa-IR" UICulture="fa-IR" %>
<%@ PreviousPageType VirtualPath="~/crossPage1.aspx" %>

<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 />"
       lblInfo.Text &=
"نام و نام خانوادگي دريافت شده از صفحه مبداء " & _
   
  & "<b>" & PreviousPage.FullName & "<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 ، خروجي برنامه فوق را نشان مي دهد .

دستيابي به مقادير كنترل ها در صفحه مقصد

شكل 1 : دستيابي به مقادير كنترل ها در صفحه مقصد

ASP. NET از ويژگي جالبي براي كاركرد بهتر فرآيند cross-page postbacks استفاده مي نمايد . اولين مرتبه اي كه صفحه مقصد به Page.PreviousPage دستيابي پيدا مي نمايد ، ASP. NET  شي صفحه قبلي ( مبداء) را ايجاد نمايد  . براي انجام اين كار ، ASP. NET پردازش صفحه را آغاز  ولي آن را  قبل از رسيدن به مرحله PreRender با وقفه متوقف نموده  و اجازه نمي دهد كه صفحه خروجي HTML را توليد نمايد .
روش فوق داراي اثرات جانبي جالبي  ‌است ، مثلا" تمامي رويدادهاي صفحه مربوط به صفحه قبل ( نظير  Page.Load  و Page.Init )  به همراه رويداد Button.Click  كه باعث cross-page postback شده است ، فعال مي گردند  . علت فعال شدن رويدادهاي فوق ، مقدار دهي صفحه مبداء توسط ASP.NET است . 

بررسي  PostBack در صفحه مقصد
در حين فرآيند cross-page postback ، محتويات كنترل هاي موجود بر روي صفحه مبداء براي صفحه مقصد ارسال و مرورگر يك عمليات HTTP POST را انجام مي دهد ( نه عمليات GET ) . در صفحه مقصد و بلافاصله پس از عمليات postback ، مقدار خصلت IsPostBack برابر با false خواهد شد . با اين كه ماهيت عمليات در واقع يك POST را نشان مي دهد ، ولي cross-posting بيانگر يك Postback به صفحه مقصد نمي باشد . 
در برخي موارد لازم است كه در يك برنامه تشخيص دهيم كه  آيا يك cross-page post واقع شده است. در چنين مواردي مي توان  مقدار خصلت  IsCrossPagePostBack  را بر روي صفحه مقصد كه توسط خصلت PreviousPage   صفحه مقصد برگردانده شده است ، بررسي كرد .
كد زير نحوه انجام اين كار را نشان مي دهد .

If PreviousPage IsNot Nothing Then
    If PreviousPage.IsCrossPagePostBack = True Then
         Label1.Text = "Cross-page post."
    End If
Else
    Label1.Text = "Not a cross-page post."
End If

در بخش ششم با نحوه انتقال اطلاعات بين صفحات با استفاده از روش Query String آشنا خواهيم شد .

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

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