繁体   English   中英

通过在运行时添加 ASP.NET 用户控件<script runat=“server”>

[英]Adding ASP.NET User Controls at runtime via <script runat=“server”>

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

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

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

<%@ 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\" />";

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

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

建立控制容器

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

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

这与您当前的Text控件的用途相似,但其唯一目的是提供一个容器,您将向其中添加用户控件。 但是,从 ASP.NET 的角度来看,根据您的请求,这可以是任何类型的服务器控件,包括<script runat="server"> 稍后再谈。

以编程方式创建控件

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

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

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

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

Exemple control = new Exemple();

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

如果您的控件不是由服务器动态编译,那么您应该使用带有LoadControl()方法的Reference指令,如 MSDN 文章如何:以编程方式创建 ASP.NET 用户控件的实例中所述 然而,我不相信这种方法对你有用。

将控件实例添加到页面

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

ControlContainer.Controls.Add(control);

注意:您可以在技术上只添加这在Page类的Control集合,太多,但不给你过网页上它被放置任何控制; 拥有PlaceHolder控件(或等效控件)可让您准确指定希望控件出现的位置。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM