ASP.NET中如何将iframe弹窗的行值传递到父页面文本框?
实现iframe弹窗GridView行数据传递到父页面文本框的方案
嗨,这个需求其实用前端JavaScript就能轻松搞定,因为iframe和父页面属于同域,直接跨窗口操作元素就行,我给你一步步拆解实现步骤:
步骤1:修改Phone.aspx的GridView按钮,传递行数据
首先要让Choose按钮点击时能拿到当前行的P_SERIAL_NUM和P_STOCK_NUM值,我们可以直接在按钮的OnClientClick事件里绑定数据,同时阻止按钮的服务器回发(因为我们只需要前端操作):
<asp:TemplateField> <ItemTemplate> <asp:Button ID="btnChoose" Text="Choose" OnClientClick='btnChooseClick("<%# Eval("P_SERIAL_NUM") %>", "<%# Eval("P_STOCK_NUM") %>"); return false;' /> </ItemTemplate> </asp:TemplateField>
如果你的字段值可能包含单引号这类特殊字符,建议在后台RowDataBound事件里处理转义,避免JavaScript语法错误:
protected void phoneGrid_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { Button btnChoose = (Button)e.Row.FindControl("btnChoose"); // 获取当前行数据并转义单引号 string serialNum = DataBinder.Eval(e.Row.DataItem, "P_SERIAL_NUM").ToString().Replace("'", "\\'"); string stockNum = DataBinder.Eval(e.Row.DataItem, "P_STOCK_NUM").ToString().Replace("'", "\\'"); // 绑定点击事件 btnChoose.OnClientClick = $"btnChooseClick('{serialNum}', '{stockNum}'); return false;"; } }
步骤2:编写Phone.aspx的JavaScript函数,传递数据到父页面
在Phone.aspx的<script>标签里添加以下函数,通过window.parent访问父页面的DOM元素,把数据设置到对应的文本框中:
function btnChooseClick(serialNum, stockNum) { // 获取父页面的文本框元素(注意FormView控件会生成带前缀的客户端ID) var serialTxt = window.parent.document.getElementById('<%= window.parent.DataInsert.FindControl("txtSerialNum").ClientID %>'); var stockTxt = window.parent.document.getElementById('<%= window.parent.DataInsert.FindControl("txtStockNum").ClientID %>'); // 检查元素存在后设置值 if (serialTxt) { serialTxt.value = serialNum; } if (stockTxt) { stockTxt.value = stockNum; } // (可选)关闭父页面的模态弹窗(假设用的是Bootstrap模态框) var modal = window.parent.document.getElementById('responsive'); if (modal) { $(modal).modal('hide'); } }
如果你的项目是.NET 4.0及以上版本,也可以给文本框设置ClientIDMode="Static",这样客户端ID就和服务器ID一致,简化获取元素的代码:
父页面的文本框修改:
<asp:TextBox ID="txtSerialNum" runat="server" Enabled="false" Text="<%#BindItem.SERIAL_NUM%>" ClientIDMode="Static"></asp:TextBox> <asp:TextBox ID="txtStockNum" runat="server" Enabled="false" Text="<%#BindItem.STOCK_NUM%>" ClientIDMode="Static"></asp:TextBox>
此时JavaScript里可以直接用ID获取:
var serialTxt = window.parent.document.getElementById('txtSerialNum'); var stockTxt = window.parent.document.getElementById('txtStockNum');
关键注意事项
- 同域限制:确保父页面和Phone.aspx属于同一个域名,否则浏览器会阻止跨窗口DOM操作(你的场景肯定满足,都是同一个网站下的页面)。
- FormView状态:要确保父页面的FormView处于已渲染状态(比如处于编辑/插入模式),否则文本框可能还未生成到DOM中,导致获取元素为null。
- 特殊字符处理:一定要处理字段值中的单引号、双引号等特殊字符,避免JavaScript语法错误,后台转义是最稳妥的方式。
内容的提问来源于stack exchange,提问作者T. Rifle
相关产品推荐
相关产品推荐

