Может ли страница содержимого использовать ContentPlaceHolderID главного родителя своей главной страницы (вложенные главные страницы) - PullRequest
3 голосов
/ 29 сентября 2010

У меня есть 3 уровня вложенных главных страниц и страница содержимого.parent1 - верхний родительский элемент, parent2 - родительский элемент parent3, а parent3 - родительский элемент страницы содержимого.

Я получаю сообщение об ошибке "Cannot find ContentPlaceHolder xxx...", где xxx - это ContentPlaceholder.Он находится в parent2, и страница содержимого пытается заполнить его.

Могут ли страницы содержимого использовать только своих прямых родительских ContentPlaceHolders или они также могут использовать любые из главных страниц более высокого уровня?

Ответы [ 3 ]

1 голос
/ 16 сентября 2011

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

В вашем примере у вас есть Parent1.master:

<div id="content">
    <h1>Lorem Ipsum, from Parent1</h1>
    <asp:ContentPlaceHolder ID="cphContent" runat="server">
        <p>I am default content from Parent1...</p>
    </asp:ContentPlaceHolder>
</div>

И у вас также есть вложенный Parent2.master, который потребляет заполнитель из Parent1:

<asp:Content ContentPlaceHolderID="cphContent" runat="server">
    <h2>I am some specific stuff from Parent2...</h2>
    <asp:ContentPlaceHolder ID="cphContent" runat="server">
        <p>I am default content from within Parent2!</p>
        <p>We want to create another, nested CPH so that Parent3 can use it!</p>
        <p>(It is seemingly OK that we can use the same ID for this CPH<br />
            in Parent2 that we did originally in Parent1.)</p>
    </asp:ContentPlaceHolder>   
</asp:Content>

И теперь Parent3.master может использовать заполнитель из Parent2. (А также предоставьте другой заполнитель для конечной страницы содержимого для потребления!) Вот она:

<asp:Content ContentPlaceHolderID="cphContent" runat="server">
    <h3>Hello from Parent3!</h3>
    <asp:ContentPlaceHolder ID="cphContent" runat="server">
        <p>I am more default text in yet another nested placeholder</p>
    </asp:ContentPlaceHolder>   
</asp:Content>

Ваша отображаемая страница контента будет выглядеть примерно так:

<div id="content">
    <h1>Lorem Ipsum, from Parent1</h1>
    <h2>I am some specific stuff from Parent2...</h2>
    <h3>Hello from Parent3!</h3>
    <p>I am the plugged-in content, from the content page!</p>
</div>

Одна замечательная особенность этого подхода, и почему мы можем захотеть использовать одни и те же имена для этих вложенных CPH по всей цепочке наследования, заключается в том, что ваша конечная страница контента может измениться с использования любой из родительских главных страниц 1–3 без необходимости изменить что-то еще, если они ожидали найти что-то под названием cphContent для потребления.

Хорошо, теперь вы увидели забавную часть, но единственное, что я упомянул, может быть проблема: если вы пытаетесь позволить любому тексту «по умолчанию» просочиться к любому из внуков. Под этим я подразумеваю, что если ваша страница контента не предоставляет никакого Контента для заполнителя "cphContent", то будет использоваться только значение по умолчанию из последней главной страницы. Значение по умолчанию от Parent1.master по существу потеряно за пределами Parent2. (Хотя вы, безусловно, могли бы использовать значение по умолчанию из Parent3.) Возможно, есть способ сделать это программно, но «из коробки», кажется, позволяет вам делать то, что вы просили, если вы можете жить с этим предупреждением.

Удачи!

0 голосов
/ 29 сентября 2010

Получение значений элементов управления на главной странице Во время выполнения главная страница объединяется со страницей содержимого, поэтому элементы управления на главной странице доступны для кода страницы содержимого. (Если главная страница содержит элементы управления в элементе управления ContentPlaceHolder, эти элементы управления недоступны, если они переопределены элементом управления Content со страницы содержимого.) Элементы управления не доступны напрямую как члены главной страницы, поскольку они защищены. Однако вы можете использовать метод FindControl, чтобы найти конкретные элементы управления на главной странице. Если элемент управления, к которому вы хотите получить доступ, находится внутри элемента управления ContentPlaceHolder на главной странице, сначала необходимо получить ссылку на элемент управления ContentPlaceHolder, а затем вызвать его метод FindControl, чтобы получить ссылку на элемент управления.

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

Код Visual Basic Copy 'Получает ссылку на элемент управления TextBox внутри ContentPlaceHolder

Dim mpContentPlaceHolder As ContentPlaceHolder
Dim mpTextBox As TextBox
mpContentPlaceHolder = _
    CType(Master.FindControl("ContentPlaceHolder1"), _
    ContentPlaceHolder)
If Not mpContentPlaceHolder Is Nothing Then
    mpTextBox = CType(mpContentPlaceHolder.FindControl("TextBox1"), _
        TextBox)
    If Not mpTextBox Is Nothing Then
        mpTextBox.Text = "TextBox found!"
    End If

Поскольку вы хотите найти местозаполнитель вложенного контента, вам, возможно, придется найти родителя, а затем использовать этот экземпляр для поиска дочернего элемента

0 голосов
/ 29 сентября 2010

Я считаю, что контентные страницы могут использовать только ContentPlaceHolder прямого родителя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...