Javascript 如何从Controller创建进度条来处理MVC3中的长流程
我有一个使用RAZOR视图的vb.net MVC3应用程序。有些函数需要很长时间才能完成,因为它们是从数据库编译数据的。在这漫长的等待过程中,浏览器屏幕是白色的,除了活动环之外,没有任何迹象表明它正在做它应该做的事情。我想做的是创建一个进度条,使用一些简单的数学计算方法来确定进度条完成百分比,并在屏幕上显示它,而不是在纯白色的浏览器屏幕上。。我确信我需要使用某种Jquery小部件来实现这一点。我已经在谷歌搜索过了,但似乎没有任何东西能满足我的需要。。当白色屏幕显示直至完成时调用的控制器功能如下:Javascript 如何从Controller创建进度条来处理MVC3中的长流程,javascript,jquery,asp.net-mvc,vb.net,asp.net-mvc-3,Javascript,Jquery,Asp.net Mvc,Vb.net,Asp.net Mvc 3,我有一个使用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>
@code
ViewData(“标题”)=“存档以前的配置讲义”
结束代码
您将要归档去年会议的所有讲义。如果继续,所有这些讲义都将移动到存档
@ActionLink(“开始归档”、“开始归档”、“讲义归档”)
@ActionLink(“返回管理工具”、“索引”、“管理”)
关于如何添加一个简单的进度条的任何想法,我假设它必须由控制器本身触发…为了获得更好的响应,您可以在这里看到html代码,但您可以很容易地做到的是让您的流程在ajax.begin中运行,并使用begin表单的onbegin/oncomplete参数调用startProgressbar/stopProgressbar方法。只需在一个div中设置一个动画gif,并使上面的两种方法对该div进行显示/隐藏。当前页面/操作的设计无法实现您的基本要求。您正在单击向控制器发出请求的链接。在呈现和返回响应之前,控制器将等待操作完成。这与进行ajax调用不同,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>");
}
});
(我是一名c#guy,因此如果vb.net不正确,我深表歉意,这只是我设想如何实现该操作的一个示例)。
不幸的是,如果我不知道您实施的“归档讲义”是什么,我真的无法告诉您一个显示行动进展的好解决方案。但我觉得这是许多应用程序在处理密集型操作时使用的标准解决方案。实际上没有与此相关的HTML代码,因为它完成后会返回到调用索引。这里必须是初始HTML代码,对吗?您想要用来实际显示此进度条的页面?那么,上面的这个方法叫什么,一个按钮?计时器?我可以让beginArchive返回Success而不是使用重定向吗?您可以在jquery post调用的函数回调中执行任何您想要的操作。如果您希望在成功后显示消息并保持在同一页面上,只需将
窗口.location
行替换为其他行即可。如果我假设jquery/javascript知识是我答案的一部分,我很抱歉。但据我所知,这是一个很好的处理方法。我指的是数据。状态==“成功”这是函数本身返回的结果吗???是的,您可以根据需要执行操作。但我想你会希望得到某种回应,告诉你行动是否成功。我将添加我得到的作为示例控制器操作。
[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