无需ajax刷新父页面的控件的值(ie/firefox)(downmoon原创)

在《.net2.0中新增的Substitution控件--动态更新缓存页的部分(也可用于局部刷新) 》一文中,可以局部缓存页面的部分内容,这在.net2.0中是新增的一个功能。
另外一个常见的应用是在Iframe页面中刷新父页面的某个控件(TextBox或Label等)的值。
这里邀月介绍一种简单的做法:在ie8/Firefox3.5下测试通过
共两个页面,一个master.aspx,一个masterdetail.aspx页面。
其中master.aspx的内容如下:


<%@ Page Language="C#" AutoEventWireup="true" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>父页面的控件值由Iframe刷新</title> <mce:script type="text/C#" runat="server"><!-- protected void Page_Load(object sender, EventArgs e) { txtOrgTime.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); } // --></mce:script> </head> <body> <form id="form1" runat="server"> <div> <iframe src="masterdetail.aspx" mce_src="masterdetail.aspx" width="480" height="41" frameborder="0" style="background-color: #EFEFEF" mce_style="background-color: #EFEFEF"> </iframe> </div> <div> 刷新时间: <asp:TextBox ID="txtTime" runat="server" Visible="true" Style="width: 240px; height: 20px;" mce_Style="width: 240px; height: 20px;"></asp:TextBox> <br /> 原始时间: <asp:TextBox ID="txtOrgTime" runat="server" Visible="true" Style="width: 240px; height: 20px;" mce_Style="width: 240px; height: 20px;"></asp:TextBox> </div> </form> </body> </html>

masterdetail.aspx的内容如下:

 

<%@ Page Language="C#" AutoEventWireup="true" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>即将刷新父页面的控件值</title> <mce:script language="javascript" type="text/javascript"><!-- function doReturn(valCurrentTime) { parent.document.forms[0].elements["txtTime"].value = valCurrentTime; } // --></mce:script> <mce:script type="text/C#" runat="server"><!-- protected void btn_Refresh_Click(object sender, EventArgs e) { string m_script = @"<script language=Javascript>doReturn('{0}');<" + @"/script>"; m_script = string.Format(m_script, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")); Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "getTime", m_script); } // --></mce:script> </head> <body> <form id="form1" runat="server"> <div> <asp:Button ID="btn_Refresh" Text="我在IFrame页面刷新父页面的时间" runat="server" OnClick="btn_Refresh_Click"> </asp:Button> </div> </form> </body> </html>



显示效果:





需要注意的是:
如果是在master模板页面或ascx文件的方式,则需要将
 parent.document.forms[ 0 ].elements[ " txtTime " ].value  =  valCurrentTime;
改成
 parent.document.forms[ 0 ].elements[ " 浏览器中源码显示的 input的ID" ].value  =  valCurrentTime;

补充:有朋友提到性能问题:
经测试,当master.aspx页面有2000个TextBox(比如GridView)时,回刷页面确实比较有些延迟。
将上面的脚本改为:

function doReturn2(valCurrentTime) { var ObjectControl = parent.document.getElementById("txtTime"); //alert(ObjectControl); if (null != ObjectControl) { ObjectControl.value = valCurrentTime; } }


发现还是比较慢,不知道有没有更也的解决方案?

你可能感兴趣的:(Ajax,server,XHTML,iframe,button,textbox)