最优化实现ASP.NET页面的返回和刷新机制
2008-11-27 21:01
1161 查看
问题提出:当我们在编写ASP.NET程序时,通常要实现如下功能,例如:WebForm1.aspx是一个产品列表(通常有一个查询按钮),本页面有一个创建或者修改按钮,当点击该按钮时,迁移到另一页面WebForm2.aspx,本页面是指定产品信息页面,通常有一个保存按钮和返回按钮,当我们创建或者修改了产品信息,点击返回按钮返回到前一面,需要让WebForm1.aspx刷新,以便显示我们刚才添加或者修改的信息,通常的做法是在返回按钮的服务器事件中,使用Response.Redirct方法重定向到WebForm1.aspx页面.功能虽然实现了,但是原来在WebForm1.aspx中的状态全部丢失了,比如说,我们在WebForm1.aspx中输入了查询条件,当我们用Response.Redirct方法重定向的时候,WebForm1.aspx的查询条件丢失了,无法再次显示上次查询条件下的产品列表.下面是我的对这个问题的解决方案:
首先描述一下解决问题的步骤:
1.定义当前页的返回按钮的客户端ID(返回按钮最好使用客户端控件,不要runat=server)
2.定义可以使当前页面内容刷新的按钮(例如查询按钮)
3.记载当前页面的加载次数,如果只加载了一次,说明内容没有变化,那么可能在返回时就不需要刷新返回后的页面(视需求而定).
4.注册客户端返回按钮和刷新按钮的事件.
5.根据需求将需要不需要刷新的标记写入到客户端的cookie中,这样客户端就可以根据此标记决定是否刷新本页面
代码如下:
定义一个的页面基类PageBase,所有需要该功能的页面都需要从此基类继承
/// <summary>
/// 基页类
/// </summary>
public class PageBase : Page
{
/// <summary>
/// 获取或设置当前页面的加载次数
/// </summary>
private int LoadCount
{
get
{
return Convert.ToInt32(ViewState["LoadCount"]);
}
set
{
ViewState["LoadCount"] = value;
}
}
/// <summary>
/// 设置导致本页面刷新的按钮,在需要刷新功能的页面中重写此属性,得到刷新按钮的引用
/// </summary>
protected virtual System.Web.UI.WebControls.Button FlushButton
{
get
{
return null;
}
}
/// <summary>
/// 设置客户端的返回按钮的id,在有返回按钮的页面中重新该属性,得到返回按钮的客户端ID
/// </summary>
protected virtual string ClientBackButtonIDWithFlush
{
get
{
return null;
}
}
/// <summary>
/// 返回后的页面不刷新的客户端按钮id,返回按钮不需要刷新的时候重写此属性
/// </summary>
protected virtual string ClientBackButtonIDWithoutFlush
{
get
{
return null;
}
}
//重写OnLoad时间,记载加载次数,并注册客户端事件
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if(!Page.IsPostBack)
{
LoadCount = 1;
}
else
{
LoadCount ++;
}
RegisterBackButtonClickEvent();
RegisterFlushStartUpEvent();
}
/// <summary>
/// 在客户端的页面加载时,判断是否要重新加载页面(模拟点击刷新按钮)
/// </summary>
private void RegisterFlushStartUpEvent()
{
if(this.FlushButton != null)
{
string script = string.Format(@"
document.body.onload = function()
{{
if(GetCookie('IsFlush') == 'true')
{{
SetCookie('IsFlush','false');
var btnSearch = document.getElementById('{0}');
btnSearch.click();
}}
}}",this.FlushButton.ClientID);
script = GetJsBlock(script);
if(!Page.IsStartupScriptRegistered("FlushStartUpEvent"))
{
Page.RegisterStartupScript("FlushStartUpEvent",script);
}
}
}
/// <summary>
/// 为返回按钮注册事件,挂接返回按钮的客户端事件
/// </summary>
private void RegisterBackButtonClickEvent()
{
if(this.ClientBackButtonIDWithFlush != null)
{
string script = "";
if(LoadCount == 1)
{
script = string.Format(@"document.getElementById('{0}').attachEvent('onclick', function() {{ history.go(-1); }} );",this.ClientBackButtonIDWithFlush);
}
else
{
script = string.Format(@"document.getElementById('{0}').attachEvent('onclick', function() {{ SetCookie('IsFlush','true'); history.go(-{1}); }} );",this.ClientBackButtonIDWithFlush,LoadCount);
}
script = GetJsBlock(script);
if(!Page.IsStartupScriptRegistered("BackButtonWithFlushClickEvent"))
{
Page.RegisterStartupScript("BackButtonWithFlushClickEvent",script);
}
}
if(this.ClientBackButtonIDWithoutFlush != null)
{
string script = string.Format(@"document.getElementById('{0}').attachEvent('onclick', function() {{ history.go(-{1}); }} );",this.ClientBackButtonIDWithoutFlush,LoadCount);
script = GetJsBlock(script);
if(!Page.IsStartupScriptRegistered("BackButtonWithoutFlushClickEvent"))
{
Page.RegisterStartupScript("BackButtonWithoutFlushClickEvent",script);
}
}
}
/// <summary>
/// 返回后的页面不刷新的客户端按钮id
/// </summary>
protected virtual string ClientBackButtonIDWithoutFlush
{
get
{
return null;
}
}
/// <summary>
/// 对javascript外部包装标记
/// </summary>
/// <param name="jsStatement"></param>
/// <returns></returns>
private static string GetJsBlock(string jsStatement)
{
return string.Format("<script language=javascript>{0}</script>",jsStatement);
}
}
此外还需要客户端的脚本支持,script文件如下:
function SetCookie(key, value)
{
// cookies are separated by semicolons
document.cookie = key + "=" + value;
}
function GetCookie(key)
{
// cookies are separated by semicolons
var aCookie = document.cookie.split(";");
for (var i=0; i < aCookie.length; i++)
{
// a name/value pair (a crumb) is separated by an equal sign
var aCrumb = aCookie[i].split("=");
if (key == aCrumb[0])
{
return unescape(aCrumb[1]);
}
}
return null;
}
首先描述一下解决问题的步骤:
1.定义当前页的返回按钮的客户端ID(返回按钮最好使用客户端控件,不要runat=server)
2.定义可以使当前页面内容刷新的按钮(例如查询按钮)
3.记载当前页面的加载次数,如果只加载了一次,说明内容没有变化,那么可能在返回时就不需要刷新返回后的页面(视需求而定).
4.注册客户端返回按钮和刷新按钮的事件.
5.根据需求将需要不需要刷新的标记写入到客户端的cookie中,这样客户端就可以根据此标记决定是否刷新本页面
代码如下:
定义一个的页面基类PageBase,所有需要该功能的页面都需要从此基类继承
/// <summary>
/// 基页类
/// </summary>
public class PageBase : Page
{
/// <summary>
/// 获取或设置当前页面的加载次数
/// </summary>
private int LoadCount
{
get
{
return Convert.ToInt32(ViewState["LoadCount"]);
}
set
{
ViewState["LoadCount"] = value;
}
}
/// <summary>
/// 设置导致本页面刷新的按钮,在需要刷新功能的页面中重写此属性,得到刷新按钮的引用
/// </summary>
protected virtual System.Web.UI.WebControls.Button FlushButton
{
get
{
return null;
}
}
/// <summary>
/// 设置客户端的返回按钮的id,在有返回按钮的页面中重新该属性,得到返回按钮的客户端ID
/// </summary>
protected virtual string ClientBackButtonIDWithFlush
{
get
{
return null;
}
}
/// <summary>
/// 返回后的页面不刷新的客户端按钮id,返回按钮不需要刷新的时候重写此属性
/// </summary>
protected virtual string ClientBackButtonIDWithoutFlush
{
get
{
return null;
}
}
//重写OnLoad时间,记载加载次数,并注册客户端事件
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if(!Page.IsPostBack)
{
LoadCount = 1;
}
else
{
LoadCount ++;
}
RegisterBackButtonClickEvent();
RegisterFlushStartUpEvent();
}
/// <summary>
/// 在客户端的页面加载时,判断是否要重新加载页面(模拟点击刷新按钮)
/// </summary>
private void RegisterFlushStartUpEvent()
{
if(this.FlushButton != null)
{
string script = string.Format(@"
document.body.onload = function()
{{
if(GetCookie('IsFlush') == 'true')
{{
SetCookie('IsFlush','false');
var btnSearch = document.getElementById('{0}');
btnSearch.click();
}}
}}",this.FlushButton.ClientID);
script = GetJsBlock(script);
if(!Page.IsStartupScriptRegistered("FlushStartUpEvent"))
{
Page.RegisterStartupScript("FlushStartUpEvent",script);
}
}
}
/// <summary>
/// 为返回按钮注册事件,挂接返回按钮的客户端事件
/// </summary>
private void RegisterBackButtonClickEvent()
{
if(this.ClientBackButtonIDWithFlush != null)
{
string script = "";
if(LoadCount == 1)
{
script = string.Format(@"document.getElementById('{0}').attachEvent('onclick', function() {{ history.go(-1); }} );",this.ClientBackButtonIDWithFlush);
}
else
{
script = string.Format(@"document.getElementById('{0}').attachEvent('onclick', function() {{ SetCookie('IsFlush','true'); history.go(-{1}); }} );",this.ClientBackButtonIDWithFlush,LoadCount);
}
script = GetJsBlock(script);
if(!Page.IsStartupScriptRegistered("BackButtonWithFlushClickEvent"))
{
Page.RegisterStartupScript("BackButtonWithFlushClickEvent",script);
}
}
if(this.ClientBackButtonIDWithoutFlush != null)
{
string script = string.Format(@"document.getElementById('{0}').attachEvent('onclick', function() {{ history.go(-{1}); }} );",this.ClientBackButtonIDWithoutFlush,LoadCount);
script = GetJsBlock(script);
if(!Page.IsStartupScriptRegistered("BackButtonWithoutFlushClickEvent"))
{
Page.RegisterStartupScript("BackButtonWithoutFlushClickEvent",script);
}
}
}
/// <summary>
/// 返回后的页面不刷新的客户端按钮id
/// </summary>
protected virtual string ClientBackButtonIDWithoutFlush
{
get
{
return null;
}
}
/// <summary>
/// 对javascript外部包装标记
/// </summary>
/// <param name="jsStatement"></param>
/// <returns></returns>
private static string GetJsBlock(string jsStatement)
{
return string.Format("<script language=javascript>{0}</script>",jsStatement);
}
}
此外还需要客户端的脚本支持,script文件如下:
function SetCookie(key, value)
{
// cookies are separated by semicolons
document.cookie = key + "=" + value;
}
function GetCookie(key)
{
// cookies are separated by semicolons
var aCookie = document.cookie.split(";");
for (var i=0; i < aCookie.length; i++)
{
// a name/value pair (a crumb) is separated by an equal sign
var aCrumb = aCookie[i].split("=");
if (key == aCrumb[0])
{
return unescape(aCrumb[1]);
}
}
return null;
}
相关文章推荐
- ASP.NET返回上一页面的实现方法
- .NET 1.1中预编译ASP.NET页面实现原理浅析 [1] 自动预编译机制浅析
- 利用EntLib授权机制实现对ASP.NET页面的自动授权
- Asp.net利用Request属性实现自动返回上次请求页面
- ASP.NET 提供的CaLLBack回调技术实现页面无刷新
- ASP.NET返回上一页面实现方法总结
- .NET 1.1中预编译ASP.NET页面实现原理浅析 [1] 自动预编译机制浅析
- 用asp实现返回上一个页面并刷新的3种方法 (精)
- Asp.net利用Request属性实现自动返回上次请求页面
- ASP.NET页面刷新的几种实现方法
- [ASP.NET]如何点击按钮弹出新窗口,输入数据后返回并刷新页面?(C#代码)
- ASP.NET 页面刷新的实现方法
- ASP.NET之使用Ajax实现页面异步刷新(无需刷新整个页面)
- ASP.NET使用ajax实现分页局部刷新页面功能
- ASP.NET的页面生存周期和ViewState实现机制
- ASP.NET页面刷新的实现方法:
- ASP.NET页面刷新:自动刷新页面的实现方法总结
- .NET1.1中预编译ASP.NET页面实现原理浅析[1]自动预编译机制浅析
- 利用EntLib授权机制实现对ASP.NET页面的自动授权
- ASP.NET页面刷新的实现方法总结