Как получить Список ContentPlaceHolders MasterPage на коде позади? - PullRequest
1 голос
/ 07 сентября 2010

Мне нужно получить список ContentPlaceHolders MasterPage, но свойство

protected internal IList ContentPlaceHolders { get; }

защищен внутри, поэтому мы не можем получить к ним доступ.

Есть ли способ вытащить их из главной страницы (включая Reflection)? Спасибо.

Ответы [ 3 ]

2 голосов
/ 07 сентября 2010

Вы можете рекурсивно перебирать 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 голосов
/ 07 сентября 2010

Если вы не возражаете против использования рефлексии и не рискуете сломать ваше приложение при переходе на более новую версию .NET, это будет работать:

IList placeholderNames =
    typeof(MasterPage).GetProperty("ContentPlaceHolders", 
        BindingFlags.Instance | BindingFlags.NonPublic)
    .GetValue(myMasterPage, null) as IList;
1 голос
/ 08 сентября 2010

В качестве варианта ответа Даниила вы можете написать это как метод расширения на 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;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...