1

我在将其内容(子控件)呈现在标签之外的自定义控件时遇到问题,这会导致运行时错误和问题。为了尽可能简化事情,我创建了下面的控件,但它有同样的问题。我尝试从 Control、WebControl 和 CompositeControl 继承都导致了同样的问题。猜测有一些明显的事情我做错了......感谢您的帮助。

using System;
using System.Web.UI.WebControls;

namespace MyControls
{
    public class TestControl : CompositeControl
    {
        protected override void CreateChildControls()
        {
            Controls.Clear();
            Controls.Add(new Button() { Text = "TestControl!" });
            ClearChildViewState();
        }
    }
}

以编程方式添加控件会导致在表单标记之外进行标记。通过标记添加控件是正确的。

protected void Page_Load(object sender, EventArgs e)
{
    Controls.Add(new TestControl());
}



...
<body>
    <form name="PageForm" method="post" action="default.aspx" id="PageForm">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTE5MDEwMTE5MWRkg0FopdvLhTPGxHkGm1xCCOVQz6A=" />
</div>

    <div>

    </div>
    </form>
</body>
</html>
<span><input type="submit" name="ctl04$ctl00" value="TestControl!" /></span>
4

3 回答 3

2

通过 Page.Form 属性添加控件将在表单内呈现按钮。

Page.Form.Controls.Add(new Button() { Text = "TestControl!" });

但是,由于该按钮不包含在诸如 <div> 之类的块中,因此此按钮可能存在一些布局问题。使用 ScarletGarden 的方法。

于 2009-02-15T23:34:05.393 回答
2

这与您的自定义控件无关。您的问题是由您将控件添加到页面的方式引起的。

当您调用Controls.Add页面的Page_Load方法时,这基本上是以下的简写:

Page.Controls.Add(new TestControl());

即,您在整个页面的控件层次结构的末尾添加控件。呈现页面时,您的控件将在所有其他控件之后呈现 - 甚至在结束</html>标记之后。

如果您希望您的控件在表单中呈现,那么您需要将其添加到表单的控件层次结构中:

Form.Controls.Add(new TestControl());

如果您需要更细粒度的定位,那么您需要在页面上的所需位置放置一个placeholder(或divspan等)并将您的控件添加到该位置,如 ScarletGarden 的回答中所示。

于 2009-02-16T00:00:36.903 回答
1

您的控件似乎没问题,我认为您在将控件添加到页面时遇到了问题,

将 placeHolder 添加到您的页面,

<body>
    <form id="form1" runat="server">
    <div>
        <asp:PlaceHolder ID="placeHolder" runat="server"></asp:PlaceHolder>
    </div>
    </form>
</body>

然后将您的复合控件添加到此占位符的控件集合中,如下所示:

TestControl testCtrl = new TestControl();
placeHolder.Controls.Add(testCtrl);
于 2009-02-15T22:17:33.453 回答