在异步操作期间使用JS更新页面内容

时间:2013-05-10 12:26:58

标签: c# javascript web-services asp.net-mvc-4 async-await

我正在尝试在我的MVC 4项目中解决webservice调用的问题。我正在做的是,当用户在页面上提交表单时,我调用webservice并等待结果。同时服务器返回回调(它返回包含服务器端完成的工作步骤的字符串)。我想要做的是显示我正在从页面上的回调构建的“日志”的内容,并重复刷新以显示进度。

我遇到的问题是,我要么在我的控制器中异步调用webservice,在这种情况下我不等待来自webservice的结果,这意味着用户不会留在应该显示进度的页面上,或者我会同步调用它,在这种情况下,页面上的javascript将无法从控制器获得响应,直到最终响应到达(因此不会显示更新)。

我想要的流程是:

  1. 用户提交表单
  2. 在控制器中调用服务器
  3. 服务器发送回调,控制器通过扩展“log”变量来处理它们
  4. 用户仍然看到相同的页面,其中“log”(包含在特定div中)由javascript定期刷新,而控制器等待来自服务器的最终结果
  5. 服务器返回最终结果
  6. Controller完成其代码并返回新视图
  7. 这是我的post方法,目前不等待响应并立即继续进行:

    [HttpPost]
    public async Task<ActionResult> SubmitDetails
                   (DocuLiveInstallationRequest submittedRequest, string command)
    {
        request = submittedRequest;
        try
        {
            switch (command)
            {
                case "Test":
                    {
                        request.OnlyTest = true;
                        DocuLiveInstallationStatus installStatus 
                                                           = await IsValidStatus();
                        if (installStatus == null)
                        {
                            ViewBag.Fail = Resources.AppStart.TestNoResult;
                            return View("SubmitDetails", request); ;
                        }
                        else
                        {
                            status = installStatus;
                            if (status.Result)
                            {
                                ViewBag.Success = Resources.AppStart.TestSucces;
                                ViewBag.Log = installLog;
                            }
                            TempData["installationStatus"] = installStatus;
                            return View("SubmitDetails", request);
                        }
                    }
                case "Submit":
                    {
                        request.OnlyTest = false;
                        DocuLiveInstallationStatus installStatus = await Install();
                        if (installStatus == null)
                        {
                            ViewBag.Fail = Resources.AppStart.InstallationNoResult;
                            return View("SubmitDetails", request); ;
                        }
                        else
                        {
                            status = installStatus;
                            TempData["installationStatus"] = installStatus;
                            TempData["installLog"] = installLog;
                            return RedirectToAction("Login",controllerName:"Login");
                        }
                    }
            }
            ViewBag.TestFail = Resources.AppStart.SubmitFailure;
            return View("SubmitDetails", request); ;
        }
        catch
        {
            return View();
        }
    }
    

    这是我为视图准备的javascript:

    <script type="text/javascript">
        $(document).ready(function () {
            //$("#submitDetails").click(function () {
                var progress = 0;
                //$("#submitDetails").attr('disabled', 'disabled');
                var statusUpdate = setInterval(function () {
                    $.ajax({
                        type: 'GET',
                        url: "/AppStart/GetInstallProgress",
                        datatype: "application/html; charset=utf-8",
                        success: function (data) {
                            if (data && data != "") {
                                $("div.status-message").text(progress);
                            }
                        }
                    });
                }, 2000);
            //});
        });
    </script>
    

    目前我只是在下一页显示日志(在开发服务器的这个阶段非常迅速地返回响应),但我需要调用服务器,在等待结果时显示回调的进度,然后导航到另一个页面(取决于在结果上)。我觉得我非常接近,但我无法让它发挥作用。

    PS:除了更新页面内容之外,我对其他解决方案持开放态度。我真的不介意如何实现目标,但客户更喜欢更新页面。

0 个答案:

没有答案