刚刚.Net相关知识技术互动平台(绿色天堂)
.Net知识技术交流、探讨、请教与共享(Visual Studio.Net、Asp.Net、VB/C#、.NetWindows应用程序、Windows服务、Socket通信、GIS、ArcGIS、JavaScript、Sql Server和Oracle等)
posts - 73,  comments - 472,  trackbacks - 38
      看到题目相信大家都已经知道这次要讲述什么内容了。关于Iframe刷页问题在网络中随便一搜索就能找到,我也是这么做的,可是搜索到的结果不一定就是自己的东西,因此我们应该学会总结。在这里我们就来总结一下关于Iframe刷页。
      网络中的论坛或者是博客中大多数都是用的父页A.aspx和子页B.aspx形式来举例子的,这里我们的例子来用三个页面,一个父页A.aspx和两个子页B.aspx、C.aspx,可能大家会觉得,为何要用两个子页呢,用一个子页和两个子页有什么区别呢?因为我们这里要用到从子页C.aspx来刷新子页B.aspx。
      下面先讲解第一种刷新方法:“重新定向到本页”
父页A.aspx的脚本如下:
 1<%@ Page language="c#" Codebehind="A.aspx.cs" AutoEventWireup="false" Inherits="Demo.A" %>
 2<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
 3<HTML>
 4    <HEAD>
 5        <title>A</title>
 6        <meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
 7        <meta content="C#" name="CODE_LANGUAGE">
 8        <meta content="JavaScript" name="vs_defaultClientScript">
 9        <meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
10    </HEAD>
11    <body MS_POSITIONING="GridLayout">
12        <form id="Form1" method="post" runat="server">
13            <iframe id="BIframe" name="BIframe" style="Z-INDEX: 102; LEFT: 0px; WIDTH: 748px; POSITION: absolute; TOP: 0px; HEIGHT: 511px" marginWidth="0" marginHeight="0" src="B.aspx" frameBorder="0" scrolling="no" allowTransparency></iframe>
14            <iframe id="CIframe" name="CIframe" style="Z-INDEX: 105; LEFT: 750px; OVERFLOW: hidden; WIDTH: 254px; POSITION: absolute; TOP: 0px; HEIGHT: 511px" marginWidth="0" marginHeight="0" src="C.aspx" frameBorder="0"    scrolling="no" allowTransparency DESIGNTIMEDRAGDROP="16"></iframe>
15        </form>
16    </body>
17</HTML>
父页A.aspx无后台代码。
子页B.aspx的脚本如下:
 1<%@ Page language="c#" Codebehind="B.aspx.cs" AutoEventWireup="false" Inherits="Demo.B" %>
 2<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
 3<HTML>
 4    <HEAD>
 5        <title>B</title>
 6        <meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
 7        <meta content="C#" name="CODE_LANGUAGE">
 8        <meta content="JavaScript" name="vs_defaultClientScript">
 9        <meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
10        <meta http-equiv="pragma" content="no-cache">
11        <meta http-equiv="Cache-Control" content="no-cache, must-revalidate">
12        <base target="_self">
13        <script language="javascript" type="text/javascript">
14            function RefreshmyForm()
15            {
16                var myForm = document.Form1;
17                myForm.submit();
18            }

19        
</script>
20    </HEAD>
21    <body MS_POSITIONING="GridLayout">
22        <form id="Form1" method="post" runat="server">
23            <div id="LayersDiv" style="FONT-SIZE: 9pt; Z-INDEX: 112; LEFT: 0px; WIDTH: 175px; CURSOR: hand; COLOR: navy; PADDING-TOP: 6px; FONT-STYLE: normal; FONT-FAMILY: 宋体; POSITION: absolute; TOP: 0px; HEIGHT: 26px; TEXT-ALIGN: center; FONT-VARIANT: normal" onclick="LayersDivOnClick();" align="left">Div层显示控制</div>
24            <div id="LayersControlDiv" style="Z-INDEX: 115; LEFT: 0px; VISIBILITY: hidden; WIDTH: 156px; CURSOR: hand; POSITION: absolute; TOP: 26px; HEIGHT: 360px">隐藏的Div层</div>
25        </form>
26        <script language="javascript" type="text/javascript">
27        var myDiv = document.getElementById("LayersControlDiv");
28        function LayersDivOnClick()
29        {
30            if(myDiv.style.visibility == "hidden")
31            {
32                myDiv.style.visibility = "visible";
33            }

34            else
35            {
36                myDiv.style.visibility = "hidden";
37            }

38        }

39        
</script>
40    </body>
41</HTML>
(这里有一个控制Div层显示的JavaScript的方法从第26行开始的,以及第10、11、12行标记是为了去处页面缓存的,当某个aspx页面作为弹出页面或者嵌入在Iframe中的页面而言是需要这三行代码消除页面缓存的,否则呈现的是缓存中的数据页面——不值得一提,但还是提了,呵呵……)
子页B.aspx的后台代码:
主要来关心一下Page_Load事件的代码,其他的在这里省略了
 1        private void Page_Load(object sender, System.EventArgs e)
 2        {
 3            string myStr = String.Empty;
 4            if(!this.Page.IsPostBack)
 5            {
 6                myStr="这是重定向刷新B.aspx页面";
 7                this.Response.Write("<script>alert('" + myStr + "');</script>");
 8            }

 9            else
10            {
11                myStr="这是重载本页后刷新B.aspx页面";
12                this.Response.Write("<script>alert('" + myStr + "');</script>");
13            }

14        }
下面我们在C.aspx页面中放置两个服务器控件“Button”(Button1和Button2),Text属性分别为“重定向B.aspx页面”和“重载B.aspx页面”,那么子页C.aspx的脚本如下:
 1<%@ Page language="c#" Codebehind="C.aspx.cs" AutoEventWireup="false" Inherits="Demo.C" %>
 2<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
 3<HTML>
 4    <HEAD>
 5        <title>C</title>
 6        <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
 7        <meta name="CODE_LANGUAGE" Content="C#">
 8        <meta name="vs_defaultClientScript" content="JavaScript">
 9        <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
10        <meta http-equiv="pragma" content="no-cache">
11        <meta http-equiv="Cache-Control" content="no-cache, must-revalidate">
12        <base target="_self">
13        <script language="javascript" type="text/javascript">
14            function RefreshmyForm()
15            {
16                var myForm = document.Form1;
17                myForm.submit();
18            }

19        
</script>
20    </HEAD>
21    <body MS_POSITIONING="GridLayout">
22        <form id="Form1" method="post" runat="server">
23            <div id="BtnDiv" style="Z-INDEX: 107; LEFT: 0px; WIDTH: 254px; POSITION: absolute; TOP: 0px; HEIGHT: 290px; BACKGROUND-COLOR: #f2f9ff" align="center">
24                <asp:Button id="Button1" runat="server" Width="120px" Text="重定向B.aspx页面"></asp:Button>
25                <asp:Button id="Button2" runat="server" Width="108px" Text="重载B.aspx页面"></asp:Button></div>
26        </form>
27  </body>
28</HTML>
子页C.aspx的后台代码:
主要关心一下Button1的Click事件
1        private void Button1_Click(object sender, System.EventArgs e)
2        {
3            this.Response.Write("<script>window.parent.document.getElementById('BIframe').src='B.aspx';</script>");
4        }
此时启动调试程序(当然将A.aspx设为启动页后调试),点击“Button1”,弹出的消息框永远是“这是重定向刷新B.aspx页面”。

      再来看看第二种刷新方法:“重载页面”
子页C.aspx的后台代码:
主要关心一下Button2的Click事件
1        private void Button2_Click(object sender, System.EventArgs e)
2        {
3            this.Response.Write("<script>window.parent.document.frames.BIframe.RefreshmyForm();</script>");
4        }
这里我们调用了B.aspx页面的JavaScript的一个回传页面的方法RefreshmyForm(),此时启动调试程序,点击“Button2”,弹出的消息框永远是“这是重载本页后刷新B.aspx页面”。

那么有人就会问了,如何在Iframe的页面中来刷新父页面呢?
我们仍然在C.aspx页面中做这个事情,加入“Button3”,Text属性为“重定向A.aspx页面”,C.aspx的脚本代码我们在这里省略。子页C.aspx的后台代码:
主要关心Button3的Click事件
1        private void Button3_Click(object sender, System.EventArgs e)
2        {
3            this.Response.Write("<script>window.parent.location=window.parent.location;</script>");
4        }

      在这里我们讲解了关于从Iframe的一个页面刷新另外一个Iframe页面的两种方法,以及简单说明了如何从Iframe的页面来刷新其所在的父页面。

转载本文说明(以下简称本说明):必须遵守《刚刚网络作品版权声明》,再转载。"本说明、作者、作者博客网址及作者博客坐落,本文中提及的各种说明、备注或附录性文字"必须被转载,且不得改变其原有内容和要表达的意图!
作者:刚刚   作者博客网址:http://lijigang.cnblogs.com/   作者博客坐落在博客园
把握现实生活,培养自身能力
掌握新型技术,提高自我力量

posted on 2007-05-18 21:33 刚刚 阅读(6387) 评论(24)  编辑 收藏 所属分类: JavaScript技术

FeedBack:
2007-05-18 22:24 | 过江      

  回复  引用  查看    
2007-05-19 01:14 | YAO.NET℡      
"看到题目相信大家都已经知道这次要讲述什么内容了。"

还真有人不知道的,象我这般愚钝就算一个.

没明白你的问题描述.比如是为了解决什么问题?



  回复  引用  查看    
#3楼 [楼主]
2007-05-19 02:13 | 刚刚      
@YAO.NET℡
你不明白问题,那是因为你还没有用到Iframe,如果有用到那么你也没使用刷页,否则你看到题目应该知道这个问题!
  回复  引用  查看    
#4楼 [楼主]
2007-05-19 02:15 | 刚刚      
@过江
谢谢支持!
  回复  引用  查看    
2007-05-19 09:24 | 描述不清楚 [未注册用户]
描述不清楚
  回复  引用    
2007-05-19 09:30 | kisskiki [未注册用户]
既然你的代码只是前台的刷新操作,那么直接用html控件就可以,没必要还要postback一下,没必要在后台还写前台的语句
  回复  引用    
2007-05-19 10:19 | king'space [未注册用户]
可以用 全js 来解决


  回复  引用    
2007-05-19 10:26 | zzbird [未注册用户]
很简单的根本不算问题的问题,用了愚蠢的做法来解决
  回复  引用    
2007-05-19 12:04 | 巫云      
vs2005不支持frame,应该怎么解决?
  回复  引用  查看    
2007-05-19 16:16 | birdshome      
直接写html就好了
  回复  引用  查看    
2007-05-19 16:20 | s3      
是不好,JAVASCRIPT完全解决的很好,干吗非要和CS关联起来解决,

不需要把问题返回服务器解决。
  回复  引用  查看    
#12楼 [楼主]
2007-05-19 17:25 | 刚刚      
@描述不清楚 @kisskiki @king'space @zzbird @birdshome @s3

对不起各位了,在本随笔中没有描述清楚,弹出消息框的功能只是为了做刷页验证的,对程序本身毫无意义,如果只用JS来弹出消息框,而不刷页,并不是本随笔要说明的问题;而用其他代码来代替弹出消息框的代码,那么又怎么知道刷页时是“重定向页面”还是“重载页面”呢?
你们说的没有错误,就这个例子本身代码确实可以在JS中就完成。但是一个真正的应用程序难道只是简单的弹出消息框吗?肯定不是这么简单,有时候会需要让Iframe刷页,那么怎么才能刷页呢,这里讲解的是刷页的过程,而并非是弹出消息框的代码,如果仅仅是弹出消息框,那完全不用将页面回传给服务器端,用JS是可以解决,然而这里只是用弹出消息框来说明刷页的两种方法的不同,不知道各位是否明白了。
这里还需要说明的是C.aspx页面中的三个Button为什么要用服务器控件呢,那是因为我们在刷新B.aspx页面时不仅仅只是这个例子中的所说的那一条让B.aspx页面刷页的语句,有可能还需要在服务器端做其他的事情,比如读取数据库数据,并将有用的ID或者其他条件传递给某个Session等,然后才会去刷新B.aspx页面,B.aspx页面需要我们前面的ID或者Session中的值。而这里也不一定非要用服务器控件的Button的单击事件,也可以是一个DataGrid的单击或双击事件触发这一系列的事情。
关键是:这里讲述的是Iframe刷页问题,而并非使用弹出消息框的方法,弹出消息框只是对刷页问题的一种验证,你可以写其他代码来代替。

最后要说明的一点是:你可以只用客户端的来触发Iframe刷页(当然这是两个子页面之间并无后台数据访问等其他情况),也可以像例子中那样用后台事件来触发(当然这是两个子页面之间需要后台数据访问等其他情况),就两种情况而言,显然发送到后台比较复杂些,所以使用这种方式来举例了。编程时会遇到各种情况,至于是哪一种情况要求刷页,要根据实际而定,并不一定要照着例子的方法生搬硬套,需要我们灵活运用!本例子只是说明了其中一种比较复杂的情况。
  回复  引用  查看    
#13楼 [楼主]
2007-05-19 18:42 | 刚刚      
@巫云
Asp.Net2005的document下确实不再支持frames了,那么frames被谁支持呢,我前面也不是很清楚,但是经过研究发现,frames在Asp.Net2005被window支持,所以可以将本随笔中Button2的单击事件代码改为下面的代码,就能在VS.Net2005中运行了,效果是一样的:
1    protected void Button2_Click(object sender, EventArgs e)
2    {
3        this.Response.Write("<script>window.parent.frames.item('BIframe').RefreshmyForm();</script>");
4    }

  回复  引用  查看    
2007-05-21 22:18 | wma [未注册用户]
vs2005不支持frame,应该怎么解决?
  回复  引用    
#15楼 [楼主]
2007-05-22 02:05 | 刚刚      
@wma
请您看一下,您所发评论的上上一个评论。就是我给“@巫云”的评论,就清楚了,谢谢您的支持!
  回复  引用  查看    
#17楼 [楼主]
2007-05-22 10:37 | 刚刚      
@1111111111111111111111111111111111111111
阁下的用户名特别,评论的内容也非常独特。不过仍然感谢您的支持!
  回复  引用  查看    
2007-06-07 10:41 | yangsy      
从技术的角度来说,确实这样是不错!
但是如果从实用性来说,特别的大型网站,如果你嵌入三个以上的iframe,而且这些iframe都是aspx的话,IIS基本上会宕掉
  回复  引用  查看    
#19楼 [楼主]
2007-06-10 18:55 | 刚刚      
@yangsy
我只能说IIS可能会如此,因为本人没有测试过,但即便发生了,也不能完全怪罪于使用了iframe嵌入*.aspx页面,可能还有下面的问题:
首先,如果大型网站嵌入三个iframe就宕掉,那么TomCat会不会如此,WebsPhere又会如何呢?这些是具体性能比较,任何软件都有自己的极限值,而使用iframe也是开发人员很正常的事情,并且不可能保证所有在iframe嵌入的页面是静态页面而不是*.aspx的页面,如果是静态页面也不必劳神去使用iframe来防止刷新问题了。
其次,Web硬件服务器的性能也是影响程序效率的重要因素。
最后,在开发不同需求的项目应该是因地制宜的。
  回复  引用  查看    
2007-08-30 16:57 | zx [未注册用户]
可以在研究一下怎么样再从B页面“重定向刷新到C.aspx页面”。在主页面里,重新对frame的SRC赋值为C.aspx,总是执行不到C.aspx的load函数的
if(!this.Page.IsPostBack)
5 {
6 myStr="这是重定向刷新C.aspx页面";
7 this.Response.Write("<script>alert('" + myStr + "');</script>");
8 }

  回复  引用    
2007-10-11 16:02 | 钢钢      
问一个问题:
子也面a通过框架去刷新子也面b的时候,会弹出警告窗口,这个好象不能屏蔽掉吧?请问如何解决?
  回复  引用  查看    
#22楼 [楼主]
2007-10-12 11:50 | 刚刚      
@钢钢
你是说按照我上面的例子后会有警告窗口吗?可是我的浏览器中并没有出现警告窗口,你浏览器的安全等级是“中”吗?要不在到其他的计算机上打开试试!
  回复  引用  查看    
2007-12-06 16:51 | NDS [未注册用户]
<asp:TableCell>
<a href="knowledgetree.aspx" onclick="javascript:subset();">知识库查询</a>
</asp:TableCell>

function subset(){
window.parent.document.getElementById('manage').setAttribute('src','search.aspx');
}

我用的是这样的方法~
  回复  引用    

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)