获取程序集中每个WebForm上的控件列表

时间:2011-08-12 10:21:30

标签: asp.net webforms system.reflection

是否可以使用反射获取webform上存在的控件的纯文本列表?基本上,一位同事希望得到一个控件列表,以帮助定义验证策略,例如一般而言,产品编号必须是数字,但在某些屏幕上,它们可以是字母数字。 我认为使用反射生成一个类似的列表会很简单:

AddProduct.aspx
     txtProductNumber
     txtProductName
     etc.

我可以获取表单名称,但到目前为止还没有包含的控件。当前代码如下所示:

Assembly assembly = Assembly.LoadFrom(@"Filename.dll");
Type[] types = assembly.GetExportedTypes();
for (int i = 0; i < types.Length; i++)
{
    Page page = (Page)assembly.CreateInstance(types[i].FullName);
    ControlCollection controls = page.Controls;
    // At this point controls.Count = 0 presumably because the controls are defined as protected.
}


Assembly.CreateInstance有两个重载。例如,如果我将页面分配行更改为

  

Page page =(Page)assembly.CreateInstance(types [i] .FullName,true,   BindingFlags.NonPublic,null,null,null,null);

然后我收到有关缺少构造函数的错误。

那么,我是完全走错了道路,还是我试图做的事实呢?非常感谢任何帮助。

编辑:对此问题的延迟回复表示歉意。我们使用Assembly.GetCallingAssembly()进一步生成列表,但它仍然不能满足我们的需求。我们最终使用了一种更加冗长的Find in Entire解决方案。

2 个答案:

答案 0 :(得分:2)

由于您只是创建每个页面的实例而不是实际提供页面,我不相信您的方法会起作用,因为它不会让页面通过正常的页面请求生命周期来负责创建页面及其子控件。

如果这是一个使用asp.net框架控件的网站,那么你可能最好只为标签前缀“在文件中查找”

答案 1 :(得分:1)

在我看来,您正在寻找在运行时创建的控件。如果要在运行时找到这些控件,可以使用反射和(取决于容器)使用其他方法。您应该在Page_Unload事件中执行此操作,这是大多数控件已加载并仍然可用的位置。

但是,如果您试图在不通过页面请求生命周期处理页面的情况下找到这些控件,则可能会令人生畏。只是为此事件创建一个包含CreateInstance(或“new”)的页面将不会运行Page_LoadPage_Init或任何其他事件。它只会 运行构造函数中的代码(正如您所发现的那样,它受到保护,这并不意味着您无法实例化它,但是经历这种麻烦会给您带来很少的帮助。)