资源简介
【实例简介】实现了用户操作时 刷新导致的重复操作问题。
实现原理如下:
使用一个上下文唯一的票据号,该票据号随页面提交或回发而递增,每当用户与服务器端交互时,代码会提取上次的票据号码并与当前票据号码比较,如果当前票据大于上次的票据,则是提交或回发,否则则识别为刷新。
这种方式会用到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个文件信息
- 上一篇:二维表
- 下一篇:对象串行化保存与读取
评论
共有 条评论