2012-04-25 4 views
2

У меня есть файл главной страницы, содержащий 2 меню в двух панельных элементах управления. Я также использую элемент управления, чтобы проверить, зарегистрирован ли пользователь и получить тип пользователя.Доступ к управлению главной страницей в файле ascx

В зависимости от типа, который я хочу показать/скрыть панель. Сам элемент управления не упоминается на главной странице, но динамически через систему CMS.

Я хочу использовать findcontrol в пользовательском элементе управления, чтобы найти панель управления на главной странице. Я пробовал разные методы, но все возвращаются с нулевым значением.

Заполнитель содержание в главной странице ASP: Содержимое Runat = "сервер" ContentPlaceHolderID = "PHMainBlock"

и контроль называется осины: Панель ID = Runat "NormalUser" = "сервер"

Я попытался с помощью кода ....

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

но возвращает нуль, любая помощь?

спасибо ..

+0

Задайте имя класса своему элементу управления и найдите его через атрибут класса? Теперь зарегистрируйте скрипт StartUp и получите доступ к функции, чтобы сделать то же самое. – Pankaj

ответ

0

Одним из способов было бы решить эту проблему с помощью JavaScript (JQuery):

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

http://api.jquery.com/hide/

+0

Это не очень хорошая идея. Во-первых, он не деградирует для пользователей, не являющихся Javascript. Во-вторых, даже для пользователей Javascript он будет отображаться в исходных URL-адресах, которые не предназначены для текущего пользователя. –

4

Вы можете создать общественную собственность в вас Master Page т.е.

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.

Смежные вопросы