65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 BuildManager 类以编程方式获取 Asp.Net 页面的信息

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2013 年 10 月 11 日

CPOL

2分钟阅读

viewsIcon

6405

几天前,我在 asp.net 站点上遇到了一个问题,其中一个用户想要从不同的页面获取有关页面控件的信息。

几天前,我在 asp.net 站点上遇到了一个问题,其中一个用户想要从不同的页面获取有关页面控件的信息。这种方法的问题在于服务器将请求的页面加载到内存中。因此,一次您只能在一个页面上,例如 Page1。我们可以从 Page1 创建 Page2 的对象,但无法获取有关控件的信息,因为控件仅在 Page_Init 触发时才会初始化,并且由于我们只是创建对象,因此没有与此相关的生命周期。

现在,为了帮助您入门,.Net 提供了许多类,这些类有助于页面的动态编译,如果您想缓存页面以获得更快的访问速度和更好的用户体验,这些类可能非常有用。您应该知道,asp.net 页面在用户请求时进行编译,并缓存以供以后使用。

我们将要讨论和使用的类是 BuildManager 类。让我们从 Page1 计算 Page2 中面板控件的数量。

我们将使用反射来动态创建实例,这就是为什么我们需要页面的类型信息。这可以使用以下方法实现

  // 获取引用路径的已编译类型  
      string pagePath = "~/Page2.aspx";  
      Type type = BuildManager.GetCompiledType(pagePath);

一旦我们有了类型,我们就可以继续使用以下方法创建 Page2 的实例

  Page myPage = (Page)Activator.CreateInstance(type);  

上面的代码将创建页面实例,但是如果您尝试访问 Page2 的 Controls 集合,您会发现它是 0,这是因为您只是调用了构造函数来创建实例。没有页面生命周期参与,这对于使用控件填充页面是必要的。要执行页面生命周期,我们将调用 Page 类上的 ProcessRequest 方法,如下所示。

    myPage.ProcessRequest(HttpContext.Current);   

现在您可以访问控件集合并做您想做的事情。

******************************************************************************************************************8

这是计算页面中面板的完整代码

 


      //将计数初始化为 0

      int count = 0;  
 
      // 获取引用路径的已编译类型  
      string pagePath = "~/Page2.aspx";  
      Type type = BuildManager.GetCompiledType(pagePath);  
 
      // 如果类型为 null,则无法确定页面类型  
      if (type == null)  
          throw new ApplicationException("Page " + pagePath + " not found");  
 
      
      Page myPage = (Page)Activator.CreateInstance(type);  
      myPage.ProcessRequest(HttpContext.Current);  
        
      foreach (Control control in myPage.Controls)  
      {  
          if (control is Panel)  
              ++count;  
          if (control.HasControls())  
              CountControls(control, ref count);  
      }  
 

 private static void CountControls(System.Web.UI.Control control, ref int count)  
    {  
        foreach (System.Web.UI.Control childControl in control.Controls)  
        {  
            System.Web.UI.WebControls.WebControl webControl = childControl as System.Web.UI.WebControls.WebControl;  
            if (webControl != null)  
            {  
                if (webControl is System.Web.UI.WebControls.Panel)  
                    ++count;  
                if (webControl.HasControls())  
                    CountControls(webControl, ref count);  
            }  
        }  
    }  
 

© . All rights reserved.