2009-09-03 3 views
2

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

Вот пример кода, который я использую:

Global.master

<form id="form1" runat="server"> 
<div> 
    <asp:ContentPlaceHolder id="GlobalContentPlaceHolderBody" runat="server"> 

    </asp:ContentPlaceHolder> 
</div> 
</form> 

Template.master (ребенок Global.master)

<asp:Content ID="TemplateContentBody" ContentPlaceHolderID="GlobalContentPlaceHolderBody" Runat="Server"> 
<asp:Literal ID="MyLiteral1" runat="Server"></asp:Literal> 

<p>This is template sample content!</p> 
    <asp:ContentPlaceHolder ID="TemplateContentPlaceHolderBody" runat="server"> 

</asp:ContentPlaceHolder> 

Template.master.cs

protected void Page_Load(object sender, EventArgs e) 
{ 
    MyLiteral1.Text = "Test"; 
} 

ContentPage.aspx

< asp:Content ID="ContentBody" ContentPlaceHolderID="TemplateContentPlaceHolderBody" Runat="Server"> 
</asp:Content> 

Когда я смогу достичь этого, я также должен быть в состоянии получить доступ к контенту на глобальном, так и шаблон мастер-страниц через контентные страницы.

+0

Какая ошибка вы видите? – MattH

+0

Я не вижу никаких ошибок, но литерал не обновляется. – jpshook

+0

Это может показаться глупым, но вы создаете веб-сайт или веб-приложение? Если позже вы собрали свой сайт, не так ли? –

ответ

1

Найдено рабочее решение. В template.master (вложенный дочерний мастер) мне пришлось поместить код в событие OnLoad.

protected override void OnLoad(EventArgs e) 
{ 
    MyLiteral1.Text= "<p>MyLiteral1 Successfully updated from nested template!</p>"; 
    base.OnLoad(e); 
} 

Очень странно ...

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

Если есть лучший способ достичь этого, я открыт для предложений.

+0

Это способ сделать это. Странно, что это не работает в Page_Load. – Chris

0

EDIT: Это мой ответ, когда я думал, что вы пытаетесь получить доступ к элементу управления дочернего мастера из основного кода родителя.

Вы можете использовать рекурсивную функцию FindControl:

protected Control FindControlRecursive(string id, Control parent) 
{ 
    // If parent is the control we're looking for, return it 
    if (string.Compare(parent.ID, id, true) == 0) 
     return parent; 

    // Search through children 
    foreach (Control child in parent.Controls) 
    { 
     Control match = FindControlRecursive(id, child); 

     if (match != null) 
      return match; 
    } 

    // If we reach here then no control with id was found 
    return null; 
} 

Затем используйте этот код в главной странице:

protected void Page_Load(object sender, EventArgs e) 
{ 
//EDIT: if GlobalContentPlaceHolderBody isn't visible here, use this instead: 
//Control c = FindControlRecursive("MyLiteral1", Page.FindControl("GlobalContentPlaceHolderBody")); 
    Control c = FindControlRecursive("MyLiteral1", GlobalContentPlaceHolderBody); 
    if(c != null) 
     ((Literal)c).Text = "Test"; 
} 
+0

Где я могу поместить защищенный элемент управления FindControlRecursive? Если я добавлю его в Template.master.cs, я получаю ошибку: имя «GlobalContentPlaceHolderBody» не существует в текущем контексте. – jpshook

+0

Для доступа к пользовательскому управлению в мастер-странице с помощью страницы содержимого это было просто. Добавлены следующие к template.master.cs: общественная строка ContentLabelDemoPublic { набор { ContentLabelDemo.Text = значение; }} , а затем на странице контента я мог бы добавить: ((MasterPages_Template) Master) .ContentLabelDemoPublic = «Этикетка на главной странице ребенка экспонируется с использованием общественных переменным обновляются по содержимому страницы»; Доступ к вложенной главной странице с помощью собственного кода не должен быть таким сложным. – jpshook

+0

GlobalContentPlaceHolderBody был идентификатором вашего контейнера. Если это не видно вашему коду, вы можете использовать Page.FindControl («GlobalContentPlaceHolderBody»); – Chris

3

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

Посмотрите на пример this post.

+0

Ваше название типа конфликтов с вашим последним предложением: «... мне также нужно будет иметь доступ к контенту ... через контентные страницы». Ответ, который я предлагаю, охватывает эту ситуацию, если только вы не пытаетесь сделать что-то с мастер-страниц. –

+0

+1 Если все, о чем мы говорим, это доступ к элементу управления на главной странице родителя, директива MasterType - это то, что мы ищем. –

+0

Ahmad, я пытался получить доступ к элементу управления на вложенной главной странице ребенка через собственный код. Исправление заключалось в том, чтобы вызвать его в событии OnLoad. Директива Alexis - MasterType полезна для доступа через страницу контента, а не из самой вложенной главной страницы. – jpshook

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