听起来您所追求的是复合控件。它们与用户控件几乎完全一样,只是而不是使用 ascx 文件来创建您以编程方式创建的控件。与使用用户控件相比,这样做的最大优势是您最终可以将一些东西放入程序集中并在不同的项目中使用。
复合控件可以从 Control 或 WebControl 继承。我个人通常发现 Control 更适合继承,因为我通常不需要从 WebControl 获得的大量额外内容,例如样式属性,因为我通常只通过单个 CssClass 属性进行样式设置。
您还需要确保您的类实现了 INamingContainer 接口。如果控件在同一个父容器中多次使用,这将确保每个子控件将自动获得唯一的名称。
创建复合控件时最重要的事情是重写 Control 的 CreateChildControls 方法。实际创建控件的所有逻辑都应该放在这里。该框架将自动确保在页面生命周期中的正确时间调用它。
这是一个小例子:
public class MyCompositeControl : Control, INamingContainer
{
protected override void CreateChildControls()
{
Controls.Clear();
var textbox = new TextBox();
textbox.ID = "TextBox1";
Controls.Add(textbox);
if (!Page.IsPostBack || !IsTrackingViewState)
{
// make sure you set the properties after
// you add it to the parent or the viewstate
// won't save properly
textbox.MaxLength = 30;
}
var button = new Button();
button.ID = "Button1";
Controls.Add(button);
if (!Page.IsPostBack || !IsTrackingViewState)
{
button.Text = "Save";
}
}
}
我不认为 ASP.NET AJAX 应该这么复杂。我唯一能想到的是,您需要确保在将添加复合控件的任何页面上创建一个 ScriptManager。
在 MSDN 网站上有一个完整的例子。这个博客上有另一个很好的例子。