为什么使用RedirectToAction时我的网页没有刷新?

4
所以我正在开发一个网页,其中有一个带有一些表格数据的表格,每行表格数据都有一个按钮负责启动一个进程,当我点击其中一个按钮时,它会触发一个Ajax调用。一旦Ajax调用完成,它就会更新网页上的某些内容,这个“某些内容”是一个span元素,它会更新类和文本。

然而,在我点击按钮时触发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
 [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");
        }

我遇到的问题是,当我点击开始并让它在不刷新页面的情况下运行时,它可以正常工作,更新元素没有任何问题。
但是如果我在点击开始按钮后刷新浏览器,而它正在while循环中,它会以完全相同的方式完成,通过击中"RedirectToAction",但这次它不会刷新浏览器,甚至不会调用"Dashboard" IActionResult。我尝试在刷新页面之前在其内部放置一个断点,它被触发了,但是当我再次尝试时,这次刷新页面时,它没有触发断点。并且要记住,在其中一个if语句中,每次都会到达RedirectToAction,无论我是否刷新。
public async Task<IActionResult> Dashboard()
        {
            ProcessFactory.LoadProcesses(_user);

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

            return View(model);
        }

这是上下文丢失的情况吗?还是出了什么问题?

1个回答

0

你正在返回一个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");
}
        // ......
 });
};

我明白你的意思,但如果在我点击按钮并等待进程开始之间刷新页面,它仍然不会更新,直到我手动刷新完成后,它才会一直停留在“启动”状态。只有在它完成之前我手动刷新页面时才会发生这种情况。如果我让它运行,它就会正常工作。 - Riley Varga
如果我在单击“开始”后手动刷新ajax,它似乎会失去上下文。 - Riley Varga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接