【问题标题】:Get List of Controls on each WebForm in an Assembly获取程序集中每个 WebForm 上的控件列表
【发布时间】:2011-08-12 10:21:29
【问题描述】:

是否可以使用反射获取 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 解决方案方法。

【问题讨论】:

    标签: asp.net webforms system.reflection


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-08
        • 2013-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多