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

state managementدرasp.net(بخش پنجم وششم)

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

state managementدرasp.net(بخش پنجم وششم) Empty state managementدرasp.net(بخش پنجم وششم)

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

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


حوه دريافت اطلاعات از صفحه مبداء
در مثال ارائه شده در بخش چهارم با نحوه عملكرد 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 ، خروجی برنامه فوق را نشان می دهد .


http://www.srco.ir/Articles/images/StateManagement4.jpg

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
________________________________________
State Management در ASP. NET 2.0 (بخش ششم)


Query String
يكی ديگر از روش های ارسال اطلاعات بين صفحات ، استفاده از يك query string در URL است . از رويكرد فوق در موتورهای جستجو استفاده می گردد . مثلا" در صورت استفاده از موتور جستجوی گوگل ، پس از درج كليد واژه مورد نظر به يك URL جديد كه با پارامترهای جستجو تركيب می گردد ، هدايت می شويم.
!!!! برای مشاهده محتوا ، لطفا ثبت نام کنید / وارد شوید !!!! application+ASP.NET

query string ، به عنوان بخشی از URL محسوب می گردد و پس از علامت سوال آورده می شود . در مثال فوق ، يك متغير با نام q و مقدار web application +ASP. NET تعريف می گردد .
يكی از مهمترين مزايای query string ، عدم تحميل عمليات اضافه به سرويس دهنده است . علی رغم مزيت فوق ، رويكرد فوق دارای محدوديت های متعددی است كه به برخی از آنها اشاره می گردد :

*

اطلاعات محدود به رشته های ساده مشتمل بر كاراكترهای مجاز URL است .
*

اطلاعات توسط كاربران قابل مشاهده بوده و هر شخص علاقه مند می تواند آنها را استراق سمع نمايد .
*

كاربران ماهر می توانند محتويات query string را تغيير داده و وضعيتی را ايجاد نمايند كه برنامه قادر به واكنش مناسب با آن نباشد ( ايجاد شرايط غيرقابل پيش بينی )
*

