in effetti non è semplice da riassumere...
la pagina ha una multiview: la defaultview presenta un elenco di preventivi cliccando ognuno dei quali si viene ri-indirizzati alla pagina stessa ma con un parametro in querystring (vecchio asp style).
Torno quindi alla pagina con un parametro in querystring (ispostback=false), si viene posizionati in una view diversa con il dettaglio di un preventivo (la sua ultima versione) e vengono caricati i listitem di una dropdownlist con le diverse versioni del preventivo.
Ad ogni selectedindexchanged di questa ddl veine fatto un postback con rilettura dei dati del preventivo relativi alla versione selezionata, quindi la view si aggiorna con i dati della versione scelta.
Ecco, con Chrome questo succede sempre (ispostback sempre true), con Firefoz funziona a volte alterne: in debug vedo che la prima volta lo fa (ispostback=true) e carica i dati della versione selezionata, la seconda invece lo fa ricaricando la pagina (ispostback = false) e infatti mi ripropone l'ultima versione del preventivo anzichè quella selezionata.
Ho 1800 righe di codice in markup e 2700 in codebehind, provo a sintetizzare
codice:
<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/_Admin/_admin.Master" CodeBehind="preventivi.aspx.vb" Inherits="WEBORDINI.preventivi" ValidateRequest="false" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server"></asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<asp:HiddenField ID="HFIDprev" runat="server" />
<asp:HiddenField ID="HFnprev" runat="server" />
<asp:MultiView ID="MultiView1" runat="server" ActiveViewIndex="3">
<asp:View runat="server" ID="inserimento">
<asp:DropDownList ID="versioni" ClientIDMode="Static" CssClass="form-control maxw250" runat="server" OnSelectedIndexChanged="versioni_SelectedIndexChanged" AutoPostBack ="true"></asp:DropDownList>
<div class="col-xs-12 col-md-6">
<asp:TextBox ID="cliente" ClientIDMode="static" runat="server" TextMode="MultiLine" placeholder="Dati del cliente *" Rows="5" ValidationGroup="mcins"></asp:TextBox>
</div>
<div class="col-xs-12 col-md-6">
<div class="col-xs-6 col-md-4" style="height: 30px; padding: 6px 0px 0px 10px;">Validità offerta:</div>
<div class="col-xs-6 col-md-8">
<asp:TextBox ID="val_offerta" runat="server" MaxLength="20" CssClass="bgc"></asp:TextBox>
</div>
....
</div>
...
<div class="col-xs-12">
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<table id="schemaprezzi" class="macbtab">
<tr>
... varie righe e vari campi che si aggiornano a vicenda all'interno dell'update panel
<td><asp:TextBox ID="X0_note" runat="server" MaxLength="15"></asp:TextBox></td>
</tr>
</table>
</div>
</ContentTemplate>
</asp:UpdatePanel>
</div>
<div class="row" style="text-align: center;">
<asp:Button ID="btnok" runat="server" Text="Conferma i dati" ClientIDMode="Static" OnClick="btnok_Click" CausesValidation="true" ValidationGroup="mcins" />
...
</div>
</asp:View>
<asp:View runat="server" ID="conferma"> ...... </asp:View>
<asp:View runat="server" ID="firma"> ......... </asp:View>
<asp:View ID="elenco" runat="server">
<h1>Elenco Preventivi"></h1>
<asp:Repeater ID="rordini" runat="server" EnableViewState="true">
<HeaderTemplate>
<table class="table mactab gridtable">
<tr> .....</tr>
</HeaderTemplate>
<ItemTemplate>
<tr class="borderrow">
<td><asp:Label ID="r_ID" runat="server" Text='<%# Eval("ID") %>' Visible="false"></asp:Label></td>
<td>
<asp:Label ID="r_numprev" runat="server" Text='<%# Eval("c_numprev")%>'></asp:Label></td>
<td>
<asp:LinkButton ID="lb_data" Text='<%# String.Format("{0:dd/MM/yy HH:mm}", Eval("c_data")) %>' CommandName="seleziona" ToolTip="Vedi" runat="server" Style="color: #333 !important; font-weight: bold;"></asp:LinkButton>
</td>
<td>
<asp:Label ID="r_cliente" runat="server" Text='<%# Eval("c_cliente") %>'></asp:Label>
</td>
<td>
'vari imagebutton per vedere (commandname="seleziona") /duplicare/eliminare il preventivo elencato
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
</asp:View>
</asp:MultiView>
</asp:Content>
codebehind
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
If "" & Request("IDprev") <> "" Then
Dim IDprev As String = Request("IDprev")
HFIDprev.Value = IDprev
'seleziono il preventivo e compilo tutti i campi della view
'in base all'id del preventivo ricevuto in querystring
recuperadati(IDprev)
'popolo dll versioni: il valore HFnprev.value è appena stato aggiornato dalla recuperadati!
popoladdlrelease(Int(HFnprev.Value))
'e switcho sulla view corretta
MultiView1.SetActiveView(MultiView1.Views(0))
Else
'crea elenco preventivi della view(3)
...
End If
End If
End sub
'itemcommand di una riga dell'elenco preventivi nella view(3)
Protected Sub rordini_ItemCommand(source As Object, e As RepeaterCommandEventArgs) Handles rordini.ItemCommand
Dim rI As RepeaterItem = rordini.Items(e.Item.ItemIndex)
Dim Idprev As Integer = Int(DirectCast(rI.FindControl("r_ID"), Label).Text)
Dim numprev As Integer = Int(DirectCast(rI.FindControl("r_numprev"), Label).Text)
If e.CommandName.ToLower().Equals("seleziona") Then
Response.Redirect("preventivi.aspx?&idprev=" & Idprev)
End If
....
end sub
'preparo i listitem della ddl
Protected Sub popoladdlrelease(ByVal nprev As Integer)
Dim cn = New System.Data.SqlClient.SqlConnection(...)
Using cn
cn.Open()
Dim strsql = "SELECT ID,c_Data FROM preventivi WHERE c_numprev =" & nprev & " ORDER BY c_data desc"
Dim cmd As New SqlCommand(strsql, cn)
Dim rs As SqlDataReader = cmd.ExecuteReader()
If rs.HasRows Then
Dim dtt As New DataTable
dtt.Load(rs)
If dtt.Rows.Count > 1 Then
versioni.Items.Clear()
For Each row In dtt.Rows
versioni.Items.Add(New ListItem(String.Format("{0:dd/MM/yy HH:mm}", row.item("c_data")), row.item("ID")))
Next
versioni.SelectedValue = HFIDprev.Value
End If
End If
End Using
End Sub
'selezione di una voce dalla dropdown delle versioni
Protected Sub versioni_SelectedIndexChanged(sender As Object, e As EventArgs)
Dim ddl As DropDownList = sender
Dim idvers As Integer = ddl.SelectedValue
recuperadati(idvers)
If ddl.SelectedIndex > 0 Then
'è una versione precedente e non devo permettere le modifiche
'lavoro lato client per enabled/disabled dei campi, qui nascondo solo il bottone salva
btnok.Visible = False
Else
btnok.Visible = True
End If
End Sub