如何:在ASP.NET自定义服务器控件中使用AJAX

有没有人知道一个很好的教程,演示如何在自定义ASP.NET服务器控件中使用现有的
AJAX控件扩展器?

我不想构建“自定义AJAX服务器控件”.我想构建一个使用现有AJAX控件扩展器的自定义服务器控件.

我想结合一个asp:TextBox,asp:ImageButton,asp:CustomValidator(带有来自嵌入式资源的客户端javascript),以及一个ajax:CalendarExtender到一个自定义服务器控件中.或者已经创建了这个?

任何帮助将不胜感激.谢谢.

更新:基本上,我想创建一个具有ajax的CompositeControl:CalendarExtender作为子控件.

最佳答案 听起来你所追求的是复合控制.它们几乎与用户控件完全相同,而不是使用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网站上有一个这样的full example. this blog还有另一个很好的例子.

点赞