C# 访问ascx文件中的母版页控件

C# 访问ascx文件中的母版页控件,c#,asp.net,controls,C#,Asp.net,Controls,我有一个母版页文件,在2个面板控件中包含2个菜单。 我还使用一个控件来检查用户是否登录并获取用户类型 取消挂起我要显示/隐藏面板的类型。控件本身不在母版页中引用,而是通过CMS系统动态引用 我想在用户控件中使用findcontrol在母版页中查找panel控件。我尝试过不同的方法,但都返回null 母版页中的内容占位符为 asp:Content runat=“server”contentplaceholder id=“PHMainBlock” 控件被称为 asp:Panel ID=“Normal

我有一个母版页文件,在2个面板控件中包含2个菜单。 我还使用一个控件来检查用户是否登录并获取用户类型

取消挂起我要显示/隐藏面板的类型。控件本身不在母版页中引用,而是通过CMS系统动态引用

我想在用户控件中使用findcontrol在母版页中查找panel控件。我尝试过不同的方法,但都返回null

母版页中的内容占位符为 asp:Content runat=“server”contentplaceholder id=“PHMainBlock”

控件被称为 asp:Panel ID=“NormalUser”runat=“server”

我试过使用代码

Panel ph = (Panel)Page.Master.FindControl("NormalUser");
ph.Visible = false;
但是带回来的是空的,有什么帮助吗


谢谢..

一种方法是使用javascript(jquery)解决此问题:


您可以在母版页中创建公共属性,即

public bool ShowPanel
{
    set
    {
        NormalUser.Visible = value;
    }
}
这样称呼它

if (Page.Master is NameOfMasterPage)
{
    ((NameOfMasterPage)Page.Master).ShowPanel = false;
}

由于Panel控件位于ContentPlaceHolder控件内,因此必须首先获取对ContentPlaceHolder的引用,然后使用其FindControl方法定位TextBox控件

ContentPlaceHolder mpContentPlaceHolder;
Panel pn;
mpContentPlaceHolder = (ContentPlaceHolder)Master.FindControl("PHMainBlock");
if(mpContentPlaceHolder != null)
{
    pn = (Panel) mpContentPlaceHolder.FindControl("NormalUser");
    pn.Visible = false;
}

以下是我做类似事情的方法,效果很好:

if (Page.Master != null)
{
    var tempPanel = Page.Master.FindControl("MessagePanel") as UpdatePanel;
    if (tempPanel != null)
        tempPanel.Visible = true;


    var temp = Page.Master.FindControl("MessageForUser") as MessageToUser;
    if (temp != null)
        temp.PostWarningMessage(message, msgInterval);
}
但是,我在ContentPlaceHolder的正上方有“MessagePanel”和“MessageForUser”作为控件。以下是我的标记:

<asp:UpdatePanel runat="server" Visible="true" ID="MessagePanel" >
    <ContentTemplate>
        <msg:MainMessage ID="MessageForUser" runat="server" Visible="true" />  
        <br />
    </ContentTemplate>
</asp:UpdatePanel>
<asp:ContentPlaceHolder ID="cphContent" runat="server" Visible="true">              
</asp:ContentPlaceHolder>



如果您的面板位于标记内,那么您应该能够在不需要Page.Master.FindControl的情况下引用面板。

将类名设置为您的控件,并通过class属性进行搜索?现在注册启动脚本并访问函数来执行同样的操作。这不是一个好主意。首先,对于非Javascript用户,它不会降级。其次,即使对于Javascript用户,它也会在源URL中公开不适用于当前用户的URL。
<asp:UpdatePanel runat="server" Visible="true" ID="MessagePanel" >
    <ContentTemplate>
        <msg:MainMessage ID="MessageForUser" runat="server" Visible="true" />  
        <br />
    </ContentTemplate>
</asp:UpdatePanel>
<asp:ContentPlaceHolder ID="cphContent" runat="server" Visible="true">              
</asp:ContentPlaceHolder>