在动态创建的页面中,表单为Null

本文关键字:表单 Null 动态 创建 | 更新日期: 2023-09-27 18:00:12

我正在ASP.NET中动态创建一个页面,我想在表单中加载一个控件,但每次我尝试将其添加到Page.form.Controls时,表单都为null,并发出一个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),控件将不会呈现,并且看起来events没有被激发,我想我必须有一个页面来使事件流工作,但我真的不想仅仅为此创建一个新的aspx。

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

在动态创建的页面中,表单为Null

看起来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将始终为null。请实例化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);

Page myPage = new Page();几乎肯定不是您想要的。听起来您想将控件加载到当前页面,该页面将只是Page.Controls.Add(ctrl)

不过,你的标题和问题都很清楚如何创建页面,所以也许你应该更多地解释大局。