2

我有一个使用 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

剃刀视图是这样的:

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

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

4

2 回答 2

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

(如果 vb.net 不正确,我很抱歉,这只是我设想如何实施行动的一个例子)。不幸的是,如果不知道更多关于“归档讲义”的实现是什么,我真的不能告诉你一个很好的解决方案来显示行动的进展情况。但我觉得这是许多应用程序在处理密集操作时使用的标准解决方案。

于 2012-08-06T02:16:23.290 回答
0

您的 html 代码会很高兴看到这里以获得更好的响应,但是您可以轻松地做的是让您的进程在 ajax.beginform 中运行,并使用开始表单的 onbegin/oncomplete 参数来调用 startProgressbar / stopProgressbar 方法. 只需在 div 中有一个动画 gif,并让上面的 2 种方法为该 div 显示/隐藏。

于 2012-08-06T01:45:39.407 回答