You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:40:30