0

我在 ASP.NET 中动态创建一个页面,我想在表单中加载一个控件,但每次我尝试将它添加到 Page.Form.Controls 时,表单为空并给出一个 NullReference

Page myPage = new Page();
FormAtt ctrl = (FormAtt)myPage.LoadControl("path/to/my/file.ascx");
myPage.Form.Controls.Add(ctrl);

我正在尝试这样做,因为我必须解析控件 HTML ,同时触发控件内部的事件和逻辑,并将其转换为字符串以使用 HTML 代码填充(设计非常糟糕的)字符串,如果我只是调用ctrl.RenderControl(HtmlWriter)控件将不渲染,似乎没有触发事件,我猜我必须有一个页面才能使事件流工作,但我真的不想为此创建一个新的 aspx。

另外,我确定路径是正确的,因为我测试了相同的负载控制,因为它不会引发异常,因为当我将路径更改为不存在的东西时会引发异常。我无法重新设计组装 HTML 的代码,因为它工作量太大而且超出了我正在做的范围,范围不是由我决定的。

4

2 回答 2

2

看起来 UserControl 文件路径不正确。

你能试试这个

string path = HttpContext.Current.Request.ApplicationPath == "/" ? 
   string.Empty : HttpContext.Current.Request.ApplicationPath;

... (FormAtt)myPage.LoadControl(path + "/path/to/my/file.ascx");

如果它仍然不起作用,您的 file.ascx 与您的 aspx 页面相关的位置在哪里?

更新:myPage.Form 将始终为空。请实例化 HtmlForm。

Page myPage = new Page();
HtmlForm form = new HtmlForm();
FormAtt ctrl = (FormAtt)myPage.LoadControl("path/to/my/file.ascx");
form.Controls.Add(ctrl);
myPage.Controls.Add(form);
于 2013-02-18T22:24:24.370 回答
1

Page myPage = new Page();几乎绝对不是你想要的。听起来您想将控件加载到当前页面中,即Page.Controls.Add(ctrl).

Your title and question are both pretty clear about creating a Page though, so maybe you should explain the big picture more.

于 2013-02-19T01:39:47.123 回答