2012-07-11 7 views
1

Création d'un contrôle serveur ASP.NET AJAX. Redéfinition de la méthode RenderContents, j'ai placé dans ce code ci-dessous:UpdatePanel dans un contrôle serveur ASP.NET AJAX

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); 
} 

Compiler le contrôle et la laisser tomber sur une page Web Forms, je trouve que le UpdatePanel doen't travail. Le bouton à l'intérieur du UpdatePanel, lorsqu'il est cliqué, effectue une publication complète non asynchrone.

Sans succès, j'ai cherché sur le web pour une réponse. Je me demande si c'est une bonne idée d'avoir un UpdatePanel dans un contrôle serveur AJAX. J'ai réussi à effectuer cette tâche similaire en utilisant un UserControl.

HTML Script est ci-dessous:

<%@ 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> 

Répondre

1

UpdatePanel doit être ajouté dans servercontrol à CreateChildControls fonction. Donc, il peut être enregistré à ScriptManager comme un panneau de mise à jour. Lors du rendu dans la fonction RenderContents, il suffit d'ajouter html de UpdatePanel dans ServerControl.

+0

J'ai éliminé la fonction RenderContents et créé tous les contrôles dans CreateChildControls. Pourquoi la plupart des exemples de contrôle de serveur montrent-ils des contrôles créés avec RenderContents, lorsque CreateChildControls fonctionne? Des avantages? Fonctionne très bien, merci. – deDogs

+0

La fonction RenderContents présente des avantages tels que le contrôle de saut peut être stocké dans "ViewState", le contrôle Html peut être contrôlé directement. – Bharath

Questions connexes