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

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





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


دوشنبه 27 شهریور 1396 04:26 ق.ظ
great points altogether, you simply gained a logo new reader.
What could you recommend in regards to your publish that you simply made some
days in the past? Any sure?
جمعه 17 شهریور 1396 07:28 ق.ظ
When I initially commented I clicked the "Notify me when new comments are added" checkbox and now each time a comment is added I get four e-mails with the same comment.
Is there any way you can remove people from that service? Thank you!
چهارشنبه 15 شهریور 1396 03:33 ب.ظ
you're in point of fact a excellent webmaster. The website loading
speed is amazing. It kind of feels that you're doing any
distinctive trick. Also, The contents are masterwork. you've performed a
excellent task in this matter!
دوشنبه 30 مرداد 1396 12:25 ب.ظ
I'd like to find out more? I'd love to find out some additional information.
 
لبخندناراحتچشمک
نیشخندبغلسوال
قلبخجالتزبان
ماچتعجبعصبانی
عینکشیطانگریه
خندهقهقههخداحافظ
سبزقهرهورا
دستگلتفکر


درباره وبلاگ

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

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








جستجو

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