چرا فرم من ارسال نمی شود؟
می 12, 2008
توجه: این یادداشت قدیمی و مربوط به وبلاگهای پیشین است. برای اطلاعات بیشتر آنچه گذشت را بخوانید.
چند روز پیش بعد از انجام کامل یک پروژه و کامپایل نهایی و آپلود کردن فایل های تست به یک مشکل عجیب و غریب برخوردم. من برای سیستم خودم یک صفحه Login داشتم. دو تکست باکس برای وارد کردن نام کاربری و کلمه عبور و یک دکمه که عملیات ورود به سیستم را در رویداد click آن نوشته بودم. روی کامپیوتر خودم همه چیز درست بود ولی وقتی فایل ها رو آپلود کردم و خواستم لاگین کنم هیچ اتفاقی نمی افتاد در واقع فرم من اصلا ارسال نمی شد !
این برای من موضوع عجیبی بود با توجه به اینکه این مشکل فقط در IE وجود داشت و در فایرفاکس مشکلی نبود ( اینم تبلیغ برای فایرفاکس
). خلاصه شروع کردم به پرسیدن از این و آن برای رفع مشکل. برای چند نفری آفلاین گذاشتم. به چند گروه یاهو که در آن ها عضو بودم سر زدم و مشکل را پست کردم. همین طور برای گروه برنامه نویسی asp.net در گروه های گوگل. دست آخر هم پستی داشتم به انجمن های asp.net. دوست عزیزی هم لطف کرد و یک ارسال به انجمن های پرشین تولز برایم انجام داد. با چند نفری هم آنلاین در این مورد صحبت کردم. از جمله داریوش تصدیقی که اتفاقا آن موقع شب آنلاین بود.
از آن جا که من در صفحاتم از Required field validator استفاده کرده بودم به نظر می رسید که مشکل از همین کتابخانه اعتبارسنجی جاوایی باشد ( منظورم WebUIValidation.js ) است. با راهنمایی آقای تصدیقی سری زدم به فولدر aspnet_client تا نسخه این فایل رو بررسی کنم. روی سرور مورد بحث 3 نسخه از این فایل وجود داشت. علاوه بر نسخه 1_1_4322 ( که نسخه مورد نیاز بود ) دو ورژن دیگر هم وجود داشت که قدیمی تر بودند. بعد از پشتیبان گرفتن از این فایل ها آن ها را به جز نسخه اصلی از روی سرور پاک کردم. صفحه رو دوباره امتحان کردم. فرقی نکرده بود.
در فاصله یک ساعتی که مشغول این کارها و جستجو در وب بودم یکی دو جواب برای پست هایم آمده بود. خانم زاهدی از گروه برنامه نویسان asp.net در یاهو پیشنهاد کرده بودند که به جای Push button از Link button استفاده کنم. اما مهم ترین راه حل که این آقا در انجمن های asp.net منو به طرفش راهنمایی کرد اینجا بود. یادداشتی از Scott Mitchell در همین مورد.
راه حل :
به گفته scott وقتی سورس صفحه رو برای دیباگ کردن نگاه می کنیم به کد مشکل ساز زیر می رسیم :
حالا اگر ایونت هندلر ValidatorOnSubmit مقدار false برگرداند می توانید حدس بزنید که چه اتفاقی می افتد. اجازه بدهید به سورس ValidatorOnSubmit در فایل WebUIValidation.js نگاهی بیندازیم:
function ValidatorOnSubmit() {
if (Page_ValidationActive) {
return ValidatorCommonOnSubmit();
}
return true;
}
همان طور که می بینید مشکل از جای دیگری ( در واقع تابع ValidatorCommonOnSubmit ) پیش می آید که مقدار بازگشتی تابع ValidatorOnSubmit را مشخص می کند. این تابع به صورت زیر پیاده سازی شده :
function ValidatorCommonOnSubmit() {
event.returnValue = !Page_BlockSubmit;
Page_BlockSubmit = false;
}
مشکل کوچکی هست و آن اینکه آیا این تابع نباید یک مقدار return کند ؟ بعد از گوگل کردن validatoronsubmit returning false به یادداشتی در وبلاگ Thomas Freudenberg می رسیم که مشکلی مشابه را بررسی می کند. این مشکل به یک hotfix مربوط به فریم ورک 1.1 برمی گردد.
اگر تابع ValidatorCommonOnSubmit مانند بالاست ValidatorCommonOnSubmit باید مقدار !Page_BlockSubmit را برگرداند ( همان طور که در تابع می بینید مقدار Page_BlockSubmit قبلا false شده است ).
اگر این hotfix را نصب کرده اید باید تابع ValidatorCommonOnSubmit را به صورت زیر به روز رسانی کنید:
function ValidatorCommonOnSubmit()
{
event.returnValue = !Page_BlockSubmit;
ret_Val = !Page_BlockSubmit;
Page_BlockSubmit = false;
return ret_Val;
}






