0

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

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 解决方案方法。

4

2 回答 2

2

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

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

于 2011-08-12T11:30:02.280 回答
1

在我看来,您正在寻找在运行时创建的控件。如果您想在运行时找到这些控件,您可以通过反射和(取决于容器)通过其他方式。您应该在Page_Unload事件中这样做,这是大多数控件已加载且仍然可用的地方。

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

于 2011-08-12T11:37:04.613 回答