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

4
有没有好的教程演示如何在自定义ASP.NET服务器控件中使用现有的AJAX控制扩展器?
我不想构建“自定义AJAX服务器控件”。我想构建一个使用现有AJAX控制扩展器的自定义服务器控件。
我想将asp:TextBox、asp:ImageButton、asp:CustomValidator(带有来自嵌入式资源的客户端JavaScript)和ajax:CalendarExtender组合成一个自定义服务器控件。或者这已经被创建了吗?
任何帮助都将不胜感激。谢谢。
更新:基本上,我想创建一个具有ajax:CalendarExtender作为子控件的CompositeControl。

1
这让我更接近了一些,但它是自定义JavaScript,而不是现有的AJAX控件:http://msdn.microsoft.com/en-us/library/bb386450.aspx - Aaron Hoffman
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网站上有一个完整示例。这个博客上还有另一个不错的示例(链接)

我想在创建服务器控件时使用复合控件方法。但是顺便提一下,ASP 2.0及以上版本有一种新的方法来创建这些控件http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.compositecontrol.aspx。无论哪种方式,AJAX ControlExtenders在其中都不能很好地工作。 - Aaron Hoffman
基本上,我正在寻找一个教程,其中一个 AJAX 控件扩展器作为 CompositeControl 的子控件。 - Aaron Hoffman
太棒了!我之前不知道有复合控件类。关于ControlExtenders,我不知道有什么好的教程。希望你能找到答案。 - Helephant
除非您继承CompositeControl,否则不能保证触发CreateChildControls事件。如果您从头开始创建自己的控件,则没有问题,但是如果您正在构建继承Control或WebControl的控件,则不要使用此事件,而应在init或load上执行。无论如何,在您的示例中,我认为它应该是“CompositeControl,INamingContainer”。 - Jamie Treworgy

0
你想要的是构建一个用户控件而不是一个自定义控件。用户控件是一个复合控件,而自定义控件是从基本控件派生或从头开始构建的控件。

实际上,我已经将其作为用户控件工作,但是如果您正在寻找快速解决方案,那么是的,这更容易。但是,我希望能够重复使用此类控件,而无需复制用户控件的所有单独部分。 - Aaron Hoffman

-1

我建议你在MSDN上搜索。在过去的一两年中,我看到了几篇关于那个主题的好文章,它们相当详尽。但我没有链接,并且懒得为你谷歌。 :\


1
我已经进行了大量的搜索,但没有找到有用的信息。这就是为什么我在这里发布了问题。如果您有时间,请发布链接。谢谢。 - Aaron Hoffman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接