Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 列出页面中应用程序的所有网页的所有控件_C#_Asp.net - Fatal编程技术网

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

C# 列出页面中应用程序的所有网页的所有控件,c#,asp.net,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") || k

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


感谢您的帮助。

这是一种方法,而不是答案,但我要看的是:

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

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

这将为您的下拉列表提供一个列表。我想,诀窍在于找到合适的物体进行反射检查

这肯定比用正则表达式解析ASPX/ASCX要好

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


根据您的代码在何处和何处运行,您可能需要考虑您的站点可能不是完全信任运行的。

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

谢谢你,这正是我想要的。

我没有得到你。是否要从目录中查找所有.aspx和.ascx文件?或者你正试图直接从解决方案中解决这个问题?我同意你的看法。但首先,我会将aspx文件作为XML文件进行测试,但它似乎不起作用,有太多特殊的字符。。。所以,我会听从你的建议:谢谢,这很好,但是HTML/ASPX不是XML,不管它看起来有多像它!