防止框架页刷新后回到原始页面的问题

来源:互联网 发布:mysql 冷备 编辑:程序博客网 时间:2024/05/01 08:49

假如我们有页面Default.aspx,里面有一个框架:
<iframe id="main" frameborder="0" src="Welcome.aspx"></iframe>,当装载Default.aspx时,默认加载Welcome.aspx页面。

Default.aspx页面上面有很多链接,点击连接后,main.src=”新链接的URL”,也就是说,点击的链接会在框架里显示,Default.aspx不用刷新。

考虑以下情况,当点击Index.aspx后,框架里显示Index.aspx的内容,这时我们点击浏览器的刷新按钮,此时浏览器reload的并不是Index.aspx,而是把Default.aspx重新载入,此时框架页里显示的是Welcome.aspxIndex.aspx丢失。

下面,就这个问题我想出了一个办法,但并不完美。
首先,我们可以通过ASP.NET的页面的Request.RawUrl取得原始的请求路径,例如News.aspx?id=1003。我们要把这个路径保存起来,然后动态改变Default.aspx里的src这个属性。

在Global.aspx(VS2005默认没有这个文件,需要自己创建)的
Application_BeginRequest(Object sender, EventArgs e)
方法里添加一个Application变量,例如:  Application["url"] = Request.RawUrl
当然,取得本次请求路径之前,需要保存上一次的请求路径,这样我们的代码变成了下面的样子
Application["url1"] = Application["url"];
Application["url"] = Request.RawUrl;

然后再在Default.aspx里面的框架中使用这样的代码:
 <iframe id="main" frameborder="0" src="<%=(Application["url1"]=="")?"Welcome.aspx":Application["url1"] %>"></iframe>
首先判断Application["url1"] 是否为空,为空的话显示默认的页面,否则显示上次刷新的页面。
这样有个问题是,如果请求Index.aspx后,Index.aspx里面有包含一些JS或者CSS文件的请求,这样会出现<iframe id="main" frameborder="0" src="XXX.CSS"></iframe>这样的情况,所以我们要在Application["url"] = Request.RawUrl;之前做一个判断,代码如下:

 if (Request.RawUrl.Contains(".aspx")) Application["url"] = Request.RawUrl;

如果请求的是aspx页面才更新Application的变量

不完美的地方是,由于IE会有缓存,当我们点击Index.aspx后,接着点击Index2.aspx,接着又点回Index.aspx,这时虽然浏览器显示的是Index.aspx,单浏览器并没有向服务器提出请求,显示的只是本地缓存,所以如果现在刷新Default.aspx的话,框架页里显示的是Index2.aspx,而不是Index.aspx

暂时想不出什么好办法,可能利用客户端的cookies可以解决问题...