代码之家  ›  专栏  ›  技术社区  ›  Jronny

如何获取代码隐藏的母版页的内容占位符列表?

  •  1
  • Jronny  · 技术社区  · 15 年前

    我需要得到母版页的ContentPlaceholders列表,但是属性

    protected internal IList ContentPlaceHolders { get; }
    

    内部受保护,因此我们无法访问它们。

    我们有没有办法把它们从母版页上拉出来(包括反射)?谢谢。

    3 回复  |  直到 15 年前
        1
  •  2
  •   Steven    15 年前

    如果您不介意使用反射,也不介意在迁移到.NET的较新版本时应用程序损坏的风险,这将起作用:

    IList placeholderNames =
        typeof(MasterPage).GetProperty("ContentPlaceHolders", 
            BindingFlags.Instance | BindingFlags.NonPublic)
        .GetValue(myMasterPage, null) as IList;
    
        2
  •  2
  •   Daniel Lee    15 年前

    您可以通过master.controls递归循环,并检查每个控件是否属于contentplaceholder类型。

    private readonly IList<ContentPlaceHolder> _contentPlaceHolders = new List<ContentPlaceHolder>();
    private void FindContentPlaceHolders(ControlCollection controls)
    { 
        foreach(Control control in controls)
        {
            if (control is ContentPlaceHolder)
            {
                _contentPlaceHolders.Add((ContentPlaceHolder) control);
                return;
            }
            FindContentPlaceHolders(control.Controls);             
        }
    }
    
        3
  •  1
  •   Steven    15 年前

    作为丹尼尔答案的变体,您可以将其作为扩展方法写在 MasterPage :

    public static IEnumerable<ContentPlaceHolder>
        GetContentPlaceHolders(this MasterPage master)
    {
        return GetAllControlsInHierarchy(master)
            .OfType<ContentPlaceHolder>();
    }
    
    private static IEnumerable<Control> GetAllControlsInHierarchy(
        Control control)
    {
        foreach (var childControl in control.Controls)
        {
            yield return childControl;
    
            foreach (var childControl in
                GetAllControlsInHierarchy(childCOntrol))
            {
                yield return childControl;
            }
        }
    }
    
    推荐文章