ساده ترین و پر کابردترین و شاید بهترین راه انتقال اطلاعات بین صفحات رشته های تقاضا یا QueryString ها میباشند .
QueryString ها در حقیقت رشته ای از حروف هستند که به دنبال آدرس صفحه مورد نظر و بعد از کاراکتر ؟ ظاهر میگردند و در بردارنده یک متغیر به همراه یک مقدار اختصاص یافته میباشند .
برای روشن شدن این موضوع مثال زیر رو در نظر بگیرید:
شما وارد سایت How2learnAsp.Net شدید در صفحه اول اگربه آدرس بار نگاهی بندازید چنین نوشته ای رو خواهید http://www.how2learnasp.net/default.aspx
این نوشته نشان میدهد که صفحه که شما داخل آن قرار دارید صفحه default هست و پسوند این صفحه aspx است خوب حالا مقاله مورد نظرتون رو انتخال میکنید و روی آن کلیک می نمایید . حالا وارد صفحه نمایش مقاله شده اید بهتر است الان هم یک نگاهی به آدرس بار بندازید چه میبینید؟
کدی مشابه : http://delshad.ir/article.aspx?code=54b5a658-11fe-4349-b135-4284806b09ff
اکنون میتوانید درک کنید که QueryString چیست در حقیقت تمام رشته حروفی که بعد از علامت سوال نوشته شده جزو QueryString محسوب می شود ، این رشته به صفحه میگوید که متغیری به نام code مقدارش 54b5a658-11fe-4349-b135-4284806b09ff می باشد .
این کد باعث میشود ما بفهمیم که کاربر کدام مقاله را درخواست داده ، بنابراین به سادگی با یک دستور SQL مقاله مورد نظر کاربر را به او نمایش می دهیم .
خوب فرض کنید که یک صفحه دارید و یک تکس باکس به همراه یک باتن. میخوایم مقداری رو داخل تکس باکس بنویسیم و سپس وقتی باتن کلیک شد وارد صفحه جدیدی بشویم که فقط یک Label در آن وجود دارد و بطور خود کار مقداری که ما داخل TextBox صفحه اول نوشته بودیم داخل آن Label چاپ شود :
فرض کنید نام صفحه اول first.aspx نام صفحه دوم second.aspx آیدی TextBox داخل صفحه اول mytext و آیدی Label داخل صفحه دوم mylabel باشد ...
بر روی باتن صفحه اول دو بار کلیک کنید و در ساب روتین مربوط به رویداد کلیک شدن باتن کد زیر رو بنویسید :
Response.Redirect("second.aspx?myvalue=" & mytext.text)
اگر با متد Response.Redirect آشنا باشید میدانید که این متد صفحه را به صفحه ای که داخل کوتیشن نوشته شده انتقال میدهد
خوب بعد از نوشتن آدرس صفحه دوم یک علامت سوال گذاشتم و بعد از آن اسم متغیرم را نوشتم ( این متغیر میتواند هر اسم دلخواهی را اختیار کند ) و بعد این متغیر را مساوی مقداری که داخل TextBox نوشته شده قرار دادم( از عملگر & برای چسباندن دو رشته حرف به هم استفاده می شود )
اکنون وارد صفحه دوم شوید و بر روی صفحه دابل کلیک کنید تا ساب روتین رویداد مربوط به لود شدن صفحه باز شود و داخل آن کد زیر رو بنویسید :
mylabel.text = Request.QueryString("myvalue")
اگر با متد Request آشنا باشید میدانید که این متد برای درخواست های مختلف بکارمی رود و متد Request.QueryString برای دریافت مقادیر موجود در متغیر تعریف شده در QueryString می باشد.
باید به یک نکته دقت کنید که اصلا مهم نیست که نام متغیر شما چچیست ( مثلا در اینجا myvalue) مهم این است که متغیر ارسالی و درخواستی شما یکی باشند ، یعنی اگر نوشتید secon.aspx?yourname=ali در صحفه که میخواهید مقدار متغیر را دریافت کنید باید بنویسید :
Request.QueryString("yourname")
واضح است که مقدار برگشتی کد فوق ali می باشد.
فرض کنید بخواهید چند متغیر را توسط .QueryString ارسال کنید اگه مقادیر شما مشخص باشد که کار خیلی سادست :
Response.Redirect("second.aspx?name=ali&family=delshad&age=22")
در کد فوق نام و نام خانوادگی و سن من برای فرم دوم ارسال شده است .
حال اگه مقادیر بصورت پارامتری باشند از کاراکتر & برای الصاق رشته های ثابت به متغیر های استفاده می کنیم :
Dim myname As String = "ali"
Dim myfamily As String = "delshad"
Dim myage As String = "22"
Response.Redirect("second.aspx?name=" & myname & "family=" & myfamily & "age=" & myage)
و درصفحه دوم برای دریافت مقادیر متغیر ها داریم :
namelabel.text = Request.QueryString("name")
familylabel.text = Request.QueryString("family")
agelabel.text = Request.QueryString("age")
مزایا : QueryString بر خلاف سایر روش های انتقال اطلاعات بسیار سبک بوده هیچ فضایی برای ذخیره لازم ندارند استفاده از آن بسیار سادست و بسیار سریع انتقال پیدا میکنند.
معایب : QueryString ها بسیار نا امن میباشند چون داخل Address Bar جابجا می شوند همه کاربران قادر به مشاهده آنها هستند .
همچنین برای انتقال مقادیر بزرگ و مقادیر غیر رشته ای نمیتوان از QueryString استفاده کرد.
همانطور که گفته شد یکی از عیب های QueryString نا امن بودن آن است ، برای حل این مشکل شما میتوانید مقادیر رشته ای که بین صفحات جابجا میشوند را Encode کنید و در صفحه بعد Decode نمایید :
در مثال زیر بنده اسم خود را Encode کرده و در صفحه بعد قبل از نمایش آن را Decode می نمایم :
Dim myname As String = "Ali Delshad"
Dim encode_myname As String = Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(myname))
Response.Redirect("second.aspx?myname=" & encode_name)
اگر به آدرس بار نگاه کنید میبینید که اسم من به کد زیر تبدیل شده که دیگه قابل فهم نیست :
QWxpIERlbHNoYWQ=
در حقیقت Url به صورت زیر در می آید :
second.aspx?myname=QWxpIERlbHNoYWQ
در صفحه دوم برای دریافت و Decode کردن مقادیر به صورت زیر عمل می کنیم :
Dim arrData() As Byte = Convert.FromBase64String(Request.QueryString("myname"))
Dim namelabel As String = System.Text.Encoding.ASCII.GetString(arrData)
البته برای انتقال اطلاعات به صورتی که قابل مشاهده برای بازدید کننده نباشد و همچنین جابجایی اطلاعات حجیم تر راه های دیگری نیز وجود دارد که برخی از آن ها به شرح زیر است :