2 Stimmen

Wie man einen Fortschrittsbalken von Controller zu langen Prozess in MVC3 behandeln zu erstellen

Ich habe eine vb.net MVC3-Anwendung mit RAZOR Ansichten. Einige der Funktionen nehmen eine lange Zeit zu vervollständigen aufgrund der Tatsache, dass sie Daten aus der Datenbank kompiliert werden. Während dieser langen Wartezeit ist der Browser-Bildschirm weiß und es gibt keine Anzeichen dafür, dass es tut, was seine andere als die Aktivität Ring soll. Was ich tun möchte, ist eine Fortschrittsanzeige zu erstellen, einige einfache Mathematik auf die Zählung Methode verwenden, um den Fortschrittsbalken Prozent abgeschlossen zu bestimmen und zeigen diese auf dem Bildschirm anstelle der einfachen weißen Browser-Bildschirm. Ich bin sicher, dass ich dies mit einem Jquery-Widget einer Art tun müssen. Und haben alle über Google gesucht, aber nichts scheint zu treffen, was ich hier benötige. Die Controller-Funktion, die aufgerufen wird, wenn der weiße Bildschirm angezeigt wird, bis es beendet ist, ist unten:

      Function beginArchive()
        Dim cList As List(Of cours) = db.courses.ToList
        For Each x In cList
            Dim indCourse = x
            Dim courHfile As String = archiveFiles(x.course_id)
            Dim arcCourse As New archive
            arcCourse.cDesc = indCourse.course_description
            If Not String.IsNullOrEmpty(courHfile) Then
                arcCourse.cHandouts = courHfile
            End If
            arcCourse.cHours = indCourse.course_hours
            arcCourse.conNum = Convert.ToInt16(indCourse.courseNum)
            arcCourse.cPre = indCourse.course_prefix
            arcCourse.cRef = indCourse.course_ref
            arcCourse.cSpeaker = indCourse.course_speaker
            arcCourse.cTitle = indCourse.course_title
            db.archives.AddObject(arcCourse)
            db.SaveChanges()
            Dim testSuccess As Integer = delOldFiles(indCourse.course_id)
        Next
        Return RedirectToAction("Index", "Admin")

    End Function

Razor View ist dies:

@Code
ViewData("Title") = "Archive Previous Conf. Handouts"
End Code
<fieldset>
<h2>You are about to archive all handouts from last years conference. If you continue all of those handouts will be moved to the archive</h2>
<div id="sidebar3">
<p>

@Html.ActionLink("Begin Archive", "beginArchive","handoutArchive")
@Html.ActionLink("Back to Admin Tools", "Index", "Admin")
</p>
</div>
</fieldset>

Irgendwelche Ideen, wie ich über das Hinzufügen eines einfachen Fortschrittsbalken zu diesem gehen würde, die ich annehme, müsste durch den Controller selbst ausgelöst werden...

2voto

Matt Phillips Punkte 10783

Was Sie im Grunde genommen wollen, kann mit dem derzeitigen Design Ihrer Seite/Aktionen nicht erreicht werden. Sie klicken auf einen Link, der eine Anfrage an Ihren Controller stellt. Der Controller wird warten, bis die Aktion beendet ist, bevor er eine Antwort rendert und zurückgibt. Das ist etwas anderes als ein Ajax-Aufruf, der die Daten an die aktuelle Seite zurückgibt, anstatt Sie zu einer neuen URL zu leiten. Es gibt viele Möglichkeiten, dies zu tun, und viele von ihnen hängen von Ihren Anforderungen ab, wie Sie es arbeiten wollen.

Wenn ich an meiner Stelle eine große Operation durchführen wollte, würde ich Folgendes tun. Zeigen Sie einen Spinner oder eine Art Symbol mit einer Meldung an, die besagt, dass dies eine Weile dauern könnte, und stellen Sie eine Ajax-Anfrage an Ihre Aktion. Wenn die Aktion zurückkommt, können Sie eine Nachricht anzeigen oder zu einer neuen Route umleiten.

Ein Beispiel mit jquery

$.post('beingArchive/2012', function(data) {
  if(data.status === "success"){
        window.location.replace("/success");
  }else{
        $("#error-div").html("<em>Something went wrong!</em>");
  }
});

Dies setzt voraus, dass Ihr beginArchive Methode liefert json wie {"status":"success"} o {"status":"error archiving reason blah"}

    [HttpPost]
    Public Function beginArchive() As JsonResult
    Dim status = "success"

    Try
            'do the archiving
    Catch e As Exception
        status = "error occurred"
    End Try
    Return New Json(New With { _
    Key .status = status _

    })
    End Function

(Ich bin ein c# Kerl so Entschuldigungen, wenn die vb.net nicht richtig ist, es ist nur ein Beispiel, wie ich die Umsetzung der Aktion vorstellen). Ohne mehr über Ihre Implementierung der "Archivierung von Handouts" zu wissen, kann ich Ihnen leider nicht wirklich eine gute Lösung für die Anzeige des Fortschritts der Aktion nennen. Ich glaube aber, dass dies eine Standardlösung ist, die viele Anwendungen bei der Verarbeitung intensiver Vorgänge verwenden.

0voto

Phil Punkte 1744

Ihr HTML-Code wäre gut, hier für eine bessere Antwort zu sehen, aber was Sie leicht genug tun könnte, ist Ihr Prozess in einem ajax.beginform laufen, und verwenden Sie die onbegin / oncomplete Parameter der begin Form, um eine startProgressbar / stopProgressbar Methode aufrufen. Haben Sie einfach eine animierte gif in einem div, und machen diese 2 Methoden oben tun, eine Show / hide für diese div.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X