Question

Creating an ASP.NET AJAX Server Control. Overriding the RenderContents method, I placed in this code shown below:

protected override void RenderContents(HtmlTextWriter writer)
{
    var updatePanel = new UpdatePanel();
    updatePanel.UpdateMode = UpdatePanelUpdateMode.Conditional;
    updatePanel.ClientIDMode = ClientIDMode.AutoID;
    updatePanel.ID = "CaptchaUpdatePanel";
    updatePanel.ChildrenAsTriggers = true;

    //var placeHolder = new PlaceHolder();
    var hiddenField = new HiddenField();
    hiddenField.ID = "captchaKey";
    updatePanel.ContentTemplateContainer.Controls.Add(hiddenField);

    var panel = new Panel();
    panel.ID = "Captcha";
    var imgButton = new ImageButton();
    imgButton.ID = "RefreshCaptcha";
    imgButton.TabIndex = 0;
    imgButton.AlternateText = "Refresh Captcha Characters";
    imgButton.ImageUrl = RefreshButtonPath;
    imgButton.Width = 36;
    imgButton.Height = 36;
    panel.Controls.Add(imgButton);

    updatePanel.ContentTemplateContainer.Controls.Add(panel);

    AsyncPostBackTrigger trigger = new AsyncPostBackTrigger();
    trigger.ControlID = "CaptchaRefresh";
    trigger.EventName = "Click";
    updatePanel.Triggers.Add(trigger);

    updatePanel.ContentTemplateContainer.RenderControl(writer);

    base.RenderContents(writer);
}

Compiling the Control and dropping it onto a Web Forms page, I find that the UpdatePanel doen't work. The button inside the UpdatePanel, when clicked, performs a complete postback not asynchronously.

Without success, I have been searching the web for an answer.

I'm wondering if it is a good idea to have an UpdatePanel within a AJAX Server Control. I have been successful performing this similer task using a UserControl.

HTML Script is below:

<%@ Page Language="C#" AutoEventWireup="true" %>

<%@ Register Assembly="CaptchaControl" Namespace="CaptchaControlx" TagPrefix="cc1" %>

<!DOCTYPE html>

<html>
<head runat="server">
    <title></title>
    <script runat="server">

        protected void Page_Load(object sender, EventArgs e)
        {
            Label1.Text = DateTime.Now.ToString();
        }
    </script>
    <!--[if lt IE 9]>
        <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->
</head>

<body>
    <form runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>

    <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>

    <cc1:captcha runat="server" />

    </form>
</body>
</html>
Was it helpful?

Solution

UpdatePanel needs to be added in servercontrol at CreateChildControls function. So that it can be registered to ScriptManager as a updatepanel. While rendering it in RenderContents function, result in just html of UpdatePanel to be added in ServerControl.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top