如何判断是否已在MVC中填充了asp:ContentPlaceHolder?

时间:2009-06-08 10:35:59

标签: asp.net asp.net-mvc master-pages

我有一个带有内容控件的母版页。如果使用了特定的内容占位符,我希望它在加载期间执行特定的操作。

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 个答案:

答案 0 :(得分:6)

我只是通过检查myContent.Controls.Count来做到这一点。但是,您显然需要考虑可能添加的任何默认控件。

例如,如果您将内容占位符定义为:

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

然后您将在包含“\ r \ n”的控件集合中获得LiteralControl(因为解析了定义中的换行符)。

所以,如果你删除它并定义为:

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

然后你可以在主页加载中进行检查:

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

确保您测试代码以确保您实际检查内容页面添加的内容,而不是主机中定义的任何默认内容。

<强>更新

编辑说这个问题只是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 :(得分:1)

必须检查Holder中是否有任何控件类型不是LiteralControl

私人布尔GetVisible         {             得到             {                 foreach(在cphAdminMenu.Controls中控制ctrl)                 {                     如果(!ctrl.GetType()。toString()方法。包含( “LiteralControl”))                         返回true;                 }                 返回false;             }         }

myControl.Visible = GetVisible;

相关问题