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

时间:2009-02-26 21:51:52

标签: asp.net ajax custom-server-controls

是否有人知道在自定义ASP.NET服务器控件中使用现有AJAX控件扩展器演示的优秀教程?

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

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

非常感谢任何帮助。感谢。

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

3 个答案:

答案 0 :(得分:3)

听起来像是复合控件。它们几乎与用户控件完全相同,而不是使用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还有一个很好的例子。

答案 1 :(得分:0)

您想要的是最有可能构建用户控件而不是自定义控件。用户控件是复合控件,而自定义控件是从基础控件派生而来的控件。

答案 2 :(得分:-1)

我建议你在MSDN上搜索。在过去的一两年里,我在他们的杂志上看过几篇关于这个主题的好文章,这些文章相当透彻。但我没有与他们的链接,我对你懒得谷歌。 :\