溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ASP.NET中怎么防止頁面刷新

發(fā)布時間:2021-07-21 11:35:46 來源:億速云 閱讀:323 作者:Leah 欄目:開發(fā)技術(shù)

本篇文章為大家展示了ASP.NET中怎么防止頁面刷新,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

第一方法:
直接在CS代碼里敲:
Response.Buffer = true;
Response.ExpiresAbsolute = DateTime.Now.AddSeconds(-1);
Response.Expires = 0;
Response.CacheControl = "no-cache";

當有人想按后退時頁面已過期,效果就達到了

第二方法:
SubmitOncePage:解決刷新頁面造成的數(shù)據(jù)重復提交問題(網(wǎng)上資料)

執(zhí)行過postback操作的web頁面在刷新的時候,瀏覽器會有“不重新發(fā)送信息,則無法刷新網(wǎng)頁”的提示,若剛剛執(zhí)行的恰好是往數(shù)據(jù)庫插入一條新記錄的操作,點[重試]的結(jié)果是插入了兩條重復的記錄,以前一直是用保存數(shù)據(jù)后重新轉(zhuǎn)向當前頁面的方法解決,最近又找到了一個新的方法。

問題分析

在System.Web.UI.Page類中,有一個名為ViewState屬性用以保存頁面的當前視圖狀態(tài),觀察每個aspx頁面最終生成的html代碼可以發(fā)現(xiàn),其實就是向頁面添加了一個名為__VIEWSTATE的隱藏域,其value值就是頁面的當前狀態(tài),每次執(zhí)行postback過后,該 value值都會發(fā)生變化,而刷新頁面則不會改變。

針對這種情況,我們可以在頁面代碼執(zhí)行的末尾將當前的ViewState寫到一個Session中,而在頁面加載時則判斷該Session值是否與當前 ViewState相等(其實Session值恰好是ViewState的前一狀態(tài)),若不等,則是正常的postback,若是相等則是瀏覽器刷新,這樣一來,只要在我們的數(shù)據(jù)插入代碼外嵌套一個if判斷就可以達到防止數(shù)據(jù)重復提交的目的了。

其實到這里問題還沒有完全解決,具體說來就是Session的鍵值問題。假設我們將ViewState保存為 this.Session["myViewState"],如果一個用戶同時打開兩個防刷新提交的頁面就亂套了,那針對頁面的url設置Session的鍵值呢?還是不行,因為用戶有可能在兩個窗口中打開同一頁面,所以必須為每次打開的頁面定義唯一的Session鍵值,并且該鍵值可以隨當前頁面實例一起保存,參考ViewState的保存方式,我們直接向頁面添加一個隱藏域?qū)iT存放Session鍵值就可以了。

經(jīng)oop80和Edward.Net的提醒,為了盡可能地降低Session數(shù)據(jù)對服務器資源的占用量,現(xiàn)將上述方案略做調(diào)整,將ViewState利用md5加密后返回的32位字符串寫入Session。

另外,由于本方法會生成額外的Session占用服務器資源,所以請在必須保留當前頁面狀態(tài)的情況下使用,若無需保留當前頁面狀態(tài),則在完成數(shù)據(jù)提交后直接重定向到當前頁面即可。

SubmitOncePage

SubmitOncePage是針對上述分析寫的一個繼承自System.Web.UI.Page的基類,需要防止刷新重復提交數(shù)據(jù)的頁面從該基類繼承,源碼如下:

復制代碼 代碼如下:


namespace myControl
{
/// <summary>
/// 名稱:SubmitOncePage
/// 父類:System.Web.UI.Page
/// 描述:解決瀏覽器刷新造成的數(shù)據(jù)重復提交問題的page擴展類。
/// 示例:if (!this.IsRefreshed)
///{
/////具體代碼
///}
/// </summary>
public class SubmitOncePage:System.Web.UI.Page
{
private string _strSessionKey;
private string _hiddenfieldName;
private string _strLastViewstate;

public SubmitOncePage()
{
_hiddenfieldName = "__LastVIEWSTATE_SessionKey";
_strSessionKey = System.Guid.NewGuid().ToString();
_strLastViewstate = string.Empty;
}

public bool IsRefreshed
{
get
{
string str1 = GetSessinContent();
_strLastViewstate = str1;
string str2 = this.Session[GetSessinKey()] as string;
bool flag1 = (str1 != null) && (str2 != null) && (str1 == str2);
return flag1;
}
}

protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
string str = GetSessinKey();
this.Session[str] = _strLastViewstate;
this.RegisterHiddenField(_hiddenfieldName, str);
base.Render(writer);
}


private string GetSessinKey()
{
string str = this.Request.Form[_hiddenfieldName];
return (str == null) ? _strSessionKey : str;
}

private string GetSessinContent() {
string str = this.Request.Form["__VIEWSTATE"];
if (str == null) {
return null;
}
return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5");
}

}
}

測試項目

首先將SubmitOncePage類的源碼編譯成一個單獨的dll,然后進行測試,步驟如下:

1、新建一個asp.net web應用程序;
2、添加SubmitOncePage類對應的dll引用;
3、給webform1添加一個Label控件(Label1)和一個Button控件(Button1);
4、設置Label1的Text為0;
5、雙擊Button1轉(zhuǎn)到codebehind視圖;
6、修改類WebForm1的父類為SubmitOncePage并添加測試代碼,結(jié)果如下:

復制代碼 代碼如下:


public class WebForm1 : myControl.SubmitOncePage
{
protected System.Web.UI.WebControls.Label Label1;
protected System.Web.UI.WebControls.Button Button1;


#region Web 窗體設計器生成的代碼
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 該調(diào)用是 ASP.NET Web 窗體設計器所必需的。
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// 設計器支持所需的方法 - 不要使用代碼編輯器修改
/// 此方法的內(nèi)容。
/// </summary>
private void InitializeComponent()
{
this.Button1.Click += new System.EventHandler(this.Button1_Click);
}
#endregion

private void Button1_Click(object sender, System.EventArgs e)
{
int i=int.Parse(Label1.Text)+1;
Label1.Text = i.ToString();
if (!this.IsRefreshed)
{
WriteFile("a.txt", i.ToString());
}
WriteFile("b.txt", i.ToString()); 


}

private void WriteFile(string strFileName,string strContent)
{
string str = this.Server.MapPath(strFileName); 
System.IO.StreamWriter sw = System.IO.File.AppendText(str);
sw.WriteLine(strContent);
sw.Flush();
sw.Close(); 
}
}

7、按F5運行,在瀏覽器窗口中連續(xù)點擊幾次Button1,然后刷新幾次頁面,再點擊幾次Button1;

8、轉(zhuǎn)到測試項目對應目錄下,打開a.txt和b.txt文件,可看到if (!this.IsRefreshed) 的具體效果。

上述內(nèi)容就是ASP.NET中怎么防止頁面刷新,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI