0

您好我正在尝试在用户控件中使用 AjaxControlToolkit 的 Accordion 控件。该用户控件是从后面的代码动态添加到页面的。我的用户控制代码如下:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="MyControl.ascx.cs" 
Inherits="Project.UC.Control" %>

<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit"
TagPrefix="asp" %>

<asp:Accordion ID="Accordion1" runat="server" HeaderSelectedCssClass="Sel" 
HeaderCssClass="unSel" SelectedIndex="0">
<Panes>
<asp:AccordionPane runat="server" ID="AccordionPane1">  
<Header>Red Orchid</Header>  
<Content>Some content here.</Content>  
</asp:AccordionPane>  
</Panes>
</asp:Accordion>

为了动态添加用户控件,我在页面后面的代码中使用了以下代码

Control mycontrol = this.LoadControl("~/myUserControl.ascx");
this.Controls.Add(mycontrol);

在我的用户控件使用者页面上,我有带有 runat="server" 的表单标记,还为 ajax 功能添加了 ScriptManager 控件。当我运行我的代码时,我收到以下错误

Control 'ctl02_Accordion1_AccordionExtender' of type 
'AccordionExtender' must be placed inside a form tag with runat=server. 

我已经在我的消费者页面上使用了带有 runat="server" 标记的表单,为什么会出现这个问题。为了解决这个问题,我将消费者页面的表单标签移至用户控件,这解决了我的问题,但这样做我无法利用消费者页面上的回发。如果我将带有 runat="server" 的表单标签放在用户控件和消费者页面中,则会显示错误,您只能在页面上使用一个表单标签。如何解决这个问题呢。

提前致谢..

4

1 回答 1

0

PlaceHolder控件添加到窗体上,而不是this.Controls.Add(mycontrol);使用PlaceHolder1.Controls.Add(mycontrol);

或者您需要将控件添加到表单的Controls集合中。假设 form 有aspnetFormid 你应该写:aspnetForm.Controls.Add(mycontrol);

原因是Page该类具有自己的Controls属性,因此this.Controls.Add(mycontrol);将控件添加到 Page.Controls 集合。但是所有向服务器提交任何数据的控件都必须放在form元素中,否则它们的值不应该在服务器端访问。这来自成熟的 html 表单:HTML 表单和输入

于 2013-02-14T09:07:50.767 回答