4

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

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

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

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

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

4

3 回答 3

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 网站上有一个完整的例子这个博客上有另一个很好的例子。

于 2009-03-08T15:31:18.827 回答
0

您想要的是构建一个用户控件,而不是最有可能的自定义控件。用户控件是复合控件,而自定义控件是从头开始构建的控件,也可以从基本控件派生。

于 2009-02-26T22:16:03.790 回答
-1

我建议你在 MSDN 上搜索。在过去的一两年里,我在他们的杂志上看到了几篇关于该主题的好文章,这些文章相当透彻。但是我没有指向它们的链接,而且我懒得用谷歌搜索你。:\

于 2009-03-06T00:21:11.997 回答