2011-06-24 25 views
1

我有一個完全dynamiclly生成的頁面,有一組linkbuttons基本上在UpdatePanel切換視圖。除了當我有一個生成的按鈕需要調用一個函數來操作更新面板中的數據時,所有這些工作都很好。動態ASP.Net UpdatePanel內容涉及他們自己的AsyncPostback

的.aspx

<div> 
    <asp:panel runat="server" ID="buttons" /> 

    <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional" > 
     <ContentTemplate> 
     </ContentTemplate> 
    </asp:UpdatePanel> 

</div> 

代碼隱藏

Private Sub testpage_Init(sender As Object, e As System.EventArgs) Handles Me.Init 
    For i As Integer = 0 To 5 'create a few dummy buttons 
     Dim Btn As New LinkButton 
     Btn.ID = "btn" & i.ToString 
     Btn.Text = i.ToString 
     AddHandler Btn.Click, AddressOf btn_Click 
     buttons.Controls.Add(Btn) 

     Dim Trgr As New AsyncPostBackTrigger 'async link them to the updatepanel 
     Trgr.ControlID = Btn.ID 
     UpdatePanel1.Triggers.Add(Trgr) 
    Next 
End Sub 

Private Sub btn_Click(sender As Object, e As System.EventArgs) 
    ScriptManager.GetCurrent(Me.Page).AddHistoryPoint(sender.id.ToString, sender.id.ToString, sender.id.ToString) 

    UpdatePanel1.ContentTemplateContainer.Controls.Add(New LiteralControl(sender.id.ToString)) 'Show it got clicked 

    If sender.id.ToString = "btn1" Then 
     Dim Btn As New Button 
     Btn.ID = "test" 
     Btn.Text = "Click me" 
     AddHandler Btn.Click, AddressOf subbtn_Click 
     UpdatePanel1.ContentTemplateContainer.Controls.Add(Btn) 
    End If 
End Sub 

Private Sub subbtn_Click(sender As Object, e As System.EventArgs) 
    UpdatePanel1.ContentTemplateContainer.Controls.Add(New LiteralControl("It doesn't work")) 
End Sub 

所以,問題是當page_init執行它不知道,它永遠不會再現按鈕被選中其中的LinkBut​​ton和反過來不會引發事件。我看到有人使用會話來存儲控件列表和/或當前幀,但我不認爲這是可接受的解決方案。當然,必須有一種方法來做到這一點。

難道我無法獲得Navigate事件之外的ScriptManager當前/上一步信息嗎?

Asp.net 4.0與最新ajax工具包。

感謝您的幫助。

回答

0

這是(我認爲)網絡表單的一個基本缺陷,處理它的方式都是一種痛苦。架構應該包含一個本地構造,以允許事件綁定在回發後保留而不重新創建控件。通常情況下,您不希望在回發後使用該控件,但您必須跟蹤&以重新捕捉事件。

我通常會存儲一個字符串列表,其中包含的信息可用於重新創建ViewState中的所有控件;然後在LoadViewState上重新創建它們;將它們作爲佔位符控件的子項添加到頁面中;並在SaveViewState中再次從佔位符中移除它們。這並不是那麼可怕,它只是單調乏味。

由於您使用的是UpdatePanel,因此您可以選擇使用表單字段__EVENTTARGET,該字段將包含啓動異步回發的控件的唯一ID。你可能能夠從中提取你需要的東西,並根據它來採取你需要的任何行動。

+0

啊,我忘了提及我唯一的想法是讓按鈕ID包含知道哪個部分被選中所需的信息。我從來沒有做過自定義viewstate的東西,所以我不知道有一種方法來訪問init中的數據。我以爲你必須等到它加載。我得看看那個。 – jheizer

+0

ViewState不存在直到LoadViewState事件,但您可以在「Page_Load」之前隨時重新創建控件,並且事件仍將被觸發。老實說,如果你可以在ID中編碼一些東西,它會容易得多,如果稍微好點。 –

+0

聽起來像按鈕ID是要走的路。我覺得很好,我提出了2個想法中的1個,但是這是唯一的選擇。明天我會考慮一下。 – jheizer

相關問題