asp.net防止刷新時重復提交


前段時間遇到了需要禁用刷新的需求,f5按鈕就不說了,簡單的js就能把它禁用,但是工具條上的刷新按鈕卻傻傻干不掉。

如果簡單的在刷新時重新加載畫面,通過window.location.href="url"可以很容易的實現,但是需求是要求在刷新時什么都不做,保留畫面的狀態,這下子可就復雜化了。

asp.net中分辨請求是重新請求還是通過刷新按鈕再次請求不是很方便,為了實現這個效果,試過了很多的方式,一下面的兩種為例

1.

private bool pageRefreshed = false; //頁面是否刷新提交
private bool refreshState = false;  //ViewState中暫存的狀態

    然后重寫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";
}
}

這種方法雖然能夠實現,但是在某些請款下不適應。如果畫面上同時存在文本框和按鈕式,設置按鈕的autopostback="True"時,在修改完文本框的值,直接點擊按鈕(在文本框沒有失去焦點時,直接點擊按鈕),這時的執行順序是textchanged→textchanged→buttonclick,在第一次textchanged時,就把狀態已經變成了true,按鈕的不能執行。

2.codeproject找到了另外一種解決方法 原文地址:http://www.codeproject.com/Articles/18841/Refresh-Module

這種方式能夠准確的判斷是否是通過瀏覽器的刷新按鈕進行的請求,而且使用起來也非常簡單!

1.引用dll,修改配置文件

在配置文件中添加modules

<system.web>
    <httpModules>
        <add name="RefreshModule" 
            type="RefreshModule.Module, RefreshModule"/>
    </httpModules>
</system.web> 

PS:wbapplication的情況下需要改成在system.webServer的modules的節點下追加modules

2.定義刷新時的行為

[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這個參數就是用來判斷是否是通過瀏覽器的書刷新按鈕進行的請求。
其他的行為行為控制參照原文。
PS:codeproject真是個不過的地方,很多問題都是通過它來解決的

其他的方式不一一列舉,列舉的第二種方式可以說簡單易用,所有的實現都已經為我們封裝好了,只需要簡單的調用。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM