2012-07-11 3 views
1

ASP.NET AJAX 서버 컨트롤 만들기. RenderContents 방법을 재정의, 나는 다음과 같이이 코드에 배치 :ASP.NET AJAX 서버 컨트롤의 UpdatePanel

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

컨트롤을 컴파일하고 Web Forms 페이지에 그것을 포기, 나는 UpdatePanel 일을 doen't 것을 찾을 수 있습니다. UpdatePanel 안의 버튼을 클릭하면 비동기 적으로 완료되지 않은 전체 포스트 백이 수행됩니다.

성공하지 못하면 웹에서 답변을 찾고 있습니다.

AJAX 서버 컨트롤 내에 UpdatePanel을 설치하는 것이 좋은지 궁금합니다. 필자는 UserControl을 사용하여이 similer 작업을 성공적으로 수행했습니다.

HTML 스크립트는 다음과 같습니다 :

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

답변

1

UpdatePanelCreateChildControls 기능에 servercontrol에 추가해야합니다. 따라서 업데이트 패널로 ScriptManager에 등록 할 수 있습니다. RenderContents 함수에서 렌더링하는 동안, ServerControl에 추가되는 UpdatePanel의 html로 끝납니다.

+0

RenderContents 함수를 제거하고 CreateChildControls 내의 모든 컨트롤을 만들었습니다. CreateChildControls가 작동 할 때 RenderContents를 통해 대부분의 Server Control 예제가 생성되는 이유는 무엇입니까? 어떤 이점이 있니? 위대한 작품, 고마워요. – deDogs

+0

RenderContents 함수는 "ViewState"에 저장된 컨트롤을 건너 뛸 수있는 장점이있어 컨트롤의 Html을 직접 제어 할 수 있습니다. – Bharath

관련 문제