您的位置:首页 > 编程语言 > ASP

最优化实现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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: