شاید شما هم این تصور غلط را داشته باشید که متد Server.Transfer نمیتواند برای ارسال وضعیت فرم به فرمی دیگر به کار رود! اما با اعمال مقداری تغییرات میتوان این کار را به آسانی انجام داد.
در ASP کلاسیک برای ارسال یک فرم به فرمی دیگر باید صفت action فرم را مقداردهی نماییم٬ ولی در ASP.NET این کار به همان صورت میسر نمی باشد. مدل فرمهای وب ASP.NET مستلزم آن است که هر فرم به خودش ارسال شود. اگر شما می خواهید که یک کنترل را از یک فرم به فرمی دیگر انتقال دهید٬ باید از متد Server.Transfer استفاده نمایید. همچنین در رابطه با نحوه ارسال مقادیر بین فرمها میتوانید به مقاله قبلی من با عنوان انواع روشهای انتقال مقادیر بین فرمهای وب در ASP.NET مراجعه کنید. بسیاری از برنامه نویسان ASP.NET این تصور غلط را دارند که متد Server.Transfer نمیتواند برای ارسال وضعیت فرم به فرمی دیگر به کار رود٬ اما با اعمال مقداری تغییرات میتوانید این کار را به آسانی انجام دهید.


متد Server.Transfer
متد Server.Transfer برای ارسال کنترل از یک فرم به فرمی دیگر استفاده می شود. بر خلاف Response.Redirect – که در واقع از مرورگر می خواهد که یک درخواست دیگری را بوجود آورد - Server.Transfer باعث انتقال کنترل در طرف سرور می شود. متد Server.Transfer دو پارامتر را دریافت می کند: یک فرم وب که کنترل یا کنترل ها قرار است به آنجا ارسال شوند٬ دیگری یک مقدار Boolean که نشان دهنده آن است که وضعیت فرم فعلی در فرم جدید حفظ خواهد شد یا نه. اجازه دهید برنامه ای بسازیم که مشکلی را هنگام استفاده از این متد نشان می دهد٬ سپس نحوه حل این مشکل را بررسی خواهیم کرد.


مشکل هنگام استفاده از Server.Transfer
یک برنامه ASP.NET بسازید و دو فرم را به آن اضافه کنید. اجازه دهید نام فرمها را Page1.aspx و Page2.aspx بگذاریم. در فرم Page1.aspx یک کنترل جعبه متن با TextBox1 ،ID و یک کنترل Button قرار دهید. در رویداد کلیک دکمه کد زیر را بنویسید:


Server.Transfer(''Page2.aspx'', True)

سپس برنامه را با درخواست Page1.aspx اجرا کنید. مقداری را در کنترل جعبه متن وارد کرده و بر روی دکمه کلیک نمایید. در این حالت یک پیغام خطا با توضیح ''The View State is invalid for this page and might be corrupted'' را دریافت خواهید کرد. این خطا به علت یکی از صفات دایرکتیو Page@ فرم دوم (یعنی Page2.aspx) به نام EnableViewStateMac اتفاق می افتد. به صورت پیش فرض این صفت مقدار True را دارد و این امر باعث ایجاد خطا می شود.


EnableViewStateMac چیست؟
در زیر توضیحی را در مورد EnableViewStateMac از مستندات MSDN مشاهده می کنید:


Indicates that ASP.NET should run a machine authentication check (MAC) on the page's view state when the page is posted back from the client. true if view state should be MAC checked; otherwise, false. The default is false. Note: A view state MAC is an encrypted version the hidden variable that a page's view state is persisted to when sent to the browser. When you set this attribute to true, the encrypted view state is checked to verify that it has not been tampered with on the client.

زمانی که شما درخواست را برای صفحه می فرستید٬ مقدار EnableViewStateMac برای دایرکتیو Page صفحه True می باشد.

راه حل
به منظور غلبه بر مشکل حفظ وضعیت که در بالا مطرح شد٬ باید به طور صریح مقدار صفت EnableViewStateMac در دایرکتیو Page صفحه دوم (Page2.aspx) را برابر False قرار دهید:


<%@ Page Language=''vb'' EnableViewStateMac=''False''%>

اکنون شما میتوانید به مقادیری که در TextBox1 در فرم Page1.aspx وارد شده است٬ دسترسی داشته باشید (در اینجا TextBox1 همان ID کنترل جعبه متن موجود در فرم Page1.aspx می باشد):


Response.Write(Request.Form(''TextBox1''))


پرکردن محتوای کنترلهای فرم Page2.aspx با داده‌های دریافت شده از فرم Page1.aspx
فکر می کنید چطور میتوان محتوای کنترلهای واقع بر فرم Page2.aspx را با داده‌های رسیده توسط متد Server.Transfer پرکرد؟ میتوان این کار را به سادگی با یکی کردن ID کنترلهای فرم Page2.aspx با ID کنترلهای فرم Page1.aspx انجام داد. در برنامه نمونه که همراه مقاله میتوانید آنرا دریافت نمایید، مشاهده می‌کنید که IDهای دو کنترل جعبه متن واقع بر فرم Page1.aspx همان IDهای دو کنترل جعبه متن دیگر واقع در فرم Page2.aspx می باشند. اگر این IDها را در هر یک از فرمها تغییر دهیم دیگر نمیتوان مقادیر کنترلهای فرم Page1.aspx را در فرم دوم در کنترل‌ها جای داد.


خلاصه
ما در این مقاله نحوه ارسال کنترلها را از یک فرم وب به فرم وب دیگر همراه با حفظ داده‌های فرم بررسی کردیم. با مقداردهی مناسب صفت EnableViewStateMac برای دایرکتیو Page فرم دریافت کننده داده‌ها٬ توانستیم امکان چنین انتقالی بین دو فرم را فراهم بیاوریم. میتوانید از برنامه نمونه همراه مقاله برای دیدن نحوه انجام این کار استفاده نمایید.