窗口间传递参数学习二(子对话框向父窗口传值)
一.新建父页面Default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!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>
</head>
<body>
<form id="form1" runat="server">
<div>
姓名:<asp:TextBox ID="txtName" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="rfv1" runat="server" ErrorMessage="*"
ControlToValidate="txtName" ValidationGroup="v" />
年龄:<asp:TextBox ID="txtAge" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="rfv2" runat="server" ErrorMessage="*"
ControlToValidate="txtAge" ValidationGroup="v" />
<asp:Button ID="Button1" runat="server" Text="进入赋值页面"/><br />
<asp:Button ID="Button2" runat="server" Text="确定" ValidationGroup="v"/>
</div>
</form>
</body>
</html>
后台代码
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
this.Button1.Attributes.Add("onclick", string.Format(@"javascript:showModalDialog('Child.aspx?formid={0}&&txtName={1}&&txtAge={2}', window,
'dialogWidth:300px; dialogHeight:200px; help:0;center:1;') ;return false;",this.Form.ClientID,this.txtName.ClientID,this.txtAge.ClientID));
//使用"return false"是为了让Button1不回传,如果要回传则不需加
//window对象传入子窗口的dialogArguments中
}
}
}
二.新建子页面Child.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Child.aspx.cs" Inherits="Child" %>
<!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>
<base target="_self" /><%--不然会打开一个新的IE窗口,然后再关掉的,必写--%>
</head>
<body>
<form id="form1" runat="server">
<div>
填写姓名:<asp:TextBox ID="txtName" runat="server"></asp:TextBox><br />
填写年龄:<asp:TextBox ID="txtAge" runat="server"></asp:TextBox>
<asp:Button ID="btnOk" runat="server" Text="确定" onclick="btnOk_Click" />
</div>
</form>
</body>
</html>
后台代码
public partial class Child : System.Web.UI.Page
{
protected void btnOk_Click(object sender, EventArgs e)
{
string formId = Request.QueryString["formid"];
string []controls = {Request.QueryString["txtName"],Request.QueryString["txtAge"]};
string []values = {this.txtName.Text,this.txtAge.Text};
JavascriptHelper.DialogArguments(this.Page, formId, controls, values, false);
}
}
二.App_Code中的类JavascriptHelper.cs
using System;
using System.Web.UI;
using System.Text;
public class JavascriptHelper
{
/// <summary>
/// 关闭当前*对话框*并向父窗口的控件赋值
/// </summary>
/// <param name="P">调用的页面</param>
/// <param name="formname">父窗口客户端的form名称(如:form name="aspnetForm")</param>
/// <param name="controls">父窗口客户端的控件ID数组(如:txtName,txtAge)</param>
/// <param name="values">对应每个控件传达的值的数组</param>
/// <param name="isReload">是否需要刷新父页面</param>
public static void DialogArguments(Page P, string formname, string[] controls, string[] values, bool isReload)
{
if (controls.Length != values.Length)
throw new ArgumentException("controls的长度和values长度必须相等");
StringBuilder js = new StringBuilder();
js.Append("<script language='javascript' type='text/javascript'>");
//dialogArguments属性仅对showModalDialog 和 showModelessDialog 打开的*对话框*可用
for (int i = 0; i < controls.Length; i++)
{
if (string.IsNullOrEmpty(formname))//window对象是当前窗口对象
js.AppendFormat("window.dialogArguments.{0}.value='{1}';", controls[i], values[i]);
else
js.AppendFormat("window.dialogArguments.{0}.{1}.value='{2}';", formname, controls[i], values[i]);
}
js.Append("window.close();");
if (isReload)
js.Append("window.dialogArguments.location.reload();");
js.Append("</script>");
P.ClientScript.RegisterStartupScript(P.GetType(), "onclick", js.ToString());
}
}
三.项目结构图(使用的是VS2008)
四.运行效果图
点击子页面确定按钮后:
五.备注
在IE下正常运行,但在火狐下有问题。