如何从Controller创建一个Progress Bar来处理MVC3中的长进程

时间:2012-08-06 01:18:06

标签: javascript jquery asp.net-mvc vb.net asp.net-mvc-3

我有一个使用RAZOR视图的vb.net MVC3应用程序。由于它们正在从数据库编译数据,因此某些功能需要很长时间才能完成。在这漫长的等待期间,浏览器屏幕是白色的,并且没有迹象表明它正在做什么,而不是活动环。我想要做的是创建一个进度条,在count方法上使用一些简单的数学来确定进度条百分比完成并在屏幕上显示它而不是纯白色的浏览器屏幕..我确定我需要使用某种类型的Jquery小部件执行此操作。并且看了很多谷歌,但似乎没有什么似乎打击我需要的东西..白色屏幕显示,直到它完成时调用的控制器功能如下:

      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是这样的:

@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>

关于如何添加一个简单的进度条到我假设的任何想法都必须由控制器本身触发......

2 个答案:

答案 0 :(得分:2)

使用当前的页面/操作设计无法实现您基本要求的内容。您正在单击向控制器发出请求的链接。在呈现并返回响应之前,控制器将等待操作完成。这与进行ajax调用不同,后者会将数据返回到当前页面,而不是将您引导到新的URL。有很多方法可以做到这一点,其中很多都取决于您对工作方式的要求。

如果是我,我试图做大手术,这就是我要做的。 显示一个微调器或某种图标,并显示“这可能需要一段时间”的消息,并对您的操作发出ajax请求。当操作返回时,您可以显示消息或重定向到新路径。

使用jquery

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

这假设您的beginArchive方法返回json,如{"status":"success"}{"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

(我是一名c#家伙,如果vb.net不对,请道歉,这只是我设想实施行动的一个例子)。 不幸的是,如果不了解你的“归档讲义”的实施情况,我真的无法告诉你一个很好的解决方案来展示行动的进展情况。但我觉得这是许多应用程序在处理密集型操作时使用的标准解决方案。

答案 1 :(得分:0)

你的html代码很适合在这里看到更好的响应,但你可以轻松做的就是让你的进程在ajax.beginform中运行,并使用begin表单的onbegin / oncomplete参数来调用startProgressbar / stopProgressbar方法。只需要一个div中的动画gif,并使上面的两个方法为该div做一个show / hide。