Получить список элементов управления для каждой веб-формы в сборке - PullRequest
0 голосов
/ 12 августа 2011

Можно ли получить простой текстовый список элементов управления, которые присутствуют в веб-форме с помощью отражения? В основном, коллега ищет список элементов управления, чтобы помочь определить стратегию валидации, например, в общем, номера продуктов должны быть числовыми, но на некоторых экранах они могут быть буквенно-цифровыми. Я думал, что было бы просто использовать отражение, чтобы сгенерировать список чего-то вроде:

AddProduct.aspx
     txtProductNumber
     txtProductName
     etc.

Я могу получить имена форм, но пока не содержащиеся в них элементы управления. Текущий код выглядит так:

Assembly assembly = Assembly.LoadFrom(@"Filename.dll");
Type[] types = assembly.GetExportedTypes();
for (int i = 0; i < types.Length; i++)
{
    Page page = (Page)assembly.CreateInstance(types[i].FullName);
    ControlCollection controls = page.Controls;
    // At this point controls.Count = 0 presumably because the controls are defined as protected.
}


Assembly.CreateInstance имеет несколько перегрузок. Например, если я изменю строку назначения страницы на

Page page = (Page) assembly.CreateInstance (types [i] .ullName, true, BindingFlags.NonPublic, null, null, null, null);

тогда я получаю ошибку об отсутствующем конструкторе.

Так я полностью пошел по неверному пути или то, что я пытаюсь сделать, вообще возможно? Любая помощь очень ценится.

Редактировать: Извините за задержку ответа на этот вопрос. Мы немного расширили использование Assembly.GetCallingAssembly () для генерации списка, но он все еще не вполне соответствовал нашим потребностям. В конце мы использовали более многословный подход Find in Complete.

Ответы [ 2 ]

2 голосов
/ 12 августа 2011

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

Если это единственный веб-сайт, который использует элементы управления asp.net, вам может быть лучше просто выполнить «Поиск в файлах» для префикса тега ».

1 голос
/ 12 августа 2011

Мне кажется, что вы ищете элементы управления, созданные во время выполнения. Если вы хотите найти эти элементы управления во время выполнения, вы можете, как с отражением, так и (в зависимости от контейнера) другими средствами. Это следует сделать в событии Page_Unload, где большинство элементов управления будут загружены и по-прежнему доступны.

Но если вы пытаетесь найти эти элементы управления без обработки ваших страниц в течение жизненного цикла запроса страницы, это может быть пугающим. В этом случае простое создание страницы с CreateInstance (или «новой») не запустит Page_Load, Page_Init или любое другое событие. Он будет только запускать код в конструкторе (который, как вы выяснили, защищен, это не значит, что вы не можете создать его экземпляр, но выполнение этой проблемы даст вам немного).

...