۱۳۸۸/۰۹/۱۴

چه زمان‌هايي ممكن است Page_Load يك صفحه ASP.Net دوبار اجرا شود؟


سؤال مربوط به حالت نخ نماي Page.IsPostBack نيست. مربوط به حالتي است كه دقيقا در اولين بار مشاهده‌ي عادي يك صفحه، Page_Load دوبار يا بيشتر (!) اجرا مي‌شود.

الف) برنامه‌ي ASP.Net 1.x خود را به نگارش‌هاي 2+ ارتقاء داده‌ايد.
در اين حالت هر چند VS.Net پيغام تبديل با موفقيت يك پروژه‌ي قديمي را به شما ارائه خواهد داد اما يك سري موارد را پس از تبديل، بايد اصلاح كرد.
پروژه‌هاي قديمي ASP.Net در روال InitializeComponent خود سطر زير را همانند يك پروژه WinForm و امثال آن براي معرفي روال رخداد گردان Page_Load دارند.

this.Load += new System.EventHandler(this.Page_Load);

اما در پروژه‌هاي ASP.Net 2.0 به بعد ديگر از اين روال خبري نيست. پس در اين پروژه‌ها كامپايلر چگونه متوجه خواهد شد كه Page_Load واقعا يك روال رخ داد گردان است و نه يك روال معمولي؟ در پروژه‌هاي جديد VS.Net ، خاصيت AutoEventWireup صفحه به true تنظيم شده و ديگر نيازي به معرفي صريح روال‌هاي رخ داد گرداني مانند Page_Load و يا Page_Init نبوده و تشخيص آن‌ها به صورت خودكار انجام مي‌شود.

<% @Page AutoEventWireup="true" %>
بر اين اساس با انتقال يك پروژه قديمي به VS.Net جديد، هم AutoEventWireup=true را خواهيم داشت و هم سطرهاي موجود در متد قديمي InitializeComponent از پروژه حذف نشده‌اند. بنابراين متد Page_Load در دو نقطه، يكبار به صورت خودكار (متد Page_Load بر اساس نام آن با توجه به AutoEventWireup=true تشخيص داده شده و اجرا مي‌شود) و يكبار هم بر اساس تعريف دستي موجود فراخواني مي‌شود.
براي حل اين مشكل و سازگاري بهتر با نگارش‌هاي جديدتر، سطر تعريف دستي روال رخ داد گردان متد Page_Load را حذف كنيد.
لازم به ذكر است كه اين سيم كشي خودكار تنها براي متدهاي زير انجام خواهد شد و نسبت به حذف ساير موارد موجود اقدام نكنيد!

Page_PreInit
Page_Init
Page_InitComplete
Page_PreLoad
Page_Load
Page_LoadComplete
Page_DataBind
Page_SaveStateComplete
Page_PreRender
Page_PreRenderComplete
Page_Unload
Page_Error
Page_AbortTransaction
Page_CommitTransaction


ب) وجود هر نوع دكمه‌ي تصويري يا كلا تصويري با ويژگي src مقدار دهي نشده در صفحه
مرورگر IE با اين مساله مشكلي ندارد. اما فايرفاكس‌هاي جديد اگر به src مقدار دهي نشده‌ي تصويري برخورد كنند دقيقا آدرس جاري صفحه را بجاي مقدار src قرار داده و مجددا صفحه را درخواست مي‌كنند (و البته اين مورد ارتباط مستقيمي به ASP.Net يا PHP و امثال آن ندارد و يك مساله‌ي عمومي است). اين مورد سبب خواهد شد كه Page_Load صفحه، نه فقط دوبار بلكه به تعداد بار src خالي تصاويري كه در صفحه وجود دارند، بر اساس درخواست‌هاي مجدد فايرفاكس از سرور اجرا شود. (مرورگر IE بجاي فراخواني آدرس صفحه جاري، يك null/ را به انتهاي آدرس جاري اضافه كرده و آن‌را فراخواني مي‌كند. بنابراين سبب اجراي مجدد هيچ روالي نخواهد شد.)


مآخذ:
Inside AutoEventWireup
How Firefox Handles Empty SRC tags