نحوه دریافت اطلاعات از صفحه مبداء ASP .NET
در این بخش بحث خود را بر روی 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 PropertyPublic 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 />
نام خانوادگی <asp:TextBox ID=”txtLastName” runat=”server”></asp:TextBox> <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>
شکل ۱ ، خروجی برنامه فوق را نشان می دهد .
شکل ۱ : دستیابی به مقادیر کنترل ها در صفحه مقصد
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