Domanda

Stiamo scrivendo un'applicazione di ricerca che salva i criteri di ricerca nello stato della sessione ed esegue la ricerca all'interno di un pannello di aggiornamento asp.net. A volte, quando eseguiamo ricerche multiple in successione, la seconda o la terza ricerca a volte restituiscono risultati dalla prima serie di criteri di ricerca.

Esempio: la nostra prima ricerca facciamo uno sguardo a " John Smith " - > Vengono visualizzati i risultati di John Smith. La seconda ricerca viene eseguita su "Bob Jones" - > Vengono visualizzati i risultati di John Smith.

Salviamo tutti i criteri di ricerca nello stato della sessione, come ho detto, e lo leggiamo dallo stato della sessione all'interno della richiesta Ajax per formattare la query DB. Quando inseriamo punti di interruzione in VS, tutto si comporta normalmente, ma senza di essi otteniamo i criteri e i risultati di ricerca originali.

La mia ipotesi è perché sono salvati in sessione, che la richiesta Ajax in qualche modo ottiene la propria sessione e salva i criteri su quella, quindi recupera i criteri da quella sessione ogni volta, ma le cose non asincrone sono in grado di vedere quando i criteri vengono modificati e salva le modifiche per dichiarare di conseguenza, ma poiché provengono da due sessioni diverse c'è una disparità in ciò che viene salvato e letto.

EDIT ::: Per approfondire, c'è stato un suggerimento di aggiungere i criteri di ricerca alla stringa di query che normalmente è una buona pratica e sono d'accordo su come dovrebbe essere, ma seguendo i nostri requisiti non lo vedo fattibile. Lo vogliono in modo che l'utente compili i controlli di input colpendo la ricerca e non vi sia alcun ricaricamento della pagina, l'unica cosa che vedono è un indicatore di avanzamento sulla pagina e hanno ancora la possibilità di navigare e utilizzare altre funzionalità nella pagina corrente. Se dovessi aggiungere criteri alla stringa di query, dovrei fare un'altra richiesta per caricare l'intera pagina, che a seconda dei criteri di ricerca può richiedere molto tempo. Questo è il motivo per cui stiamo usando una chiamata Ajax per eseguire la ricerca e perché non stiamo causando un'altra richiesta a pagina intera ..... Spero che questo chiarisca la situazione.

È stato utile?

Soluzione

Non ci sono più sessioni tra normali caricamenti di pagina ASP.NET, postback e postback parziali ASP.NET AJAX. Posso dirtelo con certezza.

Invece di archiviare la stringa di ricerca nella sessione, che ne dici di usare direttamente i contenuti di TextBox di ricerca? Non riesco a pensare a nessun motivo per cui dovresti mescolarlo, poiché sarà comunque disponibile durante l'intero ciclo di vita della pagina.

Infine, riguardo ai tuoi requisiti ... L'uso di UpdatePanel non soddisfa il requisito secondo cui i tuoi utenti dovrebbero essere in grado di utilizzare altre funzionalità sulla pagina se tale funzionalità genera anche postback parziali. È possibile eseguire solo un postback parziale alla volta. Se viene generato un altro evento mentre la ricerca è in corso, la richiesta di ricerca verrà annullata senza alcuna notifica.

L'uso di un metodo di pagina o di un servizio Web per la ricerca sarebbe un modo molto più veloce, più facile e più robusto di farlo. Di solito non collego il mio sito, ma penso che un paio dei miei post siano esattamente pertinenti a quello che stai facendo:

È possibile utilizzare un controllo utente per eseguire il rendering dei risultati della ricerca tramite un servizio Web (molto più veloce di un UpdatePanel): http://encosia.com/2008/02/05/boost-aspnet-performance-with-deferred-content-loading/

In alternativa, è possibile restituire i risultati della ricerca come JSON e renderli sul lato client (anche più velocemente): http://encosia.com/2008/06/26/use-jquery-and-aspnet-ajax-to- build-a-lato client-ripetitore /

Uno di questi metodi potrebbe portare la tua funzionalità di ricerca fuori dal paradigma del postback parziale, in modo che funzioni più velocemente, utilizzi meno larghezza di banda e risorse del server e non precluda l'esecuzione simultanea di altre attività UpdatePanel.

Altri suggerimenti

Solo un altro pensiero, ho sempre avuto problemi con updatepanel e preferisco scrivere le mie richieste ajax dell'atlante direttamente attraverso la libreria, usando PageMethods. Hai un maggiore controllo su ciò che invii e ricevi. UpdatePanel invia l'intera pagina e riceve l'intera gerarchia di controllo della pagina, quindi analizza ciò che è "fresco" e lo visualizza.

Modifica: qual è il codice che stai utilizzando per salvare i criteri nella sessione? E hai un codice nel metodo che controlla effettivamente se la sessione ha dei criteri salvati e invece lo restituisce? Forse è per questo che i postback del 2 ° / 3 ° pannello di aggiornamento restituiscono la prima serie di criteri anziché i risultati previsti? A parte questo, so facendo alcune cose pesanti di Atlas ajax che sicuramente non ci sono due sessioni (una per il postback normale, una per l'asincrono) C'è qualche possibilità che tu stia usando un webfarm?

Modifica n. 2: non sarei stato in grado di scrivere ciò che ho scritto sopra (primo paragrafo) se non fossi stato un fan di qualcuno che ha risposto anche: https://stackoverflow.com/users/60/dave-ward

Devi impostare la proprietà EnableSession dell'attributo WebMethod per la funzione che stai chiamando.

[WebMethod( EnableSession=true )]
public static void DoSomething(){
    /// ....
}

Se si utilizzano gestori generici .ashx, derivare dall'interfaccia IRequiresSessionState

public class ActionRequest : IHttpHandler, IRequiresSessionState
{
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top