CODE:
我的流程需要很长时间才能完成。我们称之为LongProcess
。我想在客户端上经常轮询以获取该进程的Status
。我的最终目标是使用Status
中的值来更新进度条。
这是来自Controller的基本设置:
// get the current status
public JsonResult GetStatus()
{
return new JsonResult(Status);
}
public void SetStatus(int i)
{
Status = i;
}
// runs for 20 seconds, updates status while it runs
public JsonResult LongProcess()
{
for(int i = 0; i < 10; i++)
{
Thread.Sleep(2000);
SetStatus(i);
}
return new JsonResult("Done");
}
在视图中,我使用ajax向LongProcess
发出请求。当该请求处理时,我每250毫秒调用updateStatus
来使用GetStatus()
返回的值更新进度条。看看:
<button class="btn btn-primary" id="progressBtn">Click Me</button>
<div class="progress">
<div class="progress-bar" id="probar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%;">
</div>
</div>
<script>
var percent = 0;
$('#progressBtn').on('click', function () {
var intervalID = setInterval(updateStatus, 250);
$.ajax({
type: "POST",
url: '/Home/LongProcess',
contentType: "application/json",
dataType: "json",
data: "{}",
async: true,
success: function () {
clearInterval(intervalID);
}
});
});
function updateStatus() {
$.ajax({
type: "GET",
url: '/Home/GetStatus',
contentType: "application/json",
dataType: "json",
success: function (data) {
percent = data * 10;
$('#probar').css('width', percent + '%').attr('aria-valuenow', percent)
}
});
}
</script>
问题:
不幸的是,GetStatus
返回的值始终为零。我究竟做错了什么?帮助将不胜感激!
答案 0 :(得分:0)
当您致电LongProcess
时,这是一个新请求。然后,当您致电GetStatus
时,每250ms会有一个请求。您的控制器类将针对每个请求进行初始化。对于每个Status
请求,这意味着GetStatus
属性为零。
希望你能得到这个想法。有关详细信息,请参阅this answer。
您可以做的是将Status
的值存储在中心位置(例如:在数据库中)并在SetStatus
方法中更新。然后在GetStatus
方法中,您可以获取存储的值。