我有一个aspx主/内容页面方案。父页面有一个指向child.aspx的IFrame。 child.aspx有一个复选框,在page.load of child.aspx上,我想显示/隐藏复选框,具体取决于以下逻辑: - 如果直接打开child.aspx,那么我必须显示复选框。 - 如果在IFrame中打开了child.aspx,那么我必须隐藏该复选框。 基本上,我想检查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事件上需要它。如何解决这个问题?
答案 0 :(得分: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包装复选框并隐藏容器以包含标签。
答案 1 :(得分:0)
要做服务器端,我会依赖查询字符串参数。让父页面通过附加?inframe=1
加载子页面。然后在Page_Load
中检查该值。