در ASP.net برای ارسال داده به صفحه دیگر، دو مرحله ساده را باید انجام
دهید: اول کنترلهایی را که باعث ایجاد postback در صفحه می شوند را انتخاب
کنید و دوم خاصیت PostBackUrl آنها را به صفحه مورد نظرتان تنظیم نمایید.
به عنوان مثال به کد زیر توجه نمایید:
<form id="Form1" runat="server">
<asp:textbox runat="server" id="Data"
/>
<asp:button runat="server"
id="buttonPost" Text="Click" PostTargetUrl="target.aspx"
/>
</form>
زمانی که خاصیت PostBackUrl تنظیم میشود، در حالت اجرا asp.net کد html
وابسته به دکمه buttonPost به فانکشن جاوا اسکریپتی به نام
WebForm_DoPostBackWithOptions بسته می شود، یعنی کد html تولید شده بعد از
اجرای کد برنامه، به صورت زیر خواهد بود:
<input type="submit" name="buttonPost"
id="buttonPost" value="Click"
onclick="javascript:WebForm_DoPostBackWithOptions(
new WebForm_PostBackOptions("buttonPost",
"",
false,
"", "target.aspx", false, false))" />
به این ترتیب زمانی که این کلید توسط کاربرد فشرده شود، فرم جاری اطلاعات خود را به صفحه target.aspx پُست مینماید.
در
اینجا ممکن است این سوال مطرح شود که تکلیف ViewState چه خواهد شد؟ باید
بگوییم که به صورت اتوماتیک زمانی که خاصیت گفته شده در بالا برای یک
کنترل تنظیم می شود، یک فیلد پنهان به نام __PREVIOUSPAGE در صفحه ایجاد می
شود که تمامی اطلاعات ViewState در صفحه را در خود نگاه می دارد و به جای
فیلد اصلی مربوط به ViewState مورد استفاده قرار می گیرد.
پس از وارد
شدن به صفحه جدید می توانیم با استفاده از خاصیت دیگری با نام PrevoiusPage
به هر کنترل در صفحه ماقبل دسترسی پیدا کنیم. به عنوان مثال به کد زیر
توجه نمایید:
protected void Page_Load(object sender, EventArgs e)
{
TextBox txt = (TextBox)PreviousPage.FindControl("TextBox1");
}
همانگونه که در کد بالا مشاهده می کنید، با استفاده از متد FindControl یک
تکست باکس از صفحه قبل برگردانده می شود. شما با استفاده از این متد می
توانید به هر کنترل دیگر در صفحه دسترسی پیدا کنید، اما مشکلی که در این
روش وجود دارد این است که در صفحه اصلی شما باید از محتوا و کنترلهای صفحه
قبل آگاه باشید و حتی اگر کنترلی در یک کنترل دیگر قرار گرفته باشد، باید
اول به کنترل میزبان رفرنس ایجاد کنید و بعد کنترلهای درونی را پیدا کنید
که این روند پیچیده ای به نظر می رسد.
برای جلوگیری از ایجاد چنین مشکلاتی استفاده از دایرکتیو @PrevoiusPageType پیشنهاد می گردد.
در این روش باید در صفحه هدف دایرکتیو ذکر شده در بالا را به صورت زیر (به عنوان مثال) تعریف کنید:
<%@ PreviousPageType VirtualPath="crosspagewithtype.aspx" %>
این
دایرکتیو دارای دو ویژگی VirtualPath و TypeName است که در اولی آدرس صفحه
ماقبل به صورت بالا تعریف می شود و در دومی نوع صفحه قبل معرفی می گردد به
صورت زیر:
<%@ PreviousPageType TypeName="ASP.crosspagewithtype.aspx" %>
اضافه
کردن این دایرکتیو در صفحه هدف به تنهایی برای دسترسی مستقیم به اعضای
صفحه قبل کافی نیست؛ چرا که همانگونه که می دانید اعضای هر صفحه به صورت
پیش فرض Protected هستند و در این حالت شما نمی توانید به اعضای صفحه
دسترسی پیدا کنید. برای حل این مشکل هر دیتا یا کنترلی که می خواهید به
صورت مستقیم در دسترس صفحه بعد قرار بگیرد باید به صورت یک خاصیت عمومی
(public) در صفحه تعریف نمایید. به عنوان مثال اگر صفحه دارای تکست باکسی
به نام _textBox1 باشد باید کد زیر را در کد اصلی صفحه بنویسید:
public TextBox TextBox1
{
get { return _textBox1; }
}
با این کار کنترلها و خاصیتهای دلخواه از صفحه به سادگی در اختیار
صفحه بعد قرار خواهند گرفت. به عنوان مثال:
Response.Write(PreviousPage.TextBox1.Text);
به خاطر داشته باشید که اگر صفحه هدف به هر صورت مثلا از طریق لینک
مستقیم لود شود، طبعا خاصیت PreviousPage در آن تهی خواهد شد که باید در کد خود این
موضوع را مد نظر قرار بدهید. به عنوان مثال:
if (PreviousPage == null)
{
Response.Write("متاسفم! این روش درستی برای دستیابی به این صفحه نیست!");
Response.End();
return;
}