PDA

View Full Version : انتقال مقادیر بین صفحات وب در ASP.NET 2.0



Behrouz_Rad
یک شنبه 21 آبان 1385, 12:21 عصر
توجه:
کلیه ی حقوق این مقاله متعلق به سایت www.barnamenevis.org می باشد.
استفاده از مطالب این مقاله منوط به ذکر نام منبع است.

قبلا در مقاله ای در مورد نحوه ی انتقال مقادیر صفحات به یکدیگر در ASP.NET 1.x پرداختم. این کار با استفاده از دایرکتیو Reference میسر می بود و یک Type Casting ساده در صفحه ی مقصد انجام میشد.
در این مقاله به نحوه ی انجام این کار با استفاده از امکان جدیدی که در ASP.NET 2.0 قرار داده شده است می پردازم.

انتقال مقادیر بین صفحات، به برنامه نویس توانایی ارسال مقادیر کنترل های مختلف در یک صفحه به صفحات دیگر را می دهد. علاوه بر مقدار کنترل ها، خواص Public فرم ها نیز در صفحات مقصد می توانند بازیابی شوند.
این قابلیت با عنوان "Cross Page Posting" در ASP.NET 2.0 قرار داده شده است.
مسلما این کار در Wizard ها و فرم های Master-Details کاربرد بیشتری دارد.
مقادیر ارسال شده به صفحه ی مقصد، در حافظه ی سرور نگهداری می شوند.
کنترل هایی که اینترفیس IButtonControl را ایمپلمنت می کنند می توانند قابلیت Cross Page Posting را پیاده سازی کنند. یعنی فقط کنترل های Button، ImageButton، LinkButton
فرآیند کار بسیار آسان است و تنها با تنظیم چند خاصیت و چند خط کدنویسی ساده می توان به نتیجه رسید!
ابتدا باید خاصیت PostBackURL کنترلی که قصد دارید با کلیک بر روی آن به صفحه ی مقصد بروید و مقادیر صفحه ی مبدا را در آن بازیابی کنید، برابر با نام "صفحه ی مقصد" تنظیم کنید.

نکته:
خاصیت PostBackURL در اینترفیس IButtonControl تعریف شده است؛ به همین دلیل است که تنها کنترل هایی که از این اینترفیس استفاده می کنند می توانند Cross Page Posting را پیاده سازی کنند.

کلاس Page خاصیتی با نام PreviousPage دارد. در صورتی که از صفحه ی مبدا که با کلیک بر روی کنترلی از آن که خاصیت PostBackURL را برابر با نام صفحه ی مقصد تنظیم کرده به صفحه ی مقصد بروید، مقدار خاصیت PreviousPage صفحه ی مقصد برابر با نام صفحه ی مبدا است. در حقیقت، مقدار برگشتی خاصیت PreviousPage، یک ارجا به صفحه ی مبدا است و کلاسی از نوع Page را برگشت می دهد.
بدیهی است که با داشتن ارجا به یک کنترل، می توان به مقادیر آن کنترل و کنترل های موجود در آن دست پیدا کرد.
متد آشنای FindControl، کار را بسیار آسان خواهد کرد!
به عنوان مثال، در صفحه ی مبدا، کنترل TextBox ای با نام "txtSource" وجود دارد که قصد داریم مقدار آن را در صفحه ی مقصد بازیابی کنیم:


TextBox obj_txtSource = (TextBox) PreviousPage.FindControl("txtSource");

نکته:
متد FindControl به شدت به سلسله مراتب پدر – فرزندی پایبند است! به عنوان مثال اگر قصد داشته باشید که کنترلی را که درون یک GridView در صفحه ی مبدا وجود دارد بازیابی کنید، ابتدا باید به صفحه، سپس از طریق صفحه به GridView و در نهایت از طریق GridView به کنترل درون آن دسترسی پیدا کنید. در این حالت به دو بار استفاده از متد FindControl نیاز خواهید داشت!

روش دیگری که وجود داره و معمولا برای دسترسی به خواص Public فرم مبدا استفاده میشه، استفاده از دایرکتیو "PreviousPageType" در صفحه ی مقصد است. مقدار خاصیت "VirtualPath" این دایرکتیو باید برابر با نام صفحه ی مبدا تنظیم شود.
در این حالت، خاصیت PreviousPage دارای ارجا به صفحه ی مبدا است. برای به دست آوردن خواص Public ای از صفحه ی مبدا، کافیست که نام آن را بعد از PreviousPage ذکر کنید:


String myValue;
myValue = PreviousPage.myPublicProperty;

نکته:
تغییر مقادیر صفحه ی مبدا از صفحه ی مقصد، تاثیری در مقادیر صفحه ی مبدا نخواهند داشت.

کلاس PreviousPage خاصیتی با نام "IsCrossPagePostback" دارد که مشخص می کند آیا صفحه ی جاری در اثر یک Cross Page Posting ظاهر شده است یا خیر.


if(PreviousPage != null)
{
if(PreviousPage.IsCrossPagePostBack == true)
{
Response.Write("Cross Page Posting!");
}
}
else
{
Response.Write("Not A Cross Page Posting!");
}

نکته:
در Cross Page Posting و نیز در صورت استفاده از متد Transfer کلاس Server، خاصیت PreviousPage دارای یک ارجا به صفحه ی مبدا خواهد بود. برای تشخیص اینکه صفحه ی جاری از کدام یک از روش های ذکر شده، ظاهر شده است، از خاصیت IsCrossPagePosback که بدان اشاره شد استفاده کنید.
در زمان Cross Page Posting، خاصیت IsCrossPagePostback برابر با true و در هنگام استفاده از متد Transfer کلاس Server، این مقدار برابر با false است.

موفق باشید.