تعداد زيادی از مرورگرها دارای محدوديت طول يك URL می باشند ( معمولا" بين يك تا دو كيلو بايت ) . بنابراين ، نمی توان حجم بالائی از اطلاعات را در query string ذخيره كرد و اين اطمينان را داشت كه اكثر مرورگرها بتوانند از آن استفاده نمايند ( به دليل عدم سازگاری ) .

علی رغم محدوديت های اشاره شده ، query string همچنان به عنوان مكانيزمی جهت ارسال داده از يك صفحه به صفحه ديگر استفاده می گردد . روش فوق در برنامه هائی با محوريت بانك های اطلاعاتی بيشتر مورد توجه است . در چنين مواردی در آغاز ليستی از آيتم هائی نمايش داده می شود كه متاثر از داده موجود در بانك اطلاعاتی است ( نظير ليست محصولات ، ليست مقالات ، ليست خبرها و ... ) . پس از انتخاب يكی از آيتم ها ، كاربر به صفحه ای ديگر هدايت می گردد تا اطلاعات بيشتری در ارتباط با آيتم انتخابی در اختيار وی گذاشته شود .
برای ذخيره اطلاعات در query string ، می بايست پياده كنندگان خود اطلاعات را در مكان مورد نظر قرار دهند . متاسفانه ، روشی مبتنی بر collection برای انجام اين كار وجود ندارد . اين بدان معنی است كه در چنين مواردی می بايست عموما" از يك كنترل Hyperlink خاص و يا عبارت Response.Redirect استفاده كرد .
كد زير كاربر را به صفحه newspage.aspx هدايت می نمايد . همراه با كاربر متغيری با نام recordID و مقدار 10 نيز برای صفحه فوق ارسال می گردد .
Response.Redirect("newpage.aspx?recordID=10")

در صورت نياز می توان چندين پارامتر را كه توسط علامت & ( ampersand ) از يكديگر جدا می شوند ، به صفحه مقصد ارسال كرد .
كد زير كاربر را به صفحه newspage.aspx هدايت می نمايد . همراه با كاربر متغيرهائی با نام recordID و مقدار 10 و mode با مقدار full نيز برای صفحه فوق ارسال می گردد .
Response.Redirect("newpage.aspx?recordID=10&mode=full")

صفحه دريافت كننده به سادگی می تواند اطلاعات ارسالی را دريافت نمايد . بدين منظور از مجموعه ديكشنری QueryString كه توسط شی Request ارائه شده است ، استفاده می گردد .
Dim ID As String = Request.QueryString("recordID")

توجه داشته باشيد كه اطلاعات همواره به عنوان يك رشته بازيابی می گردند و در صورت نياز می بايست آنها را به نوع داده مورد نظر تبديل كرد . مقادير ذخيره شده در مجموعه QueryString ، با استفاده از اسامی متغيرها ، ايندكس می گردند .
query string بر خلاف view state ، اطلاعات را كاملا" شفاف ، آشكارا و غير رمز شده ارسال می نمايد . بنابراين در مواردی كه لازم است اطلاعاتی بطور مخفی از يك صفحه به صفحه ديگر ارسال و يا بر روی آن حساسيت خاصی از نظر امنيتی وجود دارد ، استفاده از روش query string توصيه نمی گردد .

مثال
در اين مثال هدف بررسی نحوه عملكرد و يا رفتار query string با استفاده از دو صفحه است . در صفحه مبداء ليستی از آيتم ها در اختيار كاربر گذاشته می شود . پس از انتخاب يكی از آيتم ها ، كاربر به يك صفحه جديد ( مقصد ) هدايت می گردد . در صفحه مقصد آيتم انتخاب شده به همراه مقدار متغير mode در خروجی نمايش داده می شود .
صفحه مبداء شامل ليستی از آيتم ها ، يك check box ، يك كنترل label و دكمه "مشاهده اطلاعات " است .
كد زير محتويات صفحه مبداء ( QueryStringSender.aspx ) را نشان می دهد .

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

<script runat="server">
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
If Not Me.IsPostBack Then
lstItems.Items.Add("مقالات ")
lstItems.Items.Add("نكته ها")
lstItems.Items.Add("خودآزمون ها")
lstItems.Items.Add("خود آموزها")
lstItems.Items.Add("هيچكدام")
End If
End Sub

Protected Sub cmdGo_Click(ByVal sender As Object, ByVal e As EventArgs) Handles cmdGo.Click
If lstItems.SelectedIndex = -1 Then
lblError.Text = " يكی از آيتم های موجود در ليست را انتخاب نمائيد"
Else
Dim Url As String = "QueryStringRecipient.aspx?"
Url &= "Item=" & lstItems.SelectedItem.Text & "&"
Url &= "Mode=" & chkDetails.Checked.ToString()
Response.Redirect(Url)
End If
End Sub
</script>

<html xmlns="http://www.w3.org/1999/xhtml" dir="rtl">
<head runat="server">
<title>تست query string | صفحه ارسال كننده</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<span style="font-size: 9pt; font-family: Tahoma">
<strong>
<span style="color: #006699">
علاقه مند به مشاهده كدام بخش از سايت سخا روش می باشيد ؟
</span><br />
</strong>
</span><br />
<asp:ListBox ID="lstItems" runat="server" Height="90px" Width="165px"
Font-Names="Tahoma"></asp:ListBox><br />
<br />
<asp:CheckBox ID="chkDetails" runat="server" Text="جزئيات نمايش داده شود ؟"
TextAlign="Right" Font-Names="Tahoma" /><br /> <br />
<asp:Button ID="cmdGo" runat="server" Text="مشاهده اطلاعات"
Width="122px" Font-Names="Tahoma" /><br /><br />
<asp:Label ID="lblError" runat="server" EnableViewState="False"
Font-Names="Tahoma" ForeColor="Red"></asp:Label>
</div>
</form>
</body>
</html>

كد زير محتويات صفحه مقصد ( QueryStringRecipient.aspx ) را نشان می دهد .

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

<script runat="server">
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
lblInfo.Text = "آيتم انتخاب شده توسط كاربر : " & "<b>" & Request.QueryString("Item") & "</b>"
lblInfo.Text &= "<br>نمايش تمامی اطلاعات : " & "<b>"
lblInfo.Text &= Request.QueryString("Mode") & "</b>"
End Sub
</script>

<html xmlns="http://www.w3.org/1999/xhtml" dir="rtl">
<head runat="server">
<title>تست query string | صفحه دريافت كننده</title>
</head>
<body style="font-family: Tahoma;">
<form id="form1" runat="server">
<div >
<asp:Label ID="lblInfo" runat="server" EnableViewState="False" Font-Names="Tahoma" >
</asp:Label>
</div>
</form>
</body>
</html>

شكل 1 ، نحوه عملكرد Query string را در ارتباط با صفحه مبداء (QueryStringSender.aspx) و مقصد (QueryStringRecipient.aspx ) نشان می دهد .


http://www.srco.ir/Articles/images/StateManagement5.jpg

URL Encoding
يكی از مسائل در ارتباط با روش query string ، استفاده از كاراكترهای غيرمجاز در يك URL است . ليست كاراكترهای مجاز در يك URL بمراتب كمتر از ليست كاراكترهای مجاز در يك سند HTML است . تمامی كاراكترها می بايست الفبا عددی و يا يكی از مجموعه كاراكترهای خاص نظير $-_.+!*'() باشد . علاوه بر كاراكترهای فوق ، برخی مرورگرها ممكن است دارای محدوديت های مختص به خود نيز باشند .
در صورتی كه لازم است مجاز بودن كاراكترهای ذخيره شده در query string بررسی گردد ، می توان از URL encoding استفاده كرد . با استفاده از ويژگی فوق ، كاراكترهای خاص با دنباله ای از escaped character جايگزين می گردند كه با علامت درصد (%) شروع و به دنبال آن يك عدد دو رقمی مبنای شانزده آورده می شود ( مثلا" space به 20 % تبديل می گردد ) .
از متدهای كلاس HttpServerUtility می توان برای encode اتوماتيك داده استفاده كرد .
كد زير نحوه encoding يك رشته حاوی داده جهت استفاده در query string را نشان می دهد . بدين ترتيب ، تمامی كاراكترهای غيرمجاز با دنباله ای از escaped character جايگزين می گردند .
Dim productName As String = "Test Product"
Response.Redirect("newpage.aspx?productName=" & Server.UrlEncode(productName))

از كد زير برای decoding در صفحه مقصد استفاده می گردد .
Dim ID As String = Server.UrlDecode(Request.QueryString("recordID"))

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

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

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

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

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

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