There can be no Triumph without Loss,No Victory without Suffering,No Freedom without Sacrifice.
All you have to decide is what to do with the time that is given to you.
Get busy Living, or Get busy Dying?
  首页 | 留言给我 | 订阅 Rss | CLI | 黄白之恋 Posts:158   Hits: 5582628    Comments: 173    
 日历归档
<<  <  2024 - 12  >  >>
SuMoTuWeThFrSa
1234567
891011121314
15161718192021
22232425262728
293031
 About Me
 Name: ZhangSichu
 Sex: Male
 Age: 32
 Email: ZhangSichu@gmail.com
 MSN: ZhangSichu@hotmail.com
 Home: ZhangSichu.com
 WeiBo: weibo.com/zhangsichu
 个人推荐
 分类归档
  ·C++/C(5)  RSS
  ·软件工程(1)  RSS
  ·杂事/随感(26)  RSS
  ·.Net/Java(30)  RSS
  ·面向对象程序设计(5)  RSS
  ·汇编/破解(0)  RSS
  ·平面设计(3)  RSS
  ·SQL(5)  RSS
  ·COM/COM+(2)  RSS
  ·Web开发(81)  RSS
 My Friends
Back Forward Refresh Home 2024年12月9日 星期一 RSS CLI Mine Sweeper. In Javascript.

  如何区分PostBack是F5刷新还是FormSubmit
字体大小 [ ]

在一个页面上有很多Button或者可以提交的Html Dom对象,如何区分服务器端收到的PostBack是用户点击的FromSubmit还是F5页面刷新。在http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvs05/html/BedrockASPNET.asp 这篇文章的Trap the Browser Refresh 部分讲述了一个办法,用Page. RegisterHiddenField 注册一个HiddenField和Session中的Ticket比较,确定是否是Refresh的办法。这个办法用到了IHttpModule HttpContext,在IHttpModule.Init(HttpApplication context)时把是否是Refresh的属性放在HttpContext中,供整个Page的生命周期(LifeCycle)使用。和这个方法的想法,差不多,下面是一个比较简便的实现方法。

用Session和ViewState的特定Key比较检查是否是刷新。每次OnPreRender后再次重新发号。

public partial class F5 : System.Web.UI.Page
{
private static string MaskKey = "____MASKKEY"; //注册全局的MaskKey
protected void Page_Load(object sender, EventArgs e)
{
ShowStatus();//打印状态
}
private void InitialMask()
{
this.Session[MaskKey] = this.ViewState[MaskKey] = Guid.NewGuid().ToString();//重新发号 给Session 和 ViewState 新的Guid Session在服务器端标志 ViewState放在客户端标志
}
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
InitialMask();//发号
}
public bool IsRefresh
{
get
{
if (this.Session[MaskKey] == null || this.ViewState[MaskKey] == null) return false;
return !this.Session[MaskKey].ToString().Equals(this.ViewState[MaskKey].ToString());//检查Key是否相同
}
}
protected void btnTest_Click(object sender, EventArgs e)
{
this.lblGuid.Text = this.Session[MaskKey].ToString() + " " + this.ViewState[MaskKey].ToString();//打印Key
}
private void ShowStatus()
{
if (this.IsRefresh)
{
this.lblShow.Text = "F5 Refresh";
}
else
{
this.lblShow.Text = "Html Dom submit";
}
}
}
IE的F5 Refresh 提交的是IE中最后一次对服务器的请求,也就是上的ViewState中的东西,由于没有使用Html Dom来提交,没有提交这次新发的ViewState Key。这样Session中的Key和ViewState中的Key (上次的ViewState)不相同,则认为是F5 刷新。如果是相同的则说明用了最后Render的 Session Key和ViewState Key所以被认为是Html Dom的FormSubmit。 如下图:

Click to Open in New Window
  Posted @ 10/18/2006 6:31:20 PM | Hits (48609) | Comments (1

  Comment
 #re:如何区分PostBack是F5刷新还是FormSubmit  10/25/2006 9:35:27 PM  bill
我已让我这边的人员启动垂直搜索计划了
  Post Comment
标题 *
作者 *
密码 记住我
评论 *
    


Stable in Firefox 1.5 2.0Stable in IE6 IE7Stable in MozillaStable in Netscape
ZhangSichu.com V0.1.7507
Powered By ZhangSichu
Copyright © ZhangSichu
Download ZhangSichu.com source code. Download source code