我遇到了自定义控件的问题,该控件在标记之外呈现其内容(子控件),这会导致运行时错误和问题。为了尽可能地简化事情,我在下面创建了控件,但它有同样的问题。我尝试从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();
}
}
}
以编程方式添加控件会在forms标记之外生成标记。通过标记添加控件的工作正确。
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>
答案 0 :(得分:2)
通过Page.Form属性添加控件将呈现表单内的按钮。
Page.Form.Controls.Add(new Button() { Text = "TestControl!" });
但是,由于该按钮未包含在某个块中,例如&lt; div&gt;,因此此按钮可能会出现一些布局问题。使用ScarletGarden的方法。
答案 1 :(得分:2)
这与您的自定义控件无关。您的问题是由您将控件添加到页面的方式引起的。
当您在网页的Controls.Add
方法中致电Page_Load
时,这基本上是简写:
Page.Controls.Add(new TestControl());
即,您在整个页面的控件层次结构中添加了控件。呈现页面时,您的控件将在所有其他页面之后呈现 - 即使在结束</html>
标记之后也是如此。
如果您希望在窗体内呈现控件,则需要将其添加到窗体的控件层次结构中:
Form.Controls.Add(new TestControl());
如果您需要更细粒度的定位,则需要在页面上的placeholder
(或div
或span
等)放置所需位置并添加控件就像在ScarletGarden的回答中一样。
答案 2 :(得分: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);