Domanda

Ho un controllo ListView che mostra un comportamento strano: le righe si aggiornano solo parzialmente dopo un postback.Spero che qualcuno qui possa far luce sul motivo per cui ciò potrebbe accadere.

Il mio listview DataSource è associato a un elenco di elementi archiviato nello stato della sessione della pagina.Questo è intenzionale, in parte per far scadere le visualizzazioni non aggiornate poiché più utenti visualizzano i dati.In una semplice operazione di resort, l'ordinamento viene gestito sulla pagina tramite javascript e l'ordine dei dati dell'elenco/sessione viene mantenuto sincronizzato tramite callback.La richiamata controlla anche i livelli di autorizzazione.In una particolare operazione del resort più complicata, il javascript sulla pagina effettua un postback alla pagina per gestire la logica di ordinamento.L'elenco/sessione viene aggiornato come nel callback, quindi il controllo listview viene ricollegato ai dati.La pagina viene caricata nuovamente e le righe mostrano il nuovo ordine.Nessun problema, vero?

Il problema è che Alcuni degli elementi nella listview non cambiano valore in base al nuovo ordine.Mentre i collegamenti ipertestuali e il testo che vengono elaborati sulla pagina (ad esempio <%# Eval("ProjectAbbrev") %>) vengono aggiornati in modo appropriato, le caselle di controllo, i valori letterali e i menu a discesa i cui valori sono impostati tramite il metodo dell'evento OnItemDataBound non lo sono: rimangono "congelato" sul posto, anche se l'esecuzione del codice rivela che il metodo viene eseguito durante il postback e che i controlli DOVREBBERO essere impostati sui nuovi valori.Se vado e tronco manualmente l'elenco per dire, metà della dimensione originale, sicuramente solo quegli elementi verranno ripopolati, ma le caselle di controllo e simili mantengono ancora i loro valori originali.

Quindi la mia domanda è:Perché questi elementi non vengono aggiornati insieme al resto degli elementi di controllo listview nel postback?Ho la sensazione di aver frainteso il ciclo di vita della pagina in ASP.NET o di aver riscontrato un bug di qualche tipo.

A questo punto penso che dovrò spostare l'operazione di ordinamento più complicata sulla pagina in javascript, ma sarebbe piuttosto complicato e vorrei evitare di farlo se possibile.


AGGIORNAMENTO:Ho provato a impostare EnableViewState su false e il problema non viene risolto.In ogni caso non potrei usare questa tattica perché altre parti della pagina (salvataggio) alla fine si basano sulla lettura del viewstate.
AGGIORNAMENTO:Fornisco alcuni frammenti di codice nella speranza che possano far luce su questo problema:

Pagina:L'elemento HyperLink verrà aggiornato correttamente dopo il postback, ma il CheckBox a cui è assegnato il valore nel metodo OnQueueRepeater_ItemDataBound rimarrà lo stesso.

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="TextProcessorProjects.ascx.cs" Inherits="ETD.UI.Controls.TextProcessorProjects" %>

<asp:ListView ID="QueueListView" runat="server" OnItemDataBound="OnQueueRepeater_ItemDataBound">
 <ItemTemplate>
  <tr>
   <td><asp:HyperLink runat="server" ID="ProjectIDLink"><%# Eval("ProjectAbbrev") %></asp:HyperLink></td>
   <td><asp:CheckBox runat="server" ID="ScannedCheckBox" BorderStyle="None" /></td>
  </tr>
 </ItemTemplate>
</asp:ListView>

Codice dietro:Al postback, viene eseguito il codice seguente:

protected List<Book> QueueDataItems
{
 get { return (List<Book>)Session["Queue"]; }
 set { Session["Queue"] = value; }
}

else if (IsPostBack && !Page.IsCallback)
{
 // resort QueueDataItems List appropriately
 ResortQueue(Request.Params) 
 // rebind
 QueueListView.DataSource = QueueDataItems;
 QueueListView.DataBind();
}

protected void OnQueueRepeater_ItemDataBound(object sender, ListViewItemEventArgs e)
{
 // ...
 // ... other controls set
 CheckBox scannedCheckBox = e.Item.FindControl("ScannedCheckBox") as CheckBox;
 scannedCheckBox.Checked = book.Scanned;
}

AGGIORNAMENTO:Ho rinunciato a farlo funzionare e ho spostato la mia logica di ordinamento sul lato client con JavaScript.Se qualcuno avesse qualche idea sul perché si stesse verificando questo strano comportamento, sarei comunque molto interessato a sentirli!

È stato utile?

Soluzione

per interesse, su quale punto della pagina stai indicando? Page_Load?

Provalo su OnPreRender - potrebbe aiutarti.

Altri suggerimenti

Sembra che ViewState stia avviando e ripopolando i dati. In ogni caso, se stai eseguendo il Databinding in ogni postback, probabilmente dovresti impostare EnableViewState di ListView su false per ridurre le dimensioni della pagina.

Penso che questo sia legato all'ordine in cui i diversi eventi vengono attivati ​​durante il ciclo di vita della pagina.Vedere Panoramica del ciclo di vita della pagina ASP.NET.Dovresti eseguire l'associazione dati in Page_OnPreRender per assicurarti che la riplopolazione venga eseguita dopo gli eventi di controllo (che causeranno l'aggiornamento dei dati) sulla pagina.

Forse QueueListView viene rilegato per qualche motivo.

Prova a ripristinare il valore DataSource dopo DataBind () per vedere cosa succede

QueueListView.DataBind();
QueueListView.DataSource = null;

Qualche possibilità che ciò possa costituire un problema di memorizzazione nella cache? Ho riscontrato un problema simile utilizzando una visualizzazione elenco con un XMLDatasource. Ho provato a spegnere tutto il viewstate. Vorrei associare la visualizzazione elenco nel codice dietro e utilizzare XPath per scrivere tutto sullo schermo sulla mia pagina aspx. Questo è stato usato in una ricerca .... la prossima volta che ho fatto una ricerca, nessuna delle nuove informazioni è stata mostrata. Il motivo è perché un XMLDatasource ha la memorizzazione nella cache abilitata per impostazione predefinita. Nel mio caso stavo colpendo il DB ogni volta e non avevo bisogno di memorizzarlo nella cache. Ho disattivato la memorizzazione nella cache dell'origine dati e tutti i miei problemi sono stati risolti.

Ne parlo solo perché l'errore che stavo riscontrando sembra identico al tuo. Non riesco a vedere come stai recuperando il libro nel database degli oggetti - e non stai usando un Datasource XML dall'aspetto delle cose ..... ma ho pensato che il commento potesse innescare qualcosa per te. Buona fortuna .... anche se sembra che tu sia già passato :-).

Il controllo della casella di controllo è ReadOnly = true o Enabled = false?

Ho avuto problemi con i controlli con una di queste proprietà impostata come sopra che non si aggiorna, non importa come provo a gestire il controllo nel codice dietro. Penso che disabilitare la viewstate ignorerebbe anche quel piccolo & Quot; feature & Quot; di ASP.NET, ma vale la pena provare.

Inoltre, se gli articoli vengono ordinati tramite il codice lato client, quell'ordine viene conservato sul postback? Non penso che tu possa modificare l'oggetto CLR che hai in sessione tramite javascript.

Non sono sicuro se questo aiuta, sostituisci <% # Eval (" ProjectAbbrev ")% > con Hyperlink.Text assegnato nel metodo OnQueueRepeater_ItemDataBound e vedere se tutte le righe vengono popolate correttamente.

Questo probabilmente non risolverà il tuo problema, ma sarà interessante conoscere il risultato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top