دانستن چرخه حیات یک صفحه در asp.net برای بسیاری از توسعه دهندگان امری است ضروری.چرا که این بسیار مهم است که کدهای مورد نظر ما در کدام مرحله از این چرخه انجام شوند و همچنین این که اصولا عملکرد صفحه در شرایط مختلف به چه شکل است. در این مقاله صرفا قصد داریم تا این چرخه را به صورت ساده و گویا برای شما بیان کنیم
شاید ساده ترین شکل بیان ترتیب رخدادهای ممکن چنین باشد:
1. Page Request
2. Start
3. Page Initialization
4. Load
5. Validation
6. Postback event handling
7. Rendering
8. Unload
ابتدا بیاییم برای هرکدام از این بخشها یک مخفف معرفی کنیم. البته این نکته را هم در نظر داشته باشید که از آنجایی که Page Request اساسا بخشی از چرخه حیات صفحه نیست و تنها مشخص کننده این است که چرخه شروع به کار کرده است، آن را به حساب نخواهیم آورد
S – Start
I – Initialize
L – Load
V – Validate
E – Event Handling
R – Render
مجموع این مخفف ها عبارت SILVER را تشکیل میدهد که به خاطر سپاری آن نیز ساده است. اکنون بیایید تا هر مرحله را مفصل تر بررسی کنیم
Start
این مرحله ای است که ویژگیهایی اصلی صفحه نظیر Request,Response,IsPostBack و ... مقداردهی میشوند.بعنوان یک برنامه نویس شما نیازی ندارید که در این مرحله کاری انجام دهید. اما در صورتی که نیاز داشتید تا رفتار صفحه را در این مرحله کنترل کنید یا عمل خاصی را انجام دهید میتوانید از متد PreInit استفاده کنید. این راه میتواند برای ایجاد کنترلها به شیوه پویا در زمان اجرا استفاده کنید یا این که master page یا تم صفحه مورد نظر خود را تغییر دهید.
این نکته مهم است که چنانچه درخواست (request) به صورت postback باشد، مقادیر کنترلها در این لحظه هنوز از view state بازیابی نشده اند و چنانچه در این مرحله یک ویژگی از یک کنترل را تنطیم کنید، ممکن است این ویژگی بعدا بازنویسی شود.
Initialize
این مرحله برای برنامه نویسان اهمیت بسیار زیادی دارد. در اینجاست که تم ها و master page ... تنظیم شده و id های یکتای کنترلها نیز تولید شده اند.
در این مرحله میتوانید به متدهای Init,InitComplete,PreLoad دسترسی داشته باشید. مایکروسافت استفاده از این متدها را به این شکل توصیه میکند:
Init :
این رخداد پس از آنکه همه کنترلها مقداردهی اولیه شدند و تنظیمات تم و master page و ... انجام شد رخ میدهد. از این متد میتوانید برای خواندن یا مقدارهای ویژگی های کنترلها استفاده کنید.
InitComplete :
این رخداد توسط شیء Page فراخوانی میشود. از این رخداد برای پردازش اعمالی استفاده میشود که نیاز دارند کنترلها مقدارهای اولیه شده باشند
PreLoad :
از این رخداد برای انجام پردازش های مورد نظر قبل از رخ دادن رخداد Load استفاده میشود. پس از اینکه این رخداد اتفاق افتاد، view state برای صفحه و کنترلها بارگذاری میشود و سپس کلیه داده های postback شده که در request مربوطه ضمیمه شده اند پردازش میشوند.
Load :
این مرحله برای برنامه نویسان شناخته شده تر و پر استفاده تر است. در این جاست که کنترلها بارگذاری شده اند و کلیه امور مربوط به مقداردهی اولیه و view state انجام گردیده است.
در اینجا شما میتوانید ویژگیهای کنترلها را تغییر داده و query string ها را بخوانید، با پایگاه داده ها ارتباط برقرار کنید و ...
Validation :
اگر شما کنترلی داشته باشید که نیاز به اعتبارسنجی داشته باشد، آن کنترلها در این مرحله ارزیابی میشوند و شما اینجا میتوانید از ویژگی IsValid کنترل استفاده کنید. رخدادی که به این مرحله اختصاص یافته است Validate نام دارد.
Event Handling :
رسیدگی به رخدادهای کنترلهای سمت سرور در این مرحله رخ میدهد. این بدان معنی است که رخدادهایی نظیر Click, SelectedIndexChanged و که به کنترلها انتساب یافته اند؛ در این مرحله توسط خود کنترلها رخ میدهند. در این خصوص به این نکات توجه کنید:
LoadComplete :
در این مرحله، همه کنترلهای صفحه بارگذاری شده اند
PreRender :
چند اتفاق مهم اینجا می افتد. اول اینکه شیء Page برای هرکنترلی EnsureChildControls را فراخوانی میکند. علاوه بر این، هر کنترل مقید شده به منبع داده که DataSourceID داشته باشد متد DataBind آن فراخوانی میشود. به این نکته دقت کنید که رخداد PreRender به ازای کنترل روی صفحه رخ میدهد. در نهایت نیز ViewState برای صفحه و همه کنترلهای آن ذخیره میشود.
SaveStateComplete :
این به منای خاتمه یافتن ذخیره شدن ViewState است. اگر شما میخواهید کاری را انجام دهید که نیازی به تغییرات در کنترلها ندارد اما نیاز دارد که ViewState ذخیره شده باشد، میتوانید از این رخداد استفاده کنید.
Render
: render
در واقع یک رخداد نیست بلکه شیء Page این متد را برای هر کنترل فراخوانی میکند تا علائم HTML را برای کنترل مربوطه به خروجی که همان مرورگر است بفرستد. این متد برای آن دسته از برنامه نویسانی مهم است که میخواهند کنترلهای خاص خود را ایجاد کنند چرا که میتوانند این متد را بازنویسی کنند. چنانچه کنترل شما از یک کنترل سمت سرور ASP.Net مشتق میشود نیازی به بازنویسی این متد ندارید مگر این که بخواهید در رفتار آن تغییری ایجاد کنید.
Unload :
این آخرین رخدادی است که ابتدا برای هر کنترل و سپس برای خود صفحه فراخوانی میشود. نکته این که در این مرحله کلیه کنترلها به خروجی فرستاده شده اند و نمیتوان در آنها تغییری اعمال کرد. در طول این رخداد هر گونه تلاش برای استفاده از Response منجر به رخ دادن خطا میشود. معمولا از این رخداد برای انجام خاتمه دهی و تمیز کردن عملیات استفاده میشود مثلا بستن ارتباطهای باز به پایگاه داده ها و ... است.
متدها
متدهای زیر که میتوانند بازنویسی شوند نیز به ترتیب در طی چرخه حیات صفحه رخ میدهند. البته توجه داشته باشید که برخی از این متدها به طور بازگشتی فراخوانی میشوند و با توجه به نوع صفحه ممکن است چند بار فراخوانی شوند. شما میتوانید این متدها را بازنویسی کرده و با قرار دادن یک break point در هر مرحله ترتیب رخ دادن آنها را امتحان کنید.
Construct
ProcessRequest
FrameworkInitialize
InitializeCulture
If child controls are present:
AddParsedSubObject
CreateControlCollection
AddedControl
ResolveAdapter
DeterminePostBackMode
OnPreInit
OnInit
TrackViewState
OnInitComplete
OnPreLoad
OnLoad
OnLoadComplete
EnsureChildControls
CreateChildControls
OnPreRender
OnPreRenderComplete
SaveViewState
OnSaveStateComplete
CreateHtmlTextWriter
RenderControl
Render
RenderChildren
VerifyRenderingInServerForm
OnUnload
Dispose
نتیجه گیری
زمانی که یک برنامه asp.net مینویسید بسیار مهم است که بدانید چه کاری را در کجا انجام دهید. داشتن درک صحیح از ترتیب اتفاق افتادن رخدادهای صفحه شما را از ساعتها کلافه شدن و خطایابی نجات میدهد. علاوه بر آن میتوانید از بروز خطاهای ناخواسته و همچنین خطاهای کشف نشده جلوگیری کنید
منبع : codeproject.com