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





0/5 (0投票)
几天前,我在 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);
}
}
}