国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > .NET > 正文

ASP.NET防止頁(yè)面刷新的兩種解決方法小結(jié)

2024-07-10 12:43:58
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

方法有二,總結(jié)如下:

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

當(dāng)有人想按后退時(shí)頁(yè)面已過(guò)期,效果就達(dá)到了

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

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

問(wèn)題分析

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

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

其實(shí)到這里問(wèn)題還沒(méi)有完全解決,具體說(shuō)來(lái)就是Session的鍵值問(wèn)題。假設(shè)我們將ViewState保存為 this.Session["myViewState"],如果一個(gè)用戶同時(shí)打開(kāi)兩個(gè)防刷新提交的頁(yè)面就亂套了,那針對(duì)頁(yè)面的url設(shè)置Session的鍵值呢?還是不行,因?yàn)橛脩粲锌赡茉趦蓚€(gè)窗口中打開(kāi)同一頁(yè)面,所以必須為每次打開(kāi)的頁(yè)面定義唯一的Session鍵值,并且該鍵值可以隨當(dāng)前頁(yè)面實(shí)例一起保存,參考ViewState的保存方式,我們直接向頁(yè)面添加一個(gè)隱藏域?qū)iT(mén)存放Session鍵值就可以了。

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

另外,由于本方法會(huì)生成額外的Session占用服務(wù)器資源,所以請(qǐng)?jiān)诒仨毐A舢?dāng)前頁(yè)面狀態(tài)的情況下使用,若無(wú)需保留當(dāng)前頁(yè)面狀態(tài),則在完成數(shù)據(jù)提交后直接重定向到當(dāng)前頁(yè)面即可。

SubmitOncePage

SubmitOncePage是針對(duì)上述分析寫(xiě)的一個(gè)繼承自System.Web.UI.Page的基類(lèi),需要防止刷新重復(fù)提交數(shù)據(jù)的頁(yè)面從該基類(lèi)繼承,源碼如下:
代碼如下:
namespace myControl
{
/// <summary>
/// 名稱:SubmitOncePage
/// 父類(lèi):System.Web.UI.Page
/// 描述:解決瀏覽器刷新造成的數(shù)據(jù)重復(fù)提交問(wèn)題的page擴(kuò)展類(lèi)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 视频| 西藏| 株洲县| 容城县| 江油市| 密山市| 肇州县| 临泉县| 湘西| 惠州市| 开化县| 三亚市| 当雄县| 商水县| 华容县| 札达县| 绥滨县| 常宁市| 牟定县| 临猗县| 邵武市| 涡阳县| 龙游县| 盘山县| 交口县| 中宁县| 桂阳县| 龙岩市| 阿坝县| 大安市| 沅江市| 永善县| 泰州市| 丰都县| 定兴县| 怀柔区| 岳普湖县| 土默特右旗| 临沂市| 寿光市| 秦皇岛市|