Почему моя веб-страница не ссылается на sh при вызове RedirectToAction? - PullRequest
3 голосов
/ 15 января 2020

Итак, я сейчас разрабатываю веб-страницу, в которой есть таблица с некоторыми табличными данными, в каждой строке данных таблицы есть кнопка, отвечающая за запуск процесса, и когда я нажимаю одну из кнопок, она запускает * 1029. * вызов. Как только вызов ajax завершается, он обновляет что-то на веб-странице, это «что-то» является элементом span, он обновляет класс и текст.

Однако, если я обновлю sh страницу вручную в между процессом нажатия на кнопку, когда он запускает вызов ajax, и его завершением, он не будет обновляться.

Позвольте мне объяснить это с помощью некоторого кода.

У меня есть эта кнопка, который вызывает вызов ajax при нажатии

<button type="button" class="btn btn-icon waves-effect waves-light btn-success" onclick="@("StartProcess('"+model.ProcessName+"')")"> <i class="fa fa-power-off"></i> </button>

Вызов Ajax выглядит следующим образом

 function StartProcess(ProcessName) {

        var dataPost = { processName: ProcessName};
        $.ajax({
            data: dataPost,
            url: '@Url.Action("Start", "Dashboard")',
            type: "POST",
            dataType: "text",
            beforeSend: function () {
                // Handle the beforeSend event
                $("#" + ProcessName).removeClass("badge-danger").addClass("badge-info").html("Starting");
            },
            success: function (redirect) {
                // Handle the complete event
                window.location = redirect;
                $("#" + ProcessName).removeClass("badge-info").addClass("badge-success").html("Online");


            },
            error: function() {
                //AJAX request not completed
                $("#" + ProcessName).removeClass("badge-info").addClass("badge-danger").html("Error");
    }
            // ......
        });
    };

И это делает то, что он делает запрос к IActionResult на сервере, который работает отлично. Вот как это выглядит, имейте в виду, что он достигает RedirectToAction каждый раз , даже если я перефразирую sh или нет.

 [HttpPost]
        public IActionResult Start(string ProcessName)
        {
            ProcessFactory.StartProcess(ProcessName, _user);
            while (ProcessFactory.ServerFlag == null)
            {
                //Stalling until "ProcessFactory.StartProcess" has finished

            }

            //It reaches this no matter what
            if (ProcessFactory.ServerFlag == "Online")
            {
                Debug.Print("===========ONLINE============");
                Response.StatusCode = 200;

                //It reaches this no matter what
                return RedirectToAction("Dashboard", "Dashboard");
            }
            else if (ProcessFactory.ServerFlag == "Already running")
            {
                Response.StatusCode = 200;
                return RedirectToAction("Dashboard", "Dashboard");
            }
            else if (ProcessFactory.ServerFlag == "Error")
            {
                Response.StatusCode = 401;
                return RedirectToAction("Dashboard", "Dashboard");
            }

            return RedirectToAction("Dashboard", "Dashboard");
        }

Вот проблема, с которой я сталкиваюсь когда я нажимаю «Пуск» и просто запускаю его без обновления страницы, он работает просто отлично, он обновляет элемент без каких-либо проблем.

Если, однако, я обновляю браузер sh после нажатия кнопки «Пуск» Кнопка, в то время как она находится внутри while l oop, завершает работу точно так же, нажимая RedirectToAction , но на этот раз она не ссылается sh на браузер, она даже не вызывает IActionResult "Dashboard". Я попытался поместить точку останова в нее перед обновлением страницы, и она попала в нее, но когда я попробовал это снова, но на этот раз обновляя страницу, она не достигла точки останова. И имейте в виду, что он достигает RedirectToAction каждый раз внутри одного из операторов if, несмотря ни на что, даже если я ссылаюсь sh или нет.

public async Task<IActionResult> Dashboard()
        {
            ProcessFactory.LoadProcesses(_user);

            //Load all processes
            var model = ProcessFactory.LoadProcesses(_user);

            return View(model);
        }

Это случай потери контекста или что здесь происходит?

1 Ответ

0 голосов
/ 15 января 2020

Вы возвращаете RedirectToAction() (эквивалент 302) на JavaScript, и он не знает, как с этим справиться. Я вижу, вы пытаетесь вручную установить код ответа, но самым простым решением было бы просто изменить то, что вы возвращаете на URL.

[HttpPost]
public IActionResult Start(string ProcessName)
{
    ProcessFactory.StartProcess(ProcessName, _user);
    //[....lots of stuff]
    return Json(Url.Action("Dashboard", "Dashboard"));
}

На вашем JavaScript измените тип возврата на JSON. Возможно, вы можете вернуть строку из вашего контроллера без переноса в JSON, но это позволяет вам возвращать больше данных в будущем, если вы захотите (просто добавив больше к ответу JSON)

function StartProcess(ProcessName) {

    var dataPost = { processName: ProcessName};
    $.ajax({
        data: dataPost,
        url: '@Url.Action("Start", "Dashboard")',
        type: "POST",
        dataType: "json",
        beforeSend: function () {
            // Handle the beforeSend event
            $("#" + ProcessName).removeClass("badge-danger").addClass("badge-info").html("Starting");
        },
        success: function (redirect) {
            // Handle the complete event
            window.location = redirect;
            //changing any part of the UI is redundant here as you are redirecting
            //the browser window
        },
        error: function() {
            //AJAX request not completed
            $("#" + ProcessName).removeClass("badge-info").addClass("badge-danger").html("Error");
}
        // ......
 });
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...