2015-10-05 2 views
0

Я разрабатываю страницу для управления правами в приложении ASP.NET. Я хочу знать, существует ли способ легко перечислить все элементы управления моих страниц.Список всех элементов управления всех веб-страниц приложения на странице

Этот метод перечисляет все страницы в DropDownList:

//I take all aspx and ascx pages from my solution 
foreach (String item in Directory.GetFiles(Server.MapPath("~")). 
        Where(key => key.EndsWith("aspx") || key.EndsWith("ascx"))) 
      { 
       String[] itemSplit = item.Split('\\'); 
       listePages.Items.Add(new ListItem(itemSplit[itemSplit.Length - 1], itemSplit[itemSplit.Length - 1])); 
      } 

И это событие срабатывает, когда пользователь выбирает страницу:

 Page g = (Page)Activator.CreateInstance(Type.GetType(pageName)); 
     foreach (Control c in g.Form.Controls) 
     { 
      this.listeControls.Items.Add(new ListItem(c.ClientID, c.ClientID)); 
     } 

Но это событие вызвало NullReferenceException

Спасибо для вашей помощи.

+0

Я тебя не понял. Вы хотите найти все файлы '.aspx' и' .ascx' из каталога? Или вы пытаетесь это прямо из решения? –

ответ

0

С решением Russ Кларк:

using (StreamReader sr = new StreamReader(System.AppDomain.CurrentDomain.BaseDirectory + pageName + ".designer.cs")) 
      { 
       String line = ""; 

       while ((line = sr.ReadLine()) != null) 
       { 
        if (line.Contains(';')) 
        { 
         String[] tab = line.Split(' '); 
         String nomSplit = tab[tab.Length - 1].Split(';')[0]; 

         this.listeControls.Items.Add(new ListItem(nomSplit, nomSplit)); 
        } 
       } 
      } 

Спасибо, это именно то, что я хочу.

0

Это больше подхода то ответ, но то, что я хотел бы посмотреть на это:

Каждая страница ASPX компилируется в конкретный .net объекта; вы можете увидеть это, посмотрев файл .designer, который создается; он ссылается на каждый элемент управления на странице.

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

Это даст вам список для раскрывающегося списка. Трюк, я думаю, находит правильный объект для проверки с отражением.

Было бы лучше, чем пытаться проанализировать ASPX/ASCX с регулярным выражением.

Чтобы обеспечить некоторую помощь, вот ТАК ответ о том, как вы можете найти скомпилированные CodeBehind:

In an ASP.NET website with a codebehind at what point are the .cs files compiled?

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

+0

Я согласен с тобой. Но во-первых, я бы тестировал файл aspx как файл XML, но кажется, что он не работает, есть слишком специальные символы ... Итак, я буду следовать вашим советам :) Спасибо –

+0

Было бы хорошо, но HTML/ASPX - * не * XML, независимо от того, насколько он похож на него! –

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