2011-03-25 8 views
0

동적 아약스 컨트롤을 만들 때 포스트 백에서 미리 렌더링 문제가 발생할 수 있습니다. 포스트 백에서 컨트롤을 다시 만들어야합니다. 그러나 매우 많은 포스트 백이있을 때마다 성능이 매우 느려지는 경우가 있습니다. 즉, 콤보 박스를 클릭하면 몇 초가 걸릴 수 있습니다. 그래서 저는 패널에서 컨트롤을 그룹화하고 컬렉션에 패널을 저장 한 다음 포스트 백에서 패널을 다시 호출했습니다. 패널 내부의 컨트롤이 표준 HTML 컨트롤 (텍스트 상자, 드롭 다운 목록 등) 인 경우 실제로 효과적입니다. 하지만 ... 아약스 컨트롤은 잘 작동하지 않습니다 ... 아직.동적 컨트롤 예제. PreRender 이후에 스크립트 컨트롤이 등록되지 않을 수 있습니다.

아래 샘플을 포함 시켰습니다. 코드를 주석 처리/주석 처리하여 테스트하십시오. 누구나 좋은 아이디어가 있다면 Ajax 컨트롤로이 작업을 수행하는 방법이 좋을 것입니다.

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="WebForm1.aspx.vb" Inherits="PreRenderAjax.WebForm1" %> 

<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="asp" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0  Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
    </head> 
<body> 
    <form id="form1" runat="server"> 
    <asp:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server"> 
    </asp:ToolkitScriptManager> 
    <div> 
    <asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder> 
    </div> 
    </form> 
</body> 
</html> 


Public Class WebForm1 
Inherits System.Web.UI.Page 

Shared panellist As New List(Of Panel) 

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    If IsPostBack Then 
     'This is for reloading panels. Works with dropdownlist, but not ajax combobox 
     For Each pn As Panel In panellist 
      PlaceHolder1.Controls.Add(pn) 
     Next 

     'This for re-creating all the controls again. Not very efficient for ajax controls though. 
     'CreateInterface() 
    Else 
     CreateInterface() 
    End If 
End Sub 

Protected Overrides Sub CreateChildControls() 
    MyBase.CreateChildControls() 
End Sub 

Protected Overrides Sub OnInit(ByVal e As System.EventArgs) 
    MyBase.OnInit(e) 
    EnsureChildControls() 
End Sub 

Private Sub CreateInterface() 
    Dim pn As Panel 

    pn = CreatePanel("panel1") 
    CreateControls(pn, 5) 
    pn = CreatePanel("panel2") 
    CreateControls(pn, 5) 
    pn = CreatePanel("panel3") 
    CreateControls(pn, 5) 
    pn = CreatePanel("panel4") 
    CreateControls(pn, 5) 

End Sub 

Private Function CreatePanel(ByVal name As String) As Panel 
    Dim pn As New Panel 
    pn.ID = name 
    pn.Width = 250 
    pn.BorderStyle = BorderStyle.Solid 
    pn.BorderColor = Drawing.Color.Blue 
    pn.Style.Add("margin", "5px") 
    pn.Style.Add("padding", "5px") 
    PlaceHolder1.Controls.Add(pn) 
    panellist.Add(pn) 
    CreatePanel = pn 
End Function 

Private Sub CreateControls(ByVal pn As Panel, ByVal howmany As Integer) 
    Dim cbo As AjaxControlToolkit.ComboBox 
    'Dim cbo As DropDownList 
    For i As Integer = 0 To howmany - 1 
     cbo = New AjaxControlToolkit.ComboBox 
     'cbo = New DropDownList 
     cbo.ID = pn.ID & "_cbo" & i 
     cbo.Width = 200 
     cbo.Items.Add("Item 1") 
     cbo.Items.Add("Item 2") 
     cbo.Items.Add("Item 3") 
     cbo.Items.Add("Item 4") 
     cbo.Items.Add("Item 5") 
     cbo.Style.Add("margin", "3px") 
     cbo.AutoPostBack = True 
     pn.Controls.Add(cbo) 
    Next 
    End Sub 

End Class 

답변

1

난 그냥 아약스는 자신이나 휴양을 제어에서 포스트 백 느림했다 있는지 확인하기 위해 테스트를했다. 자, 실제로 그 자체의 아약스 컨트롤을 찾아야합니다. 나는 빈 페이지를 만들었고, 40 개의 아약스 콤보 박스를 넣었다. (각각에 몇 개의 항목 추가), 포스트 카드를 켰다. 페이지를 시작하고 항목을 클릭하면 다시 게시를 완료하는 데 약 3 ~ 4 초가 걸렸습니다.

dropdownlist와 똑같은 기능을했는데 잘 작동합니다. 너무 나쁜 당신은 콤보 박스처럼 그것을 사용하지 않습니다.