0

我有一个 aspx 主/内容页面方案。父页面有一个指向 child.aspx 的 IFrame。child.aspx 有一个复选框,在 child.aspx 的 page_load 上,我想根据以下逻辑显示/隐藏该复选框: - 如果 child.aspx 直接打开,那么我必须显示该复选框。- 如果 child.aspx 在 IFrame 中打开,那么我必须隐藏复选框。基本上,我想检查 child.aspx,如果它包含父窗口,则隐藏复选框控件,否则显示它。

我更喜欢在 Page_load 事件的代码隐藏中显示/隐藏代码,因为我必须根据它是否从父窗口打开来执行更多逻辑。

到目前为止,我做了以下事情:在 child.aspx

<asp:Content ID="Content1" ContentPlaceHolderID="Main" Runat="Server">

    <script language="javascript" type="text/javascript">
    function DoesParentExists()
    {
        var bool = (parent.location == window.location)? false : true;
        var HClientID ='<%=hfDoesParentExist.ClientID%>'; 
        document.getElementById(HClientID).Value = bool;
    }        
    </script>
    <div>        
        <h2>Content - In IFrame</h2>
        <asp:HiddenField runat="server" id="hfDoesParentExist" />
        <asp:CheckBox ID="chkValid" runat="server" />
        <asp:ImageButton ID="ImageButton_FillW8Online" ImageUrl="~/images/expand.gif"
        OnClick="btnVerify_Click" runat="server" style="height: 11px" />    
    </div>
</asp:Content>

在 client.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
    Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "DoesParentExists", "DoesParentExists()", true);
    if (hfDoesParentExist.Value == "true")
    {
        chkValid.Visible = false;
    }
}

使用 RegisterClientScriptBlock,我在 JS 中遇到错误。对象 hfDoesParentExist 不存在,因为尚未创建控件。对?我尝试使用 RegisterStartupScript,但在代码隐藏中我总是在隐藏变量中得到 null。我不想使用 on 按钮单击或类似的东西。我只在 page_load 事件上需要它。如何解决问题?

4

2 回答 2

1

这一行:

document.getElementById(HClientID).Value = bool;

应该是:(小写value

document.getElementById(HClientID).value = bool;

此外,您无法在服务器端的当前执行上下文中检查由 javascript 注册回调设置的隐藏字段的值。

我会将逻辑移动到客户端以隐藏或显示复选框。如果确实必须从页面中删除该字段,您也可以使用 javascript 来执行此操作。

function DoesParentExists()
{
    var bool = (parent.location == window.location)? false : true;
    var cehckboxId ='<%=chkValid.ClientID%>'; 
    if(bool){ 
        document.getElementById(cehckboxId).style.display = 'none';
    }
    else {
        document.getElementById(cehckboxId).style.display = 'block';
    }
}    

您可能希望用 div 包装复选框并隐藏容器以包含标签。

于 2011-03-08T16:35:15.653 回答
0

要在服务器端执行此操作,我将依赖查询字符串参数。让父页面通过附加来加载子页面?inframe=1。然后在你的Page_Load.

于 2011-03-08T16:49:20.370 回答