PDA

View Full Version : سوال: مشکل در رفرش شدن بروزر و اجرای مجدد کد ها



delamtangete
دوشنبه 18 اسفند 1393, 11:13 صبح
سلام خدمت اساتید

من فرمی رو در VB.net طراحی کردم که داخل آن دکمه ای قرار داده شده

با فشردن دکمه مقادیری به دیتابیس ثبت می شود.

پس از انجام دستورات دکمه وقتی کلید F5 یا دکمه رفرش بروزر زده می شود دستورات داخل دکمه مجددا اجرا می شود که باعث درج رکرود تکراری می شود.

راه حل چیست؟

متشکرم

Davidd
دوشنبه 18 اسفند 1393, 11:45 صبح
سلام. وقتی دکمه رفرش زده میشه مرورگر یه request مشابه قبلی به سرور میفرسته بنابراین با رفرش صفحه انگار دکمه زده میشه. یه راهش اینه که بعد از ذخیره در دیتابیس به یه صفحه جدید redirect کنی

delamtangete
دوشنبه 18 اسفند 1393, 11:57 صبح
با
redirect کردن حتی به خود صفحه یک سری کارها که انجام شده از بین میره.پس نمی تونم از اون روش استفاده کنم!

notlikeothers
سه شنبه 19 اسفند 1393, 01:26 صبح
سلام. من هم همچین مشکل داشتم کلی سرچ کردم چیزی به درد بخور پیدا. نکردم ریدایرکت. هم خوب نیس. کلا مثه اینکه باگ باشه یهم سری کد هست با view state کار میکنه. اون. بد نبود. ولی به درد من نخورد

keiv@n
سه شنبه 19 اسفند 1393, 15:14 عصر
به نظر من اول بیا کلید f5 رو کمپلت غیر فعال کن تا کاربر نتونه با f5 صفحه رو رفرش کنه ....


<script type="text/javascript">
$(document).on("keydown", disableF5);
function disableF5(e) { if ((e.which || e.keyCode) == 116) e.preventDefault(); };
</script>


بعدش بیا یه لینک بزار تو صفحه و hrefش رو هم به صفحه جاری اختصاص بده ...


البته یه روش دیگه هم هست که خیلی اوکی تره .... :


protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack) // If page loads for first time
{
// Assign the Session["update"] with unique value
Session["update"] = Server.UrlEncode(System.DateTime.Now.ToString());
//=============== Page load code =========================




//============== End of Page load code ===================
}
}


protected void btnDisplay_Click(object sender, EventArgs e)
{
// If page not Refreshed
if (Session["update"].ToString() == ViewState["update"].ToString())
{
//=============== On click event code =========================



//=============== End of On click event code ==================


// After the event/ method, again update the session


Session["update"] = Server.UrlEncode(System.DateTime.Now.ToString());
}
else // If Page Refreshed
{
// Do nothing
}
}


protected override void OnPreRender(EventArgs e)
{
ViewState["update"] = Session["update"];

}


اومده یه سشن به اسم update ساخته که اول برنامه میاد مقداردهی میشه به ساعت الان
مرحله اول : کاربر بدون پست بک بیاد f5 بزنه چون پست بکی نشده پس رخداد button اجرا نمیشه و در انتها تابع onPreRender اجرا میشه و میاد مقدار ["viewState["Update رو به مقدار سشن تنظیم میکنه ...
مرحله دوم : کاربر بیاد button رو کلیک کنه ، اینجا رخداد کلیک فراخونی میشه و در بدنه if چک میشه که آیا مقدار سشن با ویو استیت برابر یا نه (در مرحله قبل این دو مقدار در رخداد onPreRender برابر قرار داده شدند پس برابر هستند !) ؟ اگر برابر باشه مقدار سشن رو آپدیت کن به ساعت الان و اگر نباشه به بدنه else میره ....

مرحله سوم : خوب الان می خوایم کاربر با فشار دادن f5 تنها صفحه رو رفرش کنه و پست بکی اجرا نشه ... فرض کنیم کاربر f5 رو فشار بده برنامه رو تریس می کنیم ... چون فشاردادن f5 موجب میشه تا عملیات مرحله قبل (رخداد کلیک button)(این یه ویژگی دیگه کاریش نمیشه کرد تقصیر من نیست به خدا :) ) تکرار بشه پس برنامه داخل رخداد کلیک میشه در اینجا میاد شرطو چک میکنه که آیا سشن برابر ویو استیت هستش یا نه ؟ (که نیست چون مقدار سشن در مرحله قبل تغییر کرد ..) شاید براتون سوال پیش بیاد که برنامه در تابع onPreRender مقادیر سشن و ویو استیت رو برابر قرار داده پس باید این مقادیر الانم برابر باشن ... که نکتش همینجاس : چون متغییر سشن داخل بلوک پست بکی (رخداد کلیک) مقدارش تغییر کرده ، پس مقدار ویو استیتش به مقدار جدید ست میشه ولی متغییر ["viewState["Update داخل بلوک پست بکی مقدار دهی نشده پس با پست بک شدن صفحه میاد مقدار قبلیشو از ویو استیت فراخونی میکنه ... پس در نتیجه سشن و ویو استیت مقادیر متفاوتی خواهند داشت پس شرط if درست نبوده و وارد بلوک else میشیم ... با فشاردادن f5 دیگه پست بکی نخواهیم داشت و فقط رفرش شدن رو شاهد خواهیم بود

دوستان میدونم بحث خیلی سنگین بود :خجالت: خودمم زیاد نفهمیدم چی گفتم ....

راستی داشت یادم میرفت یادمه تو یه پروژه از این روش استفاده کرده بودم که کلا به اف رفتم :گریه: همون روش اول اوکی تره ... بای

notlikeothers
چهارشنبه 20 اسفند 1393, 09:05 صبح
به نظر من اول بیا کلید f5 رو کمپلت غیر فعال کن تا کاربر نتونه با f5 صفحه رو رفرش کنه ....


<script type="text/javascript">
$(document).on("keydown", disableF5);
function disableF5(e) { if ((e.which || e.keyCode) == 116) e.preventDefault(); };
</script>


بعدش بیا یه لینک بزار تو صفحه و hrefش رو هم به صفحه جاری اختصاص بده ...


البته یه روش دیگه هم هست که خیلی اوکی تره .... :


protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack) // If page loads for first time
{
// Assign the Session["update"] with unique value
Session["update"] = Server.UrlEncode(System.DateTime.Now.ToString());
//=============== Page load code =========================




//============== End of Page load code ===================
}
}


