2010-09-24 3 views
3

Я ищу способ динамической загрузки главной страницы, чтобы получить коллекцию ContentPlaceHolders внутри.Найти ContentPlaceHolders на главной странице

Я бы предпочел не загружать объект страницы, чтобы назначить главную страницу, прежде чем я получу доступ к ее элементам управления, но если это единственный способ, я буду рад использовать его. Это так, как я надеялся, что это будет работать:

 Page page = new Page(); 
     page.MasterPageFile = "~/home.master"; 
     foreach (Control control in page.Master.Controls) 
     { 
      if (control.GetType() == typeof(ContentPlaceHolder)) 
      { 
       // add placeholder id to collection 
      } 
     } 

Но page.Master бросает пустую ссылку исключение. Похоже, что он загружается в какой-то момент, когда фактическая страница была создана в жизненном цикле страницы.

Я даже подумал о динамическом изменении MasterPageFile текущей страницы на странице_Init(), прочитав все ContentPlaceHolders, а затем вернул оригинал MasterPageFile, но это было бы ужасно!

Есть ли способ загрузить главную страницу в память независимо от фактической страницы, чтобы я мог получить доступ к ее свойствам?

В конечном итоге, мой последний вариант, вероятно, потребует анализа содержимого главной страницы для ContentPlaceHolders, что не так элегантно, но может быть немного быстрее.

Кто может помочь? Большое спасибо.

ответ

1

Вы должны иметь возможность использовать LoadControl для загрузки главной страницы для перечисления коллекции Controls.

var site1Master = LoadControl("Site1.Master"); 

Чтобы найти элементы управления контентом, вам потребуется рекурсивно искать коллекцию Controls. Вот быстрый и грязный пример.

static class WebHelper 
{ 
    public static IList<T> FindControlsByType<T>(Control root) 
    where T : Control 
    { 
    List<T> controls = new List<T>(); 
    FindControlsByType<T>(root, controls); 
    return controls; 
    } 

    private static void FindControlsByType<T>(Control root, IList<T> controls) 
    where T : Control 
    { 
    foreach (Control control in root.Controls) 
    { 
     if (control is T) 
     { 
     controls.Add(control as T); 
     } 
     if (control.Controls.Count > 0) 
     { 
     FindControlsByType<T>(control, controls); 
     } 
    } 
    } 
} 

выше можно использовать следующим образом

// Load the Master Page 
    var site1Master = LoadControl("Site1.Master"); 

    // Find the list of ContentPlaceHolder controls 
    var controls = WebHelper.FindControlsByType<ContentPlaceHolder>(site1Master); 

    // Do something with each control that was found 
    foreach (var control in controls) 
    { 
    Response.Write(control.ClientID); 
    Response.Write("<br />"); 
    } 
+0

Отлично, это именно то, что я пытался сделать и в гораздо более изящным способом. Благодаря! –

+0

@GarryM, я получил некоторое время и немного очистил код. –

Смежные вопросы