Как я могу узнать, был ли заполнен asp: ContentPlaceHolder в MVC? - PullRequest
4 голосов
/ 08 июня 2009

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

APageWithContent.aspx

<asp:Content ContentPlaceHolderID="myContent" runat="server">
    <div>hello world!</div>
</asp:Content>

MasterPage.aspx

<asp:ContentPlaceHolder ID="myContent" runat="server" />

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

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

MasterPage.aspx.cs

void Page_Init( object sender, EventArgs e )
{
    if( /* myContent is populated */ )
        //do something
}

Кто-нибудь знает, как это различить?

В WebForms вы можете проверить элементы управления:

myContent.Controls.Count > 0

Но для представлений MVC это всегда равно 0.

Ответы [ 2 ]

6 голосов
/ 08 июня 2009

Я сделал это, просто проверив myContent.Controls.Count. Однако вам, очевидно, нужно принять во внимание любые элементы управления по умолчанию, которые можно добавить.

Например, если ваш заполнитель контента определен как:

<asp:ContentPlaceHolder ID="myContent" runat="server">
</asp:ContentPlaceHolder>

Тогда вы получите LiteralControl в коллекции элементов управления, содержащей "\ r \ n" (так как разрыв строки в определении анализируется).

Итак, если вы удалите это и определите как:

<asp:ContentPlaceHolder ID="myContent" runat="server"></asp:ContentPlaceHolder>

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

if (myContent.Controls.Count > 0)
// do stuff when populated with content..

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

UPDATE

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

Можете ли вы опубликовать пример кода того, что у вас есть?

К вашему сведению - вот [рабочий] код:

Site.Master

<asp:ContentPlaceHolder ID="myContent" runat="server"></asp:ContentPlaceHolder>

<% if (myContent.Controls.Count > 0) { %>
    <b>Content Added!</b>
<% } %>

index.aspx

<asp:Content ContentPlaceHolderID="myContent" ID="myContent" runat="server">
This will render and the "Content Added!" will also be rendered.
</asp:Content>

<%-- This will cause the "Content Added!" to be displayed but with no visual content --%>
<asp:Content ContentPlaceHolderID="myContent" ID="myContent" runat="server">
</asp:Content>

<%-- This will NOT render the "Content Added!" since there is zero content between tags --%>
<asp:Content ContentPlaceHolderID="myContent" ID="myContent" runat="server"></asp:Content>
1 голос
/ 11 августа 2009

Необходимо проверить, есть ли в держателе какие-либо элементы управления, тип которых не является LiteralControl

приватный бул GetVisible { получить { foreach (Управление ctrl в cphAdminMenu.Controls) { если (! ctrl.GetType (). ToString (). Содержит ( "LiteralControl")) вернуть истину; } вернуть ложь; } }

myControl.Visible = GetVisible;

...