使用构建管理器类加载 ASPX 文件并填充其控件
Posted
技术标签:
【中文标题】使用构建管理器类加载 ASPX 文件并填充其控件【英文标题】:Using Build Manager Class to Load ASPX Files and Populate its Controls 【发布时间】:2010-03-21 17:53:25 【问题描述】:我正在使用 BuildManager 类加载一个动态生成的 ASPX 文件,请注意它没有对应的 .cs 文件。
使用以下代码,我可以加载 aspx 文件,甚至可以遍历动态创建的 aspx 文件的控件集合,但是当我为控件分配值时,它们没有显示出来。例如,如果我将值“Dummy”绑定到 aspx 页面的 TextBox 控件,则文本框保持为空。
这是我正在使用的代码
protected void Page_Load(object sender, EventArgs e) LoadPage("~/Demo.aspx"); 公共静态无效LoadPage(字符串pagePath) // 获取引用路径的编译类型 类型类型 = BuildManager.GetCompiledType(pagePath); // 如果 type 为 null,则无法确定页面类型 如果(类型 == 空) throw new ApplicationException("Page" + pagePath + "not found"); // 转换页面对象(也可以转换接口实例) // 在这个例子中,ASP220Page 是一个自定义的基本页面 System.Web.UI.Page pageView = (System.Web.UI.Page)Activator.CreateInstance(type); // 调用页面标题 pageView.Title = "动态加载页面..."; // 调用 ASP220Page 的自定义属性 //pageView.InternalControls.Add( // new LiteralControl("动态服务...")); // 处理带有更新对象的请求 ((IHttpHandler)pageView).ProcessRequest(HttpContext.Current); LoadDataInDynamicPage(pageView); 私有静态无效LoadDataInDynamicPage(页面prvPage) foreach(prvPage.Controls 中的控制 ctrl) //查找表单控件 如果(ctrl.ID != null) if (ctrl.ID.Equals("form1")) AllFormsClass cls = new AllFormsClass(); 数据集 ds = cls.GetConditionalData("1"); foreach(在 ctrl.Controls 中控制 ctr) 如果(ctr 是文本框) if (ctr.ID.Contains("_M")) 文本框 drpControl = (文本框)ctr; drpControl.Text = ds.Tables[0].Rows[0][ctr.ID].ToString(); 否则 if (ctr.ID.Contains("_O")) 文本框 drpControl = (文本框)ctr; drpControl.Text = ds.Tables[1].Rows[0][ctr.ID].ToString();
【问题讨论】:
【参考方案1】:我看到您从How To Dynamically Load A Page For Processing 获得了部分代码。也请阅读 cmets,就像 Mike 的 one。
反转这个:
((IHttpHandler)pageView).ProcessRequest(HttpContext.Current);
LoadDataInDynamicPage(pageView);
到这里:
LoadDataInDynamicPage(pageView);
((IHttpHandler)pageView).ProcessRequest(HttpContext.Current);
在这种情况下,更改调用顺序确实会改变我认为的最终结果。 Commutativity property 的倒数。 :)
【讨论】:
以上是关于使用构建管理器类加载 ASPX 文件并填充其控件的主要内容,如果未能解决你的问题,请参考以下文章
当我将WPF UserControl用于其内置项目以外的项目时,我的WPF UserControl无法找到资源