protected void btnDisplay_Click(object sender, EventArgs e)
{
// If page not Refreshed
if (Session["update"].ToString() == ViewState["update"].ToString())
{
//=============== On click event code =========================



//=============== End of On click event code ==================


// After the event/ method, again update the session


Session["update"] = Server.UrlEncode(System.DateTime.Now.ToString());
}
else // If Page Refreshed
{
// Do nothing
}
}


protected override void OnPreRender(EventArgs e)
{
ViewState["update"] = Session["update"];

}


اومده یه سشن به اسم update ساخته که اول برنامه میاد مقداردهی میشه به ساعت الان
مرحله اول : کاربر بدون پست بک بیاد f5 بزنه چون پست بکی نشده پس رخداد button اجرا نمیشه و در انتها تابع onPreRender اجرا میشه و میاد مقدار ["viewState["Update رو به مقدار سشن تنظیم میکنه ...
مرحله دوم : کاربر بیاد button رو کلیک کنه ، اینجا رخداد کلیک فراخونی میشه و در بدنه if چک میشه که آیا مقدار سشن با ویو استیت برابر یا نه (در مرحله قبل این دو مقدار در رخداد onPreRender برابر قرار داده شدند پس برابر هستند !) ؟ اگر برابر باشه مقدار سشن رو آپدیت کن به ساعت الان و اگر نباشه به بدنه else میره ....

مرحله سوم : خوب الان می خوایم کاربر با فشار دادن f5 تنها صفحه رو رفرش کنه و پست بکی اجرا نشه ... فرض کنیم کاربر f5 رو فشار بده برنامه رو تریس می کنیم ... چون فشاردادن f5 موجب میشه تا عملیات مرحله قبل (رخداد کلیک button)(این یه ویژگی دیگه کاریش نمیشه کرد تقصیر من نیست به خدا :) ) تکرار بشه پس برنامه داخل رخداد کلیک میشه در اینجا میاد شرطو چک میکنه که آیا سشن برابر ویو استیت هستش یا نه ؟ (که نیست چون مقدار سشن در مرحله قبل تغییر کرد ..) شاید براتون سوال پیش بیاد که برنامه در تابع onPreRender مقادیر سشن و ویو استیت رو برابر قرار داده پس باید این مقادیر الانم برابر باشن ... که نکتش همینجاس : چون متغییر سشن داخل بلوک پست بکی (رخداد کلیک) مقدارش تغییر کرده ، پس مقدار ویو استیتش به مقدار جدید ست میشه ولی متغییر ["viewState["Update داخل بلوک پست بکی مقدار دهی نشده پس با پست بک شدن صفحه میاد مقدار قبلیشو از ویو استیت فراخونی میکنه ... پس در نتیجه سشن و ویو استیت مقادیر متفاوتی خواهند داشت پس شرط if درست نبوده و وارد بلوک else میشیم ... با فشاردادن f5 دیگه پست بکی نخواهیم داشت و فقط رفرش شدن رو شاهد خواهیم بود

دوستان میدونم بحث خیلی سنگین بود :خجالت: خودمم زیاد نفهمیدم چی گفتم ....

راستی داشت یادم میرفت یادمه تو یه پروژه از این روش استفاده کرده بودم که کلا به اف رفتم :گریه: همون روش اول اوکی تره ... بای
این روش ج میده ولی چند بار که f5رو بزنی قاطی میکنه

keiv@n
چهارشنبه 20 اسفند 1393, 10:38 صبح
این روش ج میده ولی چند بار که f5رو بزنی قاطی میکنه
روش اول ؟ یا دوم ؟

notlikeothers
چهارشنبه 20 اسفند 1393, 17:40 عصر
روش اول ؟ یا دوم ؟
روش دوم. مسلماً