В моем проекте мне нужно использовать индикатор прогресса в процентах для очень длительного запуска процесса. И для отображения расчета процесса для пользователя. Я набрал этот код:
Контроллер:
public class HomeController : Controller {
private static int progress;
public ActionResult Index() {
return View();
}
[HttpPost]
public JsonResult Start() {
int count = 10;
for (int i = 0; i < count; i++) {
progress = Convert.ToInt32(Convert.ToDouble(i) / Convert.ToDouble(count) * 100);
System.Threading.Thread.Sleep(500);
}
var result = new { StartResult = "ok" };
progress = 0;
return Json(result);
}
[HttpPost]
public JsonResult Progress() {
var result = new { ProgressResult = progress };
return Json(result);
}
}
Просмотры
@{
ViewBag.Title = "Index";
}
@Html.DevExpress().Button(settings => {
settings.Name = "btnStart";
settings.Text = "Start";
settings.UseSubmitBehavior = false;
settings.ClientSideEvents.Click = string.Format("function(s, e) {{ OnButtonClick(s, e, '{0}', '{1}'); }}", Url.Action("Start", "Home", null), Url.Action("Progress", "Home", null));
}).GetHtml()
@Html.DevExpress().ProgressBar(settings => {
settings.Name = "myProgressBar";
settings.Width = System.Web.UI.WebControls.Unit.Pixel(200);
settings.ClientVisible = false;
}).GetHtml()
javaScript
var myTimer;
function OnButtonClick(s, e, startUrl, progressUrl) {
StartActionOnServer(startUrl);
StartTimer(progressUrl);
}
function StartActionOnServer(startUrl) {
$.ajax({
type: 'POST',
url: startUrl,
dataType: 'json'
}).done(ProgressCallbackComplete).fail(CallbackError);
}
function ProgressCallbackComplete(data) {
StopTimer();
alert('Accomplished');
}
function StartTimer(progressUrl) {
btnStart.SetEnabled(false);
myProgressBar.SetVisible(true);
myTimer = setInterval(function () {
$.ajax({
type: 'POST',
url: progressUrl,
dataType: 'json'
}).done(TimerCallbackComplete).fail(CallbackError);
}, 1000);
}
function StopTimer() {
myProgressBar.SetVisible(false);
myProgressBar.SetPosition(0);
btnStart.SetEnabled(true);
if (myTimer) {
clearInterval(myTimer);
myTimer = null;
}
}
function TimerCallbackComplete(data) {
myProgressBar.SetPosition(parseInt(data.ProgressResult));
}
function CallbackError() {
StopTimer();
alert('Callback error');
}
Если я вставлю этот код в новый проект, индикатор выполнения будет работать правильно, но если я добавлю этот код в свой проект, он не будет работать. процессор выполняет метод Start()
и после метода progress()
.