asp.net防止刷新時(shí)重復(fù)提交(可禁用工具條刷新按鈕)
更新時(shí)間:2013年01月28日 17:07:28 作者:
前段時(shí)間遇到了需要禁用刷新的需求,f5按鈕就不說(shuō)了,簡(jiǎn)單的js就能把它禁用,但是工具條上的刷新按鈕卻防止不了啊,不過(guò)本文介紹的一種方法卻可以解決此問(wèn)題,感興趣的朋友可以了解下啊,希望本文對(duì)你有所幫助
前段時(shí)間遇到了需要禁用刷新的需求,f5按鈕就不說(shuō)了,簡(jiǎn)單的js就能把它禁用,但是工具條上的刷新按鈕卻傻傻干不掉。
如果簡(jiǎn)單的在刷新時(shí)重新加載畫(huà)面,通過(guò)window.location.href="url"可以很容易的實(shí)現(xiàn),但是需求是要求在刷新時(shí)什么都不做,保留畫(huà)面的狀態(tài),這下子可就復(fù)雜化了。
asp.net中分辨請(qǐng)求是重新請(qǐng)求還是通過(guò)刷新按鈕再次請(qǐng)求不是很方便,為了實(shí)現(xiàn)這個(gè)效果,試過(guò)了很多的方式,一下面的兩種為例
1.
private bool pageRefreshed = false; //頁(yè)面是否刷新提交
private bool refreshState = false; //ViewState中暫存的狀態(tài)
然后重寫(xiě)Page的LoadViewState與SaveViewState方法:
protected override void LoadViewState(object savedState)
{
object[] states = (object[])savedState;
base.LoadViewState(states[0]);
refreshState = (bool)states[1];
if(Session["__PAGE_REFRESHED"] == null)
pageRefreshed = false;
else
pageRefreshed = refreshState != (bool)Session["__PAGE_REFRESHED"];
}
protected override object SaveViewState()
{
Session["__PAGE_REFRESHED"] = !refreshState;
object[] states = new object[2];
states[0] = base.SaveViewState();
states[1] = !refreshState;
return states;
}
private void Button1_Click(object sender, EventArgs e)
{
if (pageRefreshed )
{
label.Text="this is refreshed function";
}
else
{
label.Text="this is new request function";
}
}
這種方法雖然能夠?qū)崿F(xiàn),但是在某些請(qǐng)款下不適應(yīng)。如果畫(huà)面上同時(shí)存在文本框和按鈕式,設(shè)置按鈕的autopostback="True"時(shí),在修改完文本框的值,直接點(diǎn)擊按鈕(在文本框沒(méi)有失去焦點(diǎn)時(shí),直接點(diǎn)擊按鈕),這時(shí)的執(zhí)行順序是textchanged→textchanged→buttonclick,在第一次textchanged時(shí),就把狀態(tài)已經(jīng)變成了true,按鈕的不能執(zhí)行。
2.codeproject找到了另外一種解決方法
這種方式能夠準(zhǔn)確的判斷是否是通過(guò)瀏覽器的刷新按鈕進(jìn)行的請(qǐng)求,而且使用起來(lái)也非常簡(jiǎn)單!
1.引用dll,修改配置文件
在配置文件中添加modules
<system.web>
<httpModules>
<add name="RefreshModule"
type="RefreshModule.Module, RefreshModule"/>
</httpModules>
</system.web>
PS:wbapplication的情況下需要改成在system.webServer的modules的節(jié)點(diǎn)下追加modules
2.定義刷新時(shí)的行為
[Refresh()]
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if(IsPostBack && !RefereshHelper.IsPageRefreshed)
{
// do some work with the submitted date
}
else
{
// do some work when the page is loaded with the GET method
}
}
}
RefereshHelper.IsPageRefreshed這個(gè)參數(shù)就是用來(lái)判斷是否是通過(guò)瀏覽器的書(shū)刷新按鈕進(jìn)行的請(qǐng)求。其他的行為行為控制參照原文。PS:codeproject真是個(gè)不過(guò)的地方,很多問(wèn)題都是通過(guò)它來(lái)解決的其他的方式不一一列舉,列舉的第二種方式可以說(shuō)簡(jiǎn)單易用,所有的實(shí)現(xiàn)都已經(jīng)為我們封裝好了,只需要簡(jiǎn)單的調(diào)用。
如果簡(jiǎn)單的在刷新時(shí)重新加載畫(huà)面,通過(guò)window.location.href="url"可以很容易的實(shí)現(xiàn),但是需求是要求在刷新時(shí)什么都不做,保留畫(huà)面的狀態(tài),這下子可就復(fù)雜化了。
asp.net中分辨請(qǐng)求是重新請(qǐng)求還是通過(guò)刷新按鈕再次請(qǐng)求不是很方便,為了實(shí)現(xiàn)這個(gè)效果,試過(guò)了很多的方式,一下面的兩種為例
1.
復(fù)制代碼 代碼如下:
private bool pageRefreshed = false; //頁(yè)面是否刷新提交
private bool refreshState = false; //ViewState中暫存的狀態(tài)
然后重寫(xiě)Page的LoadViewState與SaveViewState方法:
復(fù)制代碼 代碼如下:
protected override void LoadViewState(object savedState)
{
object[] states = (object[])savedState;
base.LoadViewState(states[0]);
refreshState = (bool)states[1];
if(Session["__PAGE_REFRESHED"] == null)
pageRefreshed = false;
else
pageRefreshed = refreshState != (bool)Session["__PAGE_REFRESHED"];
}
protected override object SaveViewState()
{
Session["__PAGE_REFRESHED"] = !refreshState;
object[] states = new object[2];
states[0] = base.SaveViewState();
states[1] = !refreshState;
return states;
}
復(fù)制代碼 代碼如下:
private void Button1_Click(object sender, EventArgs e)
{
if (pageRefreshed )
{
label.Text="this is refreshed function";
}
else
{
label.Text="this is new request function";
}
}
這種方法雖然能夠?qū)崿F(xiàn),但是在某些請(qǐng)款下不適應(yīng)。如果畫(huà)面上同時(shí)存在文本框和按鈕式,設(shè)置按鈕的autopostback="True"時(shí),在修改完文本框的值,直接點(diǎn)擊按鈕(在文本框沒(méi)有失去焦點(diǎn)時(shí),直接點(diǎn)擊按鈕),這時(shí)的執(zhí)行順序是textchanged→textchanged→buttonclick,在第一次textchanged時(shí),就把狀態(tài)已經(jīng)變成了true,按鈕的不能執(zhí)行。
2.codeproject找到了另外一種解決方法
這種方式能夠準(zhǔn)確的判斷是否是通過(guò)瀏覽器的刷新按鈕進(jìn)行的請(qǐng)求,而且使用起來(lái)也非常簡(jiǎn)單!
1.引用dll,修改配置文件
在配置文件中添加modules
復(fù)制代碼 代碼如下:
<system.web>
<httpModules>
<add name="RefreshModule"
type="RefreshModule.Module, RefreshModule"/>
</httpModules>
</system.web>
PS:wbapplication的情況下需要改成在system.webServer的modules的節(jié)點(diǎn)下追加modules
2.定義刷新時(shí)的行為
復(fù)制代碼 代碼如下:
[Refresh()]
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if(IsPostBack && !RefereshHelper.IsPageRefreshed)
{
// do some work with the submitted date
}
else
{
// do some work when the page is loaded with the GET method
}
}
}
RefereshHelper.IsPageRefreshed這個(gè)參數(shù)就是用來(lái)判斷是否是通過(guò)瀏覽器的書(shū)刷新按鈕進(jìn)行的請(qǐng)求。其他的行為行為控制參照原文。PS:codeproject真是個(gè)不過(guò)的地方,很多問(wèn)題都是通過(guò)它來(lái)解決的其他的方式不一一列舉,列舉的第二種方式可以說(shuō)簡(jiǎn)單易用,所有的實(shí)現(xiàn)都已經(jīng)為我們封裝好了,只需要簡(jiǎn)單的調(diào)用。
相關(guān)文章
asp.net實(shí)現(xiàn)取消頁(yè)面表單內(nèi)文本輸入框Enter響應(yīng)的方法
這篇文章主要介紹了asp.net實(shí)現(xiàn)取消頁(yè)面表單內(nèi)文本輸入框Enter響應(yīng)的方法,結(jié)合實(shí)例形式分析了asp.net文本框Enter響應(yīng)的原理與取消Enter響應(yīng)的相關(guān)實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11
基于.Net中的數(shù)字與日期格式化規(guī)則助記詞的使用詳解
本篇文章是對(duì).Net中的數(shù)字與日期格式化規(guī)則助記詞的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
asp.net core mvc實(shí)現(xiàn)偽靜態(tài)功能
這篇文章主要為大家詳細(xì)介紹了asp.net core mvc實(shí)現(xiàn)偽靜態(tài)功能的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02
解決ASP.NET回傳后div滾動(dòng)條位置復(fù)位的問(wèn)題(利用隱藏控件原理)
這篇文章主要介紹了解決ASP.NET回傳后div滾動(dòng)條位置復(fù)位的問(wèn)題,中心思想是用一個(gè)隱藏控件保存當(dāng)前scorll值?;貍骰貋?lái)后根據(jù)scrollTop的值,然后在Page_Load中重新設(shè)置scrollTop2014-01-01

