【问题标题】:Adding ASP.NET User Controls at runtime via <script runat="server">在运行时通过 <script runat="server"> 添加 ASP.NET 用户控件
【发布时间】:2015-05-14 01:53:39
【问题描述】:

我在*.aspx 页面的&lt;script runat="server"&gt; 标记内执行控件时遇到问题。

当它在页面的 HTML 部分中以声明方式定义时,该控件可以工作,但是当放置在脚本标记本身中时,我无法使其工作。

在页面的开头我注册了我的控件:

<%@ Register assembly="App_Web_exemple.ascx.cc671b29" namespace="Moncontrol" tagprefix="moncontrol" %>

然后,在 HTML 中,我使用以下声明(成功地)调用它:

<moncontrol:exemple ISBN="9782894646151" runat="server" />

但是,当我尝试以编程方式在 &lt;script runat="server"&gt; 中添加它时,我无法执行它。我尝试使用标签&lt;asp:Text /&gt;&lt;asp:Literal /&gt;,如下,但这也不起作用。

在 HTML 部分:

<asp:Text id="TestControl" runat="server" />

在脚本部分

TestControl.Text = "<moncontrol:exemple ISBN=\"9782894646151\" runat=\"server\" />";

【问题讨论】:

  • 我看到很多人反对这个问题。如果您对措辞有疑问,请考虑添加评论,以便作者可以修改帖子。没有反馈的否决票不是很有帮助。

标签: c# asp.net webforms user-controls asp.net-controls


【解决方案1】:

澄清一下,您要做的是在运行时以编程方式将用户控件添加到您的 Web 窗体页面。有几种方法可以做到这一点。

在我们开始之前,值得注意的是,您编写的代码可能“有效”,因为它可以编译并且不会引发运行时错误。但它也没有执行控制。我怀疑如果你查看你的 HTML,你会发现控件声明被输出为字符串文字(即,未被服务器处理)。然后浏览器会忽略它,因为它不知道&lt;moncontrol:exemple /&gt; 标签代表什么。这显然不是你想要的。

建立一个控制容器

无论您采用哪种方法,您都需要从页面上的某种类型的容器开始,您可以将控件添加到其中,例如Panel。如果您不希望容器输出任何包装器标记,可以使用Placeholder

<asp:Placeholder id="ControlContainer" runat="server" />

这与您当前的Text 控件的目的相似,除了它的目的是提供一个容器,您将向其中添加您的用户控件。然而,从 ASP.NET 的角度来看,这可以是 任何 类型的服务器控件,包括 &lt;script runat="server"&gt;,根据您的请求。稍后会详细介绍。

以编程方式创建控件

接下来,您将以编程方式创建控件。这是我们遇到各种选择的地方。最通用的方法是使用ParseControl() 方法(reference)。这看起来像这样:

Control control = Page.ParseControl("<%@ Register assembly=\"App_Web_exemple.ascx.cc671b29\" namespace=\"Moncontrol\" tagprefix=\"moncontrol\" %><moncontrol:exemple ISBN=\"9782894646151\" runat=\"server\" />");

这将使用与处理页面上的声明性语法相同的方法解析控件,并返回一个Control 对象,其中您的Exemple 控件作为其Controls 集合中的第一个控件。

但是,我发现该语法有点草率,因为它表示一个 .NET 对象及其属性作为字符串文字。鉴于此,有一些更清洁的方法。在这种情况下,您的控件似乎正在编译为程序集,因此,可能定义了一个继承自UserControl 的代码隐藏。如果是这样,您应该能够简单地执行以下操作:

Exemple control = new Exemple();

然后以编程方式设置其属性,就像在任何其他 C# 对象中一样。干净多了!

如果您的控件是由服务器动态编译的,那么您应该使用 Reference 指令和 LoadControl() 方法,如 MSDN 文章 How to: Create Instances of ASP.NET User Controls Programmatically 中所述。不过,我不相信这种方法对你有用。

将控件实例添加到页面

无论您采用哪种方法,下一步都是相同的:然后,您将通过编程方式添加到页面的控件添加到目标容器的Controls 集合中。例如:

ControlContainer.Controls.Add(control);

注意:从技术上讲,您也可以将其添加到 Page 类的 Control 集合中,但这并不能让您控制 where on放置的页面;拥有PlaceHolder 控件(或等效控件)可以让您准确地指定控件出现的位置。

我希望这会有所帮助。根据您编写和编译控件的方式,有一些注意事项,但这应该为您提供解决问题所需的基本结构。

【讨论】:

  • 非常感谢杰里米 -
  • 没问题,@Ulysse。这解决了您的问题吗?这是一个有趣的挑战,一旦你锁定了这个概念,你就可以做很多很酷的事情,例如动态地添加和配置页面控件(例如,响应数据库中的配置)。
猜你喜欢
  • 2015-12-07
  • 1970-01-01
  • 1970-01-01
  • 2013-01-26
  • 1970-01-01
  • 2010-10-09
  • 1970-01-01
  • 1970-01-01
  • 2017-02-05
相关资源
最近更新 更多