在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");
}