您好我正在尝试在用户控制中使用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 =&#34; server&#34;还为ajax功能添加了ScriptManager控件。当我运行我的代码时,我收到了以下错误
Control 'ctl02_Accordion1_AccordionExtender' of type
'AccordionExtender' must be placed inside a form tag with runat=server.
我已经使用了runat =&#34; server&#34;在我的消费者页面上标记为什么会出现此问题。为了解决这个问题,我将我的消费者页面的表单标签移动到用户控件,这解决了我的问题,但通过这样做,我无法在我的消费者页面上利用回发。如果我把表格标签与runat =&#34; server&#34;在用户控件和消费者页面中,它显示错误,您只能在页面上使用一个表单标记。如何解决这个问题。
提前致谢..
答案 0 :(得分:0)
在表单上添加PlaceHolder
控件,而不是this.Controls.Add(mycontrol);
使用PlaceHolder1.Controls.Add(mycontrol);
或者您需要添加控件以形成Controls
集合。假设表单具有aspnetForm
id,您应该写:aspnetForm.Controls.Add(mycontrol);
原因是Page
类具有自己的Controls
属性,因此this.Controls.Add(mycontrol);
行添加控件到Page.Controls集合。但是那些向服务器提交任何数据的控件必须放在form
元素中,否则它们的值不应该在服务器端访问。这是从html表格成熟:HTML Forms and Input