資源簡介
【實例簡介】實現了用戶操作時 刷新導致的重復操作問題。
實現原理如下:
使用一個上下文唯一的票據號,該票據號隨頁面提交或回發而遞增,每當用戶與服務器端交互時,代碼會提取上次的票據號碼并與當前票據號碼比較,如果當前票據大于上次的票據,則是提交或回發,否則則識別為刷新。
這種方式會用到HttpMoudel,并在其中操作Session。
使用方法如下:
1、引入dll MsdnExt 壓縮包中有
2.修改web.config,在<httpModules> </httpModules>添加以下item:
<add name="MsdnModule" type="Msdn.RefreshModule, MsdnExt"/>
其中“MsdnModule”是一個名字, “Msdn.RefreshModule”是“Msdn”下的“RefreshModule”類型,“MsdnExt”是程序集的名字
3.引入命名空間 using Msdn; 并修改頁面類繼承Msdn.Page
4.使用代碼
代碼:
protected void Button1_Click(object sender, EventArgs e) { if (!IsPageRefresh) Response.Write("按鈕事件"); else Response.Write("頁面刷新"); TrackRefreshState(); }
MSDNPage.cs 核心代碼如下:
using System; using System.Web.UI; using System.Web; using System.Text; namespace Msdn { public class Page : System.Web.UI.Page { #region Constants // *********************************************************** // Constants public const string RefreshTicketCounter = "RefreshTicketCounter"; private const string SetFocusFunctionName = "__setFocus"; private const string SetFocusScriptName = "__inputFocusHandler"; // *********************************************************** #endregion // *********************************************************** // Ctor public Page() { m_focusedControl = ""; // Register a PreRender handler this.PreRender = new EventHandler(RefreshPage_PreRender); } // *********************************************************** // ************************************************************** // Indicates if the page is being viewed in response to F5 hit public bool IsPageRefresh { get { object o = HttpContext.Current.Items[RefreshAction.PageRefreshEntry]; if (o == null) return false; return (bool) o; } } // ************************************************************** // ************************************************************** // Increase the internal counter used to generate refresh tickets public void TrackRefreshState() { InitRefreshState(); int ticket = Convert.ToInt32(Session[RefreshTicketCounter]) 1; Session[RefreshTicketCounter] = ticket; } // ************************************************************** // ************************************************************** // Set the control with the input focus public void SetFocus(string ctlId) { m_focusedControl = ctlId; } // ************************************************************** #region Private Members // ************************************************************** // Create the hidden field to store the current request ticket private void SaveRefreshState() { int ticket = Convert.ToInt32(Session[RefreshTicketCounter]) 1; RegisterHiddenField(RefreshAction.CurrentRefreshTicketEntry, ticket.ToString()); } // ************************************************************** // ************************************************************** // Ensure that the ticket counter is initialized private void InitRefreshState() { if (Session[RefreshTicketCounter] == null) Session[RefreshTicketCounter] = 0; } // ************************************************************** // ************************************************************** // Handle the PreRender event private void RefreshPage_PreRender(object sender, EventArgs e) { SaveRefreshState(); AddSetFocusScript(); } // ************************************************************** // ************************************************************** // Add any script code required for the SetFocus feature private void AddSetFocusScript() { if (m_focusedControl == "") return; // Add the script to declare the function // (Only one form in ASP.NET pages) StringBuilder sb = new StringBuilder(""); sb.Append("<script language=javascript>"); sb.Append("function "); sb.Append(SetFocusFunctionName); sb.Append("(ctl) {"); sb.Append(" if (document.forms[0][ctl] != null)"); sb.Append(" {document.forms[0][ctl].focus();}"); sb.Append("}"); // Add the script to call the function sb.Append(SetFocusFunctionName); sb.Append("('"); sb.Append(m_focusedControl); sb.Append("');<"); sb.Append("/"); // break like this to avoid misunderstandings... sb.Append("script>"); // Register the script (names are CASE-SENSITIVE) if (!IsStartupScriptRegistered(SetFocusScriptName)) RegisterStartupScript(SetFocusScriptName, sb.ToString()); } // ************************************************************** #endregion #region Private Properties // *********************************************************** // Private properties private string m_focusedControl; // *********************************************************** #endregion } }
代碼片段和文件信息
using?System;
using?System.Web.UI;
using?System.Web;
using?System.Web.UI.HtmlControls;
namespace?Msdn
{
public?class?FeedbackbasePage?:?System.Web.UI.Page
{
//?***********************************************************
//?Ctor
public?FeedbackbasePage()
{
//?Register?a?Load?handler
this.Load?+=?new?EventHandler(FeedbackbasePage_Load);
}
//?***********************************************************
//?***********************************************************
//?Constants
public?const?string?BodyId?=?“Body“;
//?***********************************************************
//?***********************************************************
//?Public?members
public?string?TargetUrl?=?““;
//?***********************************************************
//?***********************************************************
//?Inject?auto-redirect?code?in?the?onload?DHTML?event
public?string?GetAutoRedirectscript()
{
retur
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄??????????0??2010-02-06?13:48??Refresh
?????目錄??????????0??2010-02-05?11:38??Refresh\App_Data
?????目錄??????????0??2010-02-06?13:41??Refresh\bin
?????文件???????8704??2010-02-06?13:48??Refresh\bin\Refresh.dll
?????文件??????30208??2010-02-06?13:48??Refresh\bin\Refresh.pdb
?????目錄??????????0??2010-02-06?13:47??Refresh\Class
?????文件???????2075??2010-02-06?13:47??Refresh\Class\Feedbackba
?????文件???????1167??2010-02-06?13:47??Refresh\Class\LengthyAction.cs
?????文件???????4339??2010-02-06?13:47??Refresh\Class\MsdnPage.cs
?????文件???????2765??2010-02-06?13:47??Refresh\Class\RefreshAction.cs
?????文件???????1123??2010-02-06?13:47??Refresh\Class\RefreshModule.cs
?????文件????????550??2010-02-06?13:42??Refresh\Default.aspx
?????文件????????806??2010-02-06?13:43??Refresh\Default.aspx.cs
?????文件???????1185??2010-02-06?13:42??Refresh\Default.aspx.designer.cs
?????目錄??????????0??2010-02-06?13:35??Refresh\obj
?????目錄??????????0??2010-02-06?13:48??Refresh\obj\Debug
?????文件????????437??2010-02-06?13:42??Refresh\obj\Debug\Refresh.csproj.FileListAbsolute.txt
?????文件???????8704??2010-02-06?13:48??Refresh\obj\Debug\Refresh.dll
?????文件??????30208??2010-02-06?13:48??Refresh\obj\Debug\Refresh.pdb
?????目錄??????????0??2010-02-05?11:38??Refresh\obj\Debug\TempPE
?????目錄??????????0??2010-02-06?13:35??Refresh\Properties
?????文件???????1314??2010-02-05?11:38??Refresh\Properties\AssemblyInfo.cs
?????文件???????4454??2010-02-06?13:48??Refresh\Refresh.csproj
?????文件???????1300??2010-02-06?13:48??Refresh\Refresh.csproj.user
?????文件???????7891??2010-02-06?13:48??Refresh\Web.config
?????文件????????911??2010-02-06?13:48??Refresh.sln
????..A..H.?????11264??2010-02-06?13:48??Refresh.suo
?????目錄??????????0??2010-02-06?13:47??MsdnExt
?????目錄??????????0??2010-02-06?13:46??MsdnExt\bin
?????目錄??????????0??2010-02-06?13:46??MsdnExt\bin\Debug
............此處省略15個文件信息
- 上一篇:二維表
- 下一篇:對象串行化保存與讀取
評論
共有 條評論