列出页面中应用程序的所有网页的所有控件

时间:2015-10-05 08:13:09

标签: c# asp.net

我正在开发一个页面来管理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

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

这是一种方法,然后是一个答案,但我会看到的是:

每个ASPX页面都被编译成一个特定的.net对象;你可以通过查看创建的.designer文件来看到这个;它引用了页面上的每个控件。

您可以加载该对象并使用反射来获取其每个属性并检查它是否是Control的扩展。

这会为您提供下拉列表。我想,诀窍是找到用反射检查的正确对象。

这肯定比尝试使用正则表达式解析ASPX / ASCX更好。

为了提供一些帮助,这里有一个关于如何找到已编译的CodeBehind的答案:

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

根据您运行代码的方式和位置,您可能需要考虑您的网站可能无法以完全信任的方式运行。

答案 1 :(得分:0)

使用Russ Clarke的解决方案:

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));
                    }
                }
            }

谢谢,这正是我想要的。