Прогресс-бар MVC C# - PullRequest
       66

Прогресс-бар MVC C#

0 голосов
/ 13 апреля 2020

В моем проекте мне нужно использовать индикатор прогресса в процентах для очень длительного запуска процесса. И для отображения расчета процесса для пользователя. Я набрал этот код:

Контроллер:

    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().

...