2015-10-05 46 views
0

我正在開發一個頁面來管理ASP.NET應用程序中的權限。我想知道它是否存在一種輕鬆列出我網頁的所有控件的方法。列出頁面中應用程序的所有網頁的所有控件

這種方法列出一個下拉列表的所有頁面:

//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

隨着拉斯克拉克的解決方案:

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更好。

提供一些幫助,這裏是一個SO回答有關如何可以找到編譯代碼隱藏:

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

根據您在哪裏如何運行你的代碼,你可能需要考慮您的站點可能儘管如此,並不是完全信任。

+0

我同意你的意見。但首先,我會測試讀取aspx文件作爲XML文件,但它似乎不起作用,有太特殊的字符...所以,我會按照您的意見:)謝謝 –

+0

這將是很好,但HTML/ASPX是 *不* XML,不管它看起來多麼像! –

相關問題