区分ASP.NET页面刷新与回发

ASP.NET开发中,经常需要区分页面是被用户刷新了浏览器,还是通过表单提交进行了回发。这个问题看似简单,但实际上处理起来并不那么容易。本文将介绍一种方法,通过结合JavaScript和ASP.NET的HttpModule,来实现这一功能。

基本原理

要解决这个问题,可以采取以下步骤:

1. 使用JavaScript生成一个唯一的GUID,并在表单提交时更新这个GUID。

2. 当用户点击提交按钮时,JavaScript函数会被调用,生成一个新的GUID。

3. 在HttpHandler或HttpModule中,比较新旧GUID值。如果值不相等,说明页面是被刷新的,而不是通过提交按钮回发的。

4. 在页面加载时,通过检查会话变量来确定是刷新还是回发,并相应地处理逻辑。

代码实现

首先,需要编写一个JavaScript函数来生成一个唯一的GUID。这个函数使用数学函数,如random和floor,来生成GUID。

function generateRandomSequence() { var g = ""; for (var i = 0; i < 32; i++) { g += Math.floor(Math.random() * 0xF).toString(0xF); } return g; } function onPostBack() { var y = generateRandomSequence(); var hdnGuid = document.getElementById("hdnGuid"); hdnGuid.value = y; }

这段JavaScript代码会在用户点击提交按钮时被调用,并将生成的GUID值赋给一个隐藏字段。

接下来,需要创建一个HttpModule类,它会在页面初始化和加载时执行特定的逻辑。

public class GuidClass { private string guid; public string Guid { get { return guid; } set { guid = value; } } } public class MyHttpModule : IHttpModule { private static Queue<string> temp = new Queue<string>(); public void Init(HttpApplication context) { context.Init += new EventHandler(_page_Init); context.Load += new EventHandler(_page_Load); } private void _page_Init(object sender, EventArgs e) { HttpApplication _page = (HttpApplication)sender; HiddenField hdnGuid = new HiddenField(); hdnGuid.ID = "hdnGuid"; if (!_page.Context.IsPostback) { hdnGuid.Value = Guid.NewGuid().ToString(); _page.Context.Items["OldGuid"] = hdnGuid.Value; _page.Form.Controls.Add(hdnGuid); } } private void _page_Load(object sender, EventArgs e) { HttpApplication _page = (HttpApplication)sender; HiddenField h1 = (HiddenField)(_page.Form.FindControl("hdnGuid")); GuidClass currentGuid = new GuidClass(); currentGuid.Guid = h1.Value; string oldGuid = _page.Context.Items["OldGuid"] as string; if (oldGuid != currentGuid.Guid) { _page.Context.Items.Add("IsRefresh", false); } else { _page.Context.Items.Add("IsRefresh", true); } } }

这段代码会在页面初始化时创建一个隐藏字段,并在页面加载时比较新旧GUID值,以确定页面是被刷新还是回发。

最后,需要在ASP.NET页面中检测是刷新还是回发,并相应地处理逻辑。

if ((bool)HttpContext.Current.Items["IsRefresh"]) { Response.Write("refreshed"); } else { Response.Write("Postback"); }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485