如何在代码隐藏中获取母版页的内容PlaceHolders?

时间:2010-09-07 10:04:08

标签: asp.net reflection c#-4.0

我需要获取MasterPage的ContentPlaceHolders列表,但属性

protected internal IList ContentPlaceHolders { get; }

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

我们有什么方法可以从MasterPage(包括Reflection)中提取它们吗?感谢。

3 个答案:

答案 0 :(得分:2)

如果您不介意使用反射,并且不介意在迁移到较新版本的.NET时应用程序崩溃的风险,这将有效:

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

答案 1 :(得分:2)

您可以递归循环遍历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);             
    }
}

答案 2 :(得分:1)

作为Daniel答案的变体,您可以将其作为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;
        }
    }
}