【问题标题】:Why doesnt my webpage refresh when calling RedirectToAction?为什么调用 RedirectToAction 时我的网页没有刷新?
【发布时间】:2020-05-02 05:32:53
【问题描述】:

所以我目前正在开发一个网页,其中有一个包含一些表格数据的表格,表格数据的每一行都有一个负责启动进程的按钮,当我单击其中一个按钮时,它会触发一个 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 以完全相同的方式完成,但这次它不会刷新浏览器,它甚至不调用“仪表板”IActionResult。我尝试在刷新页面之前在其中放置一个断点,它命中了它,但是当我再次尝试时,但这次刷新页面,它没有命中断点。请记住,它每次都会在其中一个 if 语句中到达 RedirectToAction,无论如何,即使我刷新与否。

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

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

            return View(model);
        }

这是失去上下文的情况还是这里发生了什么?

【问题讨论】:

    标签: javascript jquery asp.net ajax asp.net-mvc


    【解决方案1】:

    您正在向 JavaScript 返回 RedirectToAction()(相当于 302),但它不知道如何处理。我看到您正在尝试手动设置响应代码,但最简单的解决方案是简单地更改您返回到 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");
    }
            // ......
     });
    };
    

    【讨论】:

    • 我明白你的意思,但如果我在单击按钮和等待进程开始之间刷新它仍然不会更新,它会卡在“开始”直到我在完成后手动刷新,只有当我在完成之前手动刷新页面时才会发生这种情况。如果我让它运行,它会工作得很好。
    • (如果我在点击开始后手动刷新它,就好像ajax失去了上下文一样
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多