我正在开发一个页面来管理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 :(得分: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));
}
}
}
谢谢,这正是我想要的。