如何从控制器创建进度条来处理MVC3中的长流程

How to create a Progress Bar from Controller to handle long process in MVC3

本文关键字:MVC3 处理 控制器 创建      更新时间:2023-09-26

我有一个使用RAZOR视图的vb.net MVC3应用程序。有些函数需要很长时间才能完成,因为它们是从数据库中编译数据的。在这漫长的等待过程中,浏览器屏幕是白色的,除了活动环之外,没有任何迹象表明它在做它应该做的事情。我想做的是创建一个进度条,使用一些简单的计数方法来确定进度条的完成百分比,并将其显示在屏幕上,而不是纯白色的浏览器屏幕上。。我确信我需要用某种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视图是这样的:

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

关于我将如何在其中添加一个简单的进度条的任何想法,我认为它必须由控制器本身启动。。。

您的页面/操作的当前设计无法实现您的基本要求。您正在单击一个向控制器发出请求的链接。控制器将等待操作完成,然后再渲染并返回响应。这与进行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方法返回类似于{"status":"success"}{"status":"error archiving reason blah"} 的json

    [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不正确,我很抱歉,这只是我设想如何实现该操作的一个例子)。不幸的是,如果我不了解"归档讲义"的实施方式,我真的无法告诉你一个显示操作进度的好解决方案。但我觉得这是许多应用程序在处理密集型操作时使用的标准解决方案。

您的html代码最好在这里看到,以获得更好的响应,但您可以很容易地在ajax.beginfo中运行流程,并使用begin表单的onbegin/oncomplete参数来调用startProgressbar/stopProgressbar方法。只需在div中有一个动画gif,并使上面的两个方法为该div进行显示/隐藏。