Как получить доступ к коллекции элементов управления динамически загружаемой страницы ASPX? - PullRequest
1 голос
/ 27 июня 2009

Допустим, у меня есть две веб-формы: A.aspx и B.aspx , где B.aspx содержит несколько простых веб-элементов управления, таких как текстовое поле и кнопка.

Я пытаюсь сделать следующее:

Когда запрашивается A.aspx, Я хочу динамически вызывать и загружать B.aspx в память и выводить детали всех элементов управления, содержащихся в B.aspx.

Вот что я пробовал в коде для A.aspx:

var compiledType = BuildManager.GetCompiledType("~/b.aspx");
if (compiledType != null)
{
  var pageB = (Page)Activator.CreateInstance(compiledType);
}

foreach (var control in pageB.Controls)
{
    //output some details for each control, like it's name and type...
}

Когда я пытаюсь выполнить приведенный выше код, коллекция элементов управления для pageB всегда пуста.

Любые идеи о том, как я могу заставить это работать?

Некоторые другие важные детали:

  • обе веб-формы используют главную страницу (поэтому веб-элементы управления в b.aspx фактически помещаются в тег "content")
  • Я также пытался использовать BuildManager.CreateInstanceFromVirtualPath . Не повезло.

Ответы [ 2 ]

0 голосов
/ 27 июня 2009

Я действительно думаю, что вы должны предоставить больше информации о том, что вы пытаетесь сделать. HttpServerUtility :: Execute (String, TextWriter) выполнит страницу и запишет результат в предоставленный объект TextWriter. Оттуда вы можете просмотреть содержимое страницы, и если итоговый HTML-документ будет правильно сформирован, вы даже сможете просмотреть его структуру с помощью API .NET XML.

По какой причине вы хотите получить доступ к коллекции элементов управления выполненной страницы?

0 голосов
/ 27 июня 2009

Всякий раз, когда я делал что-то подобное, мне всегда приходилось использовать Page.FindControl или Control.FindControl.

К сожалению, нет рекурсивной версии FindControl. Однако в этом блоге предлагает функцию FindControlRecursive. С его помощью вы можете перебирать все элементы управления в контейнере (включая, по-видимому, ваш PageB).

private Control FindControlRecursive(Control root, string id) 
{ 
    if (root.ID == id)
    { 
        return root; 
    } 

    foreach (Control c in root.Controls) 
    { 
        Control t = FindControlRecursive(c, id); 
        if (t != null) 
        { 
            return t; 
        } 
    } 

    return null; 
} 
...