【问题标题】:Master page needs to know if a ContentPlaceHolder hasn't been used by current content page母版页需要知道当前内容页是否未使用 ContentPlaceHolder
【发布时间】:2010-08-13 00:38:14
【问题描述】:

我有一个包含多个 ContentPlaceHolder 的母版页。并非所有这些都被当前内容页面一直使用。在页面呈现期间,当当前内容页面未使用 ContentPlaceHolder 时,母版页需要设置一个属性。这意味着内容页面可能不会引用 ContentPlaceHolder。

母版页迭代其 ContentPlaceHolders 并找出当前内容页未使用哪些内容的最佳方式是什么?寻找不涉及从内容页面到母版页面的任何通信的解决方案。

【问题讨论】:

    标签: asp.net


    【解决方案1】:

    在 MasterPage 的 PreRender 事件中执行此操作 - 到页面循环中的这个时候,所有控件都将被创建。

    YourMasterPage.master.cs
    
    protected void Page_PreRender(...) {
        HidePlaceholders(this);
    }
    
    protected void HidePlaceholders(Control control)
    {
         foreach (Control ctrl in control.Controls)
         {
             if (ctrl is ContentPlaceHolder)
             {
                if (ctrl.Controls.Count == 0)
                {
                    ctrl.Visible = false;
                }
    
             }
             else
             {
                if (ctrl.Controls.Count > 0)
                {
                    HidePlaceholders(ctrl);
                }
             }
    
         }
    }
    

    【讨论】:

    • ContentPlaceHolders 不应包含任何类型的空格
    • 然后你需要在填充它们时处理它。控件不能做所有事情:)
    【解决方案2】:

    是否有理由不在您的占位符中使用默认内容?像这样:

    <!-- Site.Master -->
    <asp:ContentPlaceHolder ID="SomeCotnent">
        <p>Content here will only appear if it's not overridden in content pages</p>
    </asp:ContentPlaceHolder>
    

    【讨论】:

    • 这些内容占位符包含在包含其他 html 元素的面板(或 div)中。如果不使用每个 contentplaceholder,它应该是不可见的,以免渲染任何这些额外的 html 元素。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    相关资源
    最近更新 更多