0

我目前在我的 MVC 4 应用程序中遇到问题。我在控制器中有私有变量,它包含一个简单类的实例:

 private InstallationStatus status = null;

当数据在视图上提交时,它会像这样填充:

InstallationStatus installStatus = Install();
if (installStatus != null)
{
    status = installStatus;
    TempData["installPercent"] = 0;
    return View("InstallationProgress", status);
}

这部分按预期工作,变量按应有的方式设置为实例。

之后,视图会定期检查另一个变量(使用 ajax):

<script type="text/javascript">
    $(document).ready(function () {
        var progress = 0;
        $("div.status-message").text("Progress: " + progress + "%");
        var statusUpdate = setInterval(function () {
            $.ajax({
                type: 'GET',
                url: "/AppStart/GetInstallProgress",
                datatype: "application/html; charset=utf-8",
                success: function (data) {
                    progress = parseInt(data);
                    if (progress >= 100) {
                        clearInterval(statusUpdate);
                        var data = $(this).serialize();
                        $.ajax({
                            type: 'POST',
                            url: "@Url.Action("CompletedStatus", "AppStart")",
                            success: function () {
                                window.location = "/Login/Login"
                            }
                        });
                    }
                    $("div.status-message").text("Progress: " + progress + "%");
                }
            });


        }, 2000);
        });
</script>

当它在控制器上调用“CompletedStatus”动作时,控制器上的变量“status”为空(之前设置的实例不存在?

我如何确保它的价值将持续存在?在我看来,控制器的整个实例都丢失了,但这对我来说并不重要——“状态”的来源是 web 服务,一旦我获得了 InstallationStatus 的实例,我就无法再次获得它——我需要保留它。

我尝试使用 TempData 来存储它,但是由于在存储它和检索它之间可能有不止一个步骤,因此 TempData 被证明是不可靠的。

最后的过程是:

  1. 请求安装状态并导航以查看安装进度(进度完成时将收到状态)。
  2. 每当我从服务器收到带有进度信息的回调时,通过使用 javascript 更新安装进度来导航到我将在哪里查看
  3. 当安装完成(返回状态)将该状态传递给另一个视图

在上面的示例中,我有一些虚拟代码隐藏,因此状态会立即返回,但这对我遇到的问题没有影响。

目前我可以做 1 和 2,我可以调用最终视图,但我不能在那里传递状态,因为我不再有它在控制器上,而且 TempData 对此不可靠(有时它仍然存在,有时它不是) .

任何帮助将不胜感激。

4

1 回答 1

0

当它在控制器上调用“CompletedStatus”动作时,控制器上的变量“status”为空(之前设置的实例不存在?

我如何确保它的价值将持续存在?

private InstallationStatus status = null;

除非它是一个静态值,否则它不会这样做,那将是一件非常糟糕的事情。请记住,变量值(私有成员的值)仅在 http 请求范围内。如果您执行另一个请求,那么这对于您的私有变量来说是一个全新的范围。

我尝试使用 TempData 来存储它,但是由于在存储它和检索它之间可能有不止一个步骤,因此 TempData 被证明是不可靠的。

那是因为TempData一旦您执行另一个请求,它就不会具有您期望它具有的价值。使用它的一个很好的例子TempData是当你想在 POST 和 GET 之间传递/移动一些值时,即当你执行 POST 并执行重定向时。TempData 不适合您的情况。

现在对于您的方案的可能解决方案,一个很好的问题是:安装过程是否调用一次?每个用户都是唯一的吗?如果是,我高度怀疑是,那么您需要唯一标识每个请求。您可以简单地使用 aGUID来标识每个请求。将其与安装状态等其他信息一起保存到您的数据库中(比保存在会话中更好)。将该 guid 传递回您的客户端,让他们将其传递回控制器并检索安装状态的更新。

于 2013-04-29T13:39:42.033 回答