【问题标题】:List all controls of all web pages of an application in a page在一个页面中列出一个应用程序的所有网页的所有控件
【发布时间】:2016-01-01 20:03:19
【问题描述】:

我正在开发一个页面来管理 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.ascx 文件吗?或者您是直接从解决方案中尝试这样做?

标签: c# asp.net


【解决方案1】:

这更像是一种方法而不是答案,但我会看到的是:

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

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

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

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

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

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

根据您运行代码的方式和位置,您可能需要考虑到您的网站可能没有在完全信任的情况下运行。

【讨论】:

  • 我同意你的看法。但首先,我会测试将 aspx 文件作为 XML 文件读取,但它似乎不起作用,有太多特殊字符......所以,我会听从你的建议 :) 谢谢
  • 会很好,但是 HTML/ASPX 不是 XML,不管它看起来有多像!
【解决方案2】:

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

谢谢,这正是我想要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    相关资源
    最近更新 更多