【问题标题】:Form is Null in Dynamically created Pages动态创建的页面中的表单为空
【发布时间】:2013-02-18 21:56:10
【问题描述】:

我在 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 的代码,因为它的工作量太大而且超出了我正在做的范围,范围不是由我决定的。

【问题讨论】:

  • 你在做什么似乎很奇怪。您究竟想从哪里创建这个新页面?为什么需要动态执行此操作?

标签: c# asp.net webforms


【解决方案1】:

看起来 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);

【讨论】:

  • 路径是正确的,正如我在上次编辑中所说的那样,而且我没有物理 aspx。
【解决方案2】:

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

不过,您的标题和问题对于创建主页都非常清楚,所以也许您应该多解释一下大局。

【讨论】:

  • 实际上它有点复杂,我想在触发事件流时将控件 html 呈现为变量,并且 html 不是 aspx 而是硬编码 - 请参阅编辑。跨度>
猜你喜欢
  • 2020-01-21
  • 2013-01-29
  • 2011-12-22
  • 2018-09-01
  • 2012-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多