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

Asp.net 如何获取代码隐藏母版页的内容占位符列表?,asp.net,reflection,c#-4.0,Asp.net,Reflection,C# 4.0,我需要获取母版页的内容占位符列表,但是属性 protected internal IList ContentPlaceHolders { get; } 是受内部保护的,因此我们无法访问它们 我们有没有办法把它们从母版页上拉出来(包括反射)?谢谢。如果您不介意使用反射,也不介意迁移到较新版本的.NET时应用程序中断的风险,那么这将起作用: IList placeholderNames = typeof(MasterPage).GetProperty("ContentPlaceHolder

我需要获取母版页的内容占位符列表,但是属性

protected internal IList ContentPlaceHolders { get; }
是受内部保护的,因此我们无法访问它们


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

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

IList placeholderNames =
    typeof(MasterPage).GetProperty("ContentPlaceHolders", 
        BindingFlags.Instance | BindingFlags.NonPublic)
    .GetValue(myMasterPage, null) as IList;

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

IList placeholderNames =
    typeof(MasterPage).GetProperty("ContentPlaceHolders", 
        BindingFlags.Instance | BindingFlags.NonPublic)
    .GetValue(myMasterPage, null) as IList;

您可以递归地遍历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);             
    }
}
private readonly IList\u contentPlaceHolders=new List();
私有void FindContentPlaceHolders(控件集合控件)
{ 
foreach(控件中的控件)
{
if(控件为ContentPlaceHolder)
{
_添加((ContentPlaceHolder)控件);
回来
}
FindContentPlaceHolder(control.Controls);
}
}

您可以递归地遍历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);             
    }
}
private readonly IList\u contentPlaceHolders=new List();
私有void FindContentPlaceHolders(控件集合控件)
{ 
foreach(控件中的控件)
{
if(控件为ContentPlaceHolder)
{
_添加((ContentPlaceHolder)控件);
回来
}
FindContentPlaceHolder(control.Controls);
}
}

作为Daniel答案的变体,您可以将其作为扩展方法写在
母版上

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;
        }
    }
}
公共静态IEnumerable
GetContentPlaceHolders(此母版页母版)
{
返回GetAllControlsInHierarchy(主控)
.of type();
}
私有静态IEnumerable GetAllControlsInHierarchy(
(控制)
{
foreach(control.Controls中的var childControl)
{
收益控制;
foreach(var-childControl)
GetAllControlsInHierarchy(childCOntrol))
{
收益控制;
}
}
}

作为Daniel答案的变体,您可以将其作为扩展方法写在
母版上

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;
        }
    }
}
公共静态IEnumerable
GetContentPlaceHolders(此母版页母版)
{
返回GetAllControlsInHierarchy(主控)
.of type();
}
私有静态IEnumerable GetAllControlsInHierarchy(
(控制)
{
foreach(control.Controls中的var childControl)
{
收益控制;
foreach(var-childControl)
GetAllControlsInHierarchy(childCOntrol))
{
收益控制;
}
}
}

但这比反射风险小。可能Master.Controls.Cast()。其中(a=>a是ContentPlaceHolder)。选择(a=>(ContentPlaceHolder)a也会起作用。=)我在一个旧的webforms项目(.NET3.5)上用一个带有两个ContentPlaceholder的母版页对它进行了测试,它对我很有效。我将Master.Controls传递给FindContentPlaceHolders方法。我注意到ContentPlaceholder没有直接包含在Master.Controls集合中。它们嵌套在层次结构的更底层,但这比反射风险小。可能Master.Controls.Cast()。其中(a=>a是ContentPlaceHolder)。选择(a=>(ContentPlaceHolder)a也会起作用。=)我在一个旧的webforms项目(.NET3.5)上用一个带有两个ContentPlaceholder的母版页对它进行了测试,它对我很有效。我将Master.Controls传递给FindContentPlaceHolders方法。我注意到ContentPlaceholder没有直接包含在Master.Controls集合中。它们嵌套在层次结构的更底层。也感谢您的警告。=)也谢谢你的警告。=)别忘了标记你最喜欢的答案。别忘了标记你最喜欢的答案。