15 messaggi dal 14 marzo 2011
Buongiorno a tutti.
Sto cercando di imparare come funziona l'UpdatePanel di Ajax. Uso VWD 2008 e le estensioni ajax. Ho due UpdatePanel, uno contiene un Button e l'altro una Label. Molto semplicemente, quando si fa click sul Button, la Label mostra un valore che si incrementa. Il codice:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>Untitled Page</title>
</head>

<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<div>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:Button ID="Button1" runat="server" Text="Increment" OnClick="Button1_Click" />
</ContentTemplate>
</asp:UpdatePanel>

<asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click" />
</Triggers>
<ContentTemplate>
<asp:Label ID="Label1" runat="server" /><br />
</ContentTemplate>
</asp:UpdatePanel>
</div>
</form>
</body>
</html>

E la parte code-behind:

Partial Class _Default
Inherits System.Web.UI.Page

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
If Session("Var") Is Nothing Then Session("Var") = 0
Session("Var") += 1
End Sub

Protected Sub Label1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Label1.Load
If Session("Var") Is Nothing Then Session("Var") = 0
Label1.Text = Session("Var")
End Sub
End Class

L'applicazione si comporta molto stranamente:
- Al primo click la Label visualizza 0. Questo succede perché prima viene eseguita la Label1_Load e poi Button1_Click.
- Ma un altro fatto che non riesco a spiegarmi: la Button1_Click viene eseguita 2 volte! Così dai click successivi la Label visualizza 2, 4, 6... ed è comunque sempre indietro di uno "step" nella visualizzazione.

Quindi:
- Come posso fare perché venga eseguito prima il Click e poi il Load? Che senso ha il comportamento osservato?
- Perché il click viene eseguito 2 volte?

Grazie a tutti
Massimo
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,


Come posso fare perché venga eseguito prima il Click e poi il Load


Usa il PreRender al posto del Load. Il PreRender si verifica DOPO gli eventi lato server sollevati dai controlli.


- Perché il click viene eseguito 2 volte?


Non conosco bene il VB.NET ma ho proprio l'impressione che la Sub Button1_Click venga invocata 2 volte:
- La prima perché l'hai indicata sull'OnClick del bottone;
- La seconda perché l'hai dichiarata come gestore ("Handles") dell'evento click del bottone. Togli l'Handles.

Con questo codice dovrebbe funzionarti:

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
    If Session("Var") Is Nothing Then Session("Var") = 0
    Session("Var") += 1
End Sub

Protected Sub Label1_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Label1.PreRender
    If Session("Var") Is Nothing Then Session("Var") = 0
    Label1.Text = Session("Var")
End Sub


Un'ultima cosa: avrai notato che cliccando il bottone ti si ricarica pure l'UpdatePanel1. Se non vuoi che questo succeda, impostagli ChildrenAsTriggers="false".

ciao.

Enjoy learning and just keep making
15 messaggi dal 14 marzo 2011
Ma sei un mito!
Funziona tutto benissimo con le modifiche che mi hai suggerito!
Grazie, grazie, grazie...
Massimo

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.