نحوه دريافت اطلاعات از صفحه مبداء در cross-page posting New Page 1



ساير




 

 

 

SAKHA RAVESH CO.

 ا مروز

 دوشنبه  8  خرداد  1396  2017  May  29   Monday ToDay
صفحه اصلی  مقالات نکته هادايره المعارف خودآموزها | تازه ها خود آزمون ها    
  نسخه قابل چاپ  

    5 4 3 2 1 

 عنوان

 نويسنده

  مشاهده

 تعداد آراء

 امتياز

 State Management در ASP. NET 2.0 (بخش پنجم)

 مديريت وب

10689

10

3.6

با توجه به جایگاه داده در عصر حاضر و  لزوم نگاه جامع به این مقوله مهم ، بر آن شدیم تا محوریت فعالیت های خود را بر  روی این موضوع متمرکز نمائیم . از این رو گروه فابک با شعار فناوری اطلاعات برای کسب وکار شکل گرفت و  خدمات خود  را از طریق  سایت www.fabak.ir  به مخاطبان محترم عرضه می نماید

 

State Management در ASP. NET 2.0

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 آشنا خواهيم شد .



جستجو

مقالات                 
دايره المعارف       
دوره های آموزشی


 

 

مشاهده گروه ها



              

 

 تهيه شده در شرکت سخا روش -  1382