Ich habe ein Formular, in dem der Benutzer einen Wertebereich auswählen kann, indem er Kontrollkästchen aktiviert. Es gibt zwei Listen mit Kontrollkästchen, eines verwendet Ganzzahlen als Werte und das andere verwendet Zeichenfolgen.

Das Problem ist, dass ich dem Benutzer ein berechnetes Ergebnis präsentieren muss, das auf den Werten basiert, die er in den Kontrollkästchen ausgewählt hat. Diese Berechnung kann sehr langsam sein und zwischen 2 und 20 Sekunden liegen.

Derzeit wird die Ajax-Anforderung zur Berechnung des Werts ausgeführt, sobald der Benutzer alle Kontrollkästchen aktiviert. Dies führt jedoch zu einer Anforderung für jedes Kontrollkästchen, auf das sie klicken. Und das berechnete Ergebnis, das bei jeder Anforderung zurückgegeben wird, kommt manchmal in der falschen Reihenfolge an, was bedeutet, dass die langsamste / zuletzt ankommende Antwort diejenige ist, die dem Benutzer präsentiert wird.

Ich muss anscheinend nicht die Antwort auf die vom Benutzer ausgewählten Werte überprüfen, um nur dann ein Ergebnis anzuzeigen, wenn es mit den ausgewählten Kontrollkästchen übereinstimmt. Ich würde denken, ein Hash-Wert wäre die beste Lösung für dieses Problem. Aber ich hatte ein bisschen Probleme, eine geeignete Hash-Funktion mit Implementierungen in C # und Javascript zu finden.

Ich weiß, dass ich nur die Benutzeraktionen zurückgeben könnte, wenn ich die Ergebnisse zurückgeben würde, aber ich müsste trotzdem alle Werte vergleichen, und die Anzahl der Werte kann ziemlich groß sein.

Optimal Ich möchte einen Hash der ausgewählten Werte auf dem Server generieren und dann einen Hash der aktuell ausgewählten Werte auf dem Client generieren, wenn das Ergebnis zurückgegeben wird. Ein Vergleich der beiden Werte würde dann anzeigen, ob das Ergebnis mit den ausgewählten Werten übereinstimmt.

Etwas wie das:

$.ajax({
  type: 'POST',
  url: '/Backend/GetCalculatedResult',
  data: { CheckedIntegers: checkedIntegers, CheckedStrings: checkedStrings },
  success: function(data) {
        if(ResultMatchesSelection(data.SelectionHash)) {
            DisplayResult(data.Result);
        }
  },
  dataType: "json",
});

function ResultMatchesSelection(hash)
{
    var selectionHash = .. generate hash from selected items;
    return hash == selectionHash;
}

Ich habe dieses Problem teilweise behoben, indem ich die Ajax-Anforderung 1 Sekunde nach der letzten Benutzeraktion ausgeführt habe. Wenn der Benutzer 5 Kontrollkästchen nacheinander mit jeweils weniger als einer Sekunde aktiviert, wird die Anforderung nur einmal und nicht fünfmal ausgeführt.

Ich hätte wirklich gerne eine Kombination aus beiden.

Haben Sie eine Idee, wie ich dieses Hashing sowohl auf Server- als auch auf Clientseite durchführen kann? Oder wenn Sie eine Idee haben, wie dies auf andere Weise gelöst werden könnte, sprechen Sie bitte Ihre Meinung aus :)

0
Moulde 12 Okt. 2012 im 12:33

3 Antworten

Beste Antwort

Anstatt ausgewählte Werte zu hashen und sie mit dem Ajax-Ergebnis zu überprüfen, können Sie in jQuery eine globale Variable deklarieren, z. B. requestNo, und diesen Variablenwert bei jedem Ajax-Aufruf senden (inkrementieren Sie den Wert requestNo für jeden Ajax Anfrage).

Während Sie eine Ajax-Antwort zurückgeben, geben Sie anstelle des Hash-Werts den Wert requestNo zurück, den Sie mit der Ajax-Anforderung erhalten haben. Überprüfen Sie auf der Clientseite, ob die requestNo in der Ajax-Antwort mit dem aktuellen requestNo -Wert übereinstimmt, und zeigen Sie die Ergebnisse an, wenn sie identisch sind.

2
dav_i 12 Okt. 2012 im 09:19

Versuchen Sie, dem Benutzer eine visuelle Anzeige (Laden des Bildes) zu geben, dass die Berechnung noch auf dem Server stattfindet. Wenn Sie Ajax.ActionLink verwenden, verwenden Sie Folgendes: http://msdn.microsoft.com/en-us/library/system.web.mvc.ajax.ajaxoptions.loadingelementid (v = vs.108) .aspx

Es gibt auch viele Möglichkeiten, dies mit jQuery zu tun. JQuery verfügt über Ajax-Methoden: http://www.w3schools.com/jquery/jquery_ref_ajax.asp Sie können also ajaxStart und ajaxStop / ajaxComplete verwenden, um Ihr Ladebild ein- und auszublenden.

1
Yasser Sinjab 12 Okt. 2012 im 10:52

Ich habe einen anderen Weg eingeschlagen, der das Problem zu lösen scheint. Anstatt Werte zu überprüfen, speichere ich die letzte Ajax-Anforderung und jedes Mal, wenn eine Aktion ausgeführt wird, wird überprüft, ob die letzte Anforderung noch geladen wird. Wenn dies der Fall ist, wird sie abgebrochen und die neue Anforderung wird gesendet.

Wenn, wie ich glaube, sichergestellt ist, dass nicht zwei Anfragen gleichzeitig anstehen können, sollte dies das Problem in Ordnung bringen :)

0
Moulde 12 Okt. 2012 im 10:23