asp.net防止重新整理時重複提交(可禁用工具條重新整理按鈕)

來源:互聯網
上載者:User

前段時間遇到了需要禁用重新整理的需求,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找到了另外一種解決方案
這種方式能夠準確的判斷是否是通過瀏覽器的重新整理按鈕進行的請求,而且使用起來也非常簡單!
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真是個不過的地方,很多問題都是通過它來解決的其他的方式不一一列舉,列舉的第二種方式可以說簡單易用,所有的實現都已經為我們封裝好了,只需要簡單的調用。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.