场景:我有一个asp.net网站,我在页面加载时显示一个div弹出窗口,用于获取一些用户详细信息。当用户输入详细信息或关闭弹出窗口时,我设置了一个标志cookie,以便不再为用户显示弹出窗口。 div位于MasterPage中,因此无论用户第一次登陆哪个页面,它都会显示。 div包含一个UpdatePanel,它具有获取详细信息所需的所有控件。整个功能都运行良好。
问题:现在这个div弹出窗口没有显示(通过设置display:none)后续回发(我想要的),但是html标记仍在加载,页面不必要地添加到页面大小。我想要做的是:检查是否设置了标志cookie。如果不是,请显示弹出窗口,否则从页面中删除弹出窗口的标记。
既然div不是服务器控件,我不可能删除它及其中的所有控件。所以,我想从页面中删除UpdatePanel:
protected void Page_Load(object sender, EventArgs e)
{
if (Request.Cookies["flag"] != null)
{
if (Page.Controls.Contains(updpnl_contact))
{
Page.Controls.Remove(updpnl_contact);
updpnl_contact.Dispose();
}
}
}
但我想这只适用于动态添加的控件,并且由于控件是在设计时添加的,因此不会被删除。
有什么方法可以实现这个目标吗?
答案 0 :(得分:2)
如果您向runat="server"
元素添加<div>
属性,则将在代码隐藏中可用。你也需要一个id
。然后,您只需切换Visible
属性即可。如果此属性为false
,则控件将不会呈现给客户端(即没有HTML标记)。
答案 1 :(得分:1)
您尝试做的事情根本不是通常的工作流程。我倾向于认为它不会起作用,因为它会弄乱控制树,甚至可能破坏视图状态等等。
作为一种可能的解决方案,您可以将其隐藏在后面的代码中。与通常的“直觉”相反,这不像css propery'display:none'那样工作 - 相反,当控件不可见时,控件甚至不会被渲染到页面中。这可能是您的解决方法。
快乐的编码。
答案 2 :(得分:1)
更有效的方法是将面板创建为UserControl,并在需要时在代码隐藏中动态加载,然后将其添加到您的页面。例如,代码:
MyPopupControl popup = (MyPopupControl)Page.LoadControl("/path/to/usercontrol.ascx");
PopupPanel.Controls.Add(popup);
PopupPanel为空<asp:Panel>
。然后,除非需要,否则甚至不需要加载/处理标记。
您用于显示和处理此面板的所有代码都没有理由不在用户控件中,而是将其与母版页隔离。
答案 3 :(得分:0)
您可以根据Cookie设置动态构建面板吗?