[通过在运行时添加ASP.NET用户控件

问题描述 投票:-4回答:1

我在执行<script runat="server">页面的*.aspx标记内执行控件时遇到麻烦。

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

在页面的开头,我向以下位置注册了控件:

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

然后,在HTML中,我用以下声明成功调用了它:

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

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

在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个回答
1
投票

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

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

建立控制容器

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

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

此功能与您当前的Text控件具有相似的用途,但其only用途是提供一个您要向其中添加用户控件的容器。但是,从ASP.NET的角度来看,根据您的请求,这可以是服务器控件的[[any类型,包括<script runat="server">。稍后再讨论。

以编程方式创建控件

接下来,您将以编程方式创建控件。这是我们遇到各种选择的地方。最通用的方法是使用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);

Note

:从技术上讲,您也可以将其添加到Page类的Control集合中,但这并不能使您对放置它的页面上的where有任何控制;具有PlaceHolder控件(或等效控件)的控件使您可以指定exactly控件出现的位置。我希望这会有所帮助。根据您如何编写和编译控件,有一些警告,但这应该为您提供解决问题所需的基本结构。
© www.soinside.com 2019 - 2024. All rights reserved.