在视图之间传递时,控制器中的变量会丢失

时间:2013-04-29 13:06:48

标签: asp.net-mvc-4 controller

我目前在我的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”为空(先前设置的实例不存在?

如何确保其值会持续存在?在我看来,控制器的整个实例都会丢失,但这对我来说并不重要 - “状态”的来源是webservice,一旦我得到InstallationStatus的实例,我就无法再次获得它 - 我需要保留它。 / p>

我尝试使用TempData来存储它,但是因为在存储它和检索它之间可以有多个步骤,TempData被证明是不可靠的。

最后的过程是:

  1. 请求安装状态并导航到查看安装进度(当进度完成时将收到状态)。
  2. 导航到更新安装进度以查看我的目的地 每当我从服务器回调信息时使用javascript 进度
  3. 安装完成(返回状态)时将该状态传递给 另一种观点
  4. 在上面的示例中,我有一些虚拟代码隐藏,因此立即返回状态,但这对我遇到的问题没有影响。

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

    非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

  

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

     

如何确保其值会持续存在?

     

<强> private InstallationStatus status = null;

除非它是一个静态值,否则它将是一个非常糟糕的事情。请记住,变量值(私有成员的值)仅在http请求中作用域。如果你做了另一个请求,那么这对你的私有变量来说是一个全新的范围。

  

我尝试使用TempData来存储它,但因为它可以存在多个   存储它和检索它之间的一步TempData证明   不可靠的。

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

现在为您的方案提供可能的解决方案,一个很好的问题是:安装过程是否被调用一次?每个用户是否独一无二?如果是,我非常怀疑它是,那么你需要唯一识别每个请求。您只需使用GUID标识每个请求即可。将其保存到您的数据库中(优于保存在会话中)以及其他一些信息,例如安装状态。将该guid传递回客户端,让它们将其传递回控制器并检索安装状态的更新。