前段時間遇到了需要禁用刷新的需求,f5按鈕就不說了,簡單的js就能把它禁用,但是工具條上的刷新按鈕卻傻傻乾不掉。 如果簡單的在刷新時重新載入畫面,通過window.location.href="url"可以很容易的實現,但是需求是要求在刷新時什麼都不做,保留畫面的狀態,這下子可就複雜化了。 asp. ...
前段時間遇到了需要禁用刷新的需求,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真是個不過的地方,很多問題都是通過它來解決的
其他的方式不一一列舉,列舉的第二種方式可以說簡單易用,所有的實現都已經為我們封裝好了,只需要簡單的調用。