通过<script runat =“server”>

时间:2015-05-14 01:53:39

标签: c# asp.net

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

&#xA;&#xA;

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

&#xA;&#xA;

一开始我注册控件的页面:

&#xA;&#xA;
 &lt;%@ Register assembly =“App_Web_exemple.ascx.cc671b29”namespace =“Moncontrol”tagprefix =“moncontrol “%&gt;&#xA;  
&#xA;&#xA;

在HTML中,我使用以下声明称呼它(成功):

&#xA; &#xA;
 &lt; moncontrol:例如ISBN =“9782894646151”runat =“server”/&gt;&#xA;  
&#xA;&#xA;

当我尝试通过&lt; script runat =“server”&gt; 以编程方式添加它时,我无法执行它。我尝试使用标记 asp:Text asp:Literal ,如下所示,但它不起作用。

&#xA;&#xA; < p>在HTML部分:

&#xA;&#xA;
 &lt; asp:Text id =“TestControl”runat =“server”/&gt;&#xA;  
&#xA;&#xA;

在脚本部分

&#xA;&#xA;
  TestControl.Text =“&lt; moncontrol:exemple ISBN = \“9782894646151 \”runat = \“server \”/&gt;“;&#xA;  
&#xA;

1 个答案:

答案 0 :(得分:1)

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

  

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

建立控制容器

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

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

这与您当前的Text控件具有相似的用途,但其唯一目的是提供一个容器,您将添加用户控件。稍后会详细介绍。

以编程方式创建控件

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

然而,我发现所有的触摸都很邋,,所以有一些更清洁的方法。在这种情况下,您的控件似乎被编译为程序集,因此可能会定义一个继承自UserControl的Code Behind。如果是这样,您应该能够简单地执行以下操作:

Exemple control = new Exemple();

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

  

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

将控制实例添加到页面

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

ControlContainer.Controls.Add(control);
  

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

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