2012-04-25 37 views
2

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

Deppending上我想显示/类型隐藏面板。控制本身未在主页面中引用,而是通过CMS系统动态引用。

我想使用的FindControl用户控件找到在母版页面板控制。我尝试过不同的方法,但都返回null。

在主页的内容的占位符是 ASP:内容RUNAT = “服务器” ContentPlaceHolderID = “PHMainBlock”

和控制称为 ASP:面板ID = “NormalUser” RUNAT = “服务器”

我已经使用的代码试图....

Panel ph = (Panel)Page.Master.FindControl("NormalUser"); 
ph.Visible = false; 

但带回空,任何帮助吗?

感谢..

+0

将类名设置为您的控件并通过类属性进行搜索?现在注册StartUp Script并访问相同的功能。 – Pankaj 2012-04-25 13:24:11

回答

0

一种方法是使用JavaScript来解决这个问题(jQuery的):

$('.NormalUser').hide(); 

​​

+0

这不是一个好主意。首先,它不会降低非Javascript用户的性能。其次,即使对于JavaScript用户,它也会暴露在不适合当前用户的源URL中。 – 2012-04-25 16:36:07

4

你可以在你创建一个公共属性母版页即

public bool ShowPanel 
{ 
    set 
    { 
     NormalUser.Visible = value; 
    } 
} 

,并调用它像这样

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

由于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; 
} 

http://msdn.microsoft.com/en-us/library/xxwa0ff0.aspx

0

以下是我做同样的事情,它工作正常:

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); 
} 

不过,我有 “MessagePanel” 和 “MessageForUser” 作为控制权的ContentPlaceHolder以上。这里是我的标记:

<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。