نحوه انتقال اطلاعات بین صفحات Query String ASP .NET
در این بخش با نحوه انتقال اطلاعات بین صفحات با استفاده از روش Query String آشنا خواهیم شد .
Query String
یکی دیگر از روش های ارسال اطلاعات بین صفحات ، استفاده از یک query string در URL است . از رویکرد فوق در موتورهای جستجو استفاده می گردد . مثلا” در صورت استفاده از موتور جستجوی گوگل ، پس از درج کلید واژه مورد نظر به یک URL جدید که با پارامترهای جستجو ترکیب می گردد ، هدایت می شویم.
http://www.google.com/search?q=web 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 و مقدار ۱۰ نیز برای صفحه فوق ارسال می گردد .
Response.Redirect(“newpage.aspx?recordID=10″)
در صورت نیاز می توان چندین پارامتر را که توسط علامت & ( ampersand ) از یکدیگر جدا می شوند ، به صفحه مقصد ارسال کرد .
کد زیر کاربر را به صفحه newspage.aspx هدایت می نماید . همراه با کاربر متغیرهائی با نام recordID و مقدار ۱۰ و 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>
شکل ۱ ، نحوه عملکرد Query string را در ارتباط با صفحه مبداء (QueryStringSender.aspx) و مقصد (QueryStringRecipient.aspx ) نشان می دهد .
شکل ۱ : نحوه عملکرد Query string
URL Encoding
یکی از مسائل در ارتباط با روش query string ، استفاده از کاراکترهای غیرمجاز در یک URL است . لیست کاراکترهای مجاز در یک URL بمراتب کمتر از لیست کاراکترهای مجاز در یک سند HTML است . تمامی کاراکترها می بایست الفبا عددی و یا یکی از مجموعه کاراکترهای خاص نظیر $-_.+!*’() باشد . علاوه بر کاراکترهای فوق ، برخی مرورگرها ممکن است دارای محدودیت های مختص به خود نیز باشند .
در صورتی که لازم است مجاز بودن کاراکترهای ذخیره شده در query string بررسی گردد ، می توان از URL encoding استفاده کرد . با استفاده از ویژگی فوق ، کاراکترهای خاص با دنباله ای از escaped character جایگزین می گردند که با علامت درصد (%) شروع و به دنبال آن یک عدد دو رقمی مبنای شانزده آورده می شود ( مثلا” space به ۲۰ % تبدیل می گردد ) .
از متدهای کلاس 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”))
متاسفانه ، ASP.NET دارای مکانیزم خاصی جهت بررسی و رمزنگاری اتوماتیک query string نمی باشد . با استفاده از کلاس های متعدد رمزنگاری ارائه شده در دات نت ، می توان رشته های query string را رمز و یک سطح مطلوب امنیتی در ارتباط با آنها را ایجاد کرد