2011-06-24 20 views
1

私は完全に動的に生成されたページを持っており、基本的に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の現在の/前のステップ情報を取得する方法はありませんか?

最新のajaxツールキットを使用したAsp.net 4.0。

ありがとうございました。

答えて

0

これはウェブフォームの基本的な欠陥の1つであり、それを処理する方法はすべて苦労しています。アーキテクチャーには、コントロールを再作成せずにポストバック後にイベント・バインディングを永続させるためのネイティブ構成が含まれている必要があります。多くの場合、ポストバック後にコントロールを使用することには関心がありませんが、イベントをキャプチャするためには&を再作成するように強制されます。

私は通常、すべてのコントロールを再作成するために使用できる情報を含む文字列のリストをViewStateに格納します。 LoadViewStateに再作成してください。それらをプレースホルダコントロールの子としてページに追加します。 SaveViewStateでプレースホルダから再度削除します。これは本当にひどいことではありません。ちょっと面倒です。

UpdatePanelを使用しているので、非同期ポストバックを開始したコントロールの一意のIDを含むフォームフィールド__EVENTTARGETを使用するオプションがあります。あなたはそれから必要なものを抽出し、それに基づいて必要なアクションを取ることができます。

+0

ああ、唯一のアイデアは、ボタンIDにどのセクションが選択されたかを知るために必要な情報が含まれるようにすることでした。私はカスタムビューステートのものを作ったことがないので、initの中でそのデータにアクセスする方法がないことは気づいていませんでした。私はあなたがそれがロードされるまで待たなければならないと思った。私はそれを調べなければならないでしょう。 – jheizer

+0

Viewstateには 'LoadViewState'イベントがありませんが、' Page_Load'の前にいつでもコントロールを再作成することができ、イベントはまだ起動されます。正直なところ、IDで何かをエンコードすることができれば、はるかに簡単です。 –

+0

ボタンIDのような音は、行く方法です。私は2つのアイデアのうち1つを思いついたが、それは唯一の選択肢だと思う。私は思う明日に行くと思う。 – jheizer

関連する問題