2013-04-29 39 views
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”的动作,在控制器上变量“状态”为空(实例预先设定的不在那里?

我该如何确保其价值将持续?在我看来,像整个控制器实例丢失,但这并不真正对我来说 - “状态”的来源是web服务,一旦我得到实例InstallationStatus,我不能再次得到它 - 我需要保持它。

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

最后的过程是:

  1. 请求安装状态和导航以查看安装进度(状态将被接收到时的进展将完成)。
  2. 导航,查看那里我将使用JavaScript每当我得到的回调从服务器与信息有关 进度更新安装进度
  3. 当安装完成(返回状态),该状态传递给 另一种观点认为

在上面的例子中,我有一些虚拟代码隐藏,所以状态立即返回,但是这对我的问题没有影响。

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

任何帮助将不胜感激。

回答

0

当调用器上的“CompletedStatus”行动,变 “状态”的控制器为null(例如预先设定的不 呢?

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

private InstallationStatus status = null;

不会的,除非它是一个静态值,这将是很不好不好做要做的事情。请记住,变量值(私有成员的值)仅限于http请求中。如果你做了另一个请求,那么你的私有变量就是一个完全新的范围。

我试图使用TempData的存储,但因为可以有将其存储和检索它之间的多于一个 步骤TempData的证明 不可靠的。

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

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

+0

你说的只是一次调用的安装过程是正确的(提供它不会最终出错,但总是有最大的一个运行)。事实上,在这一点上总共只有一个(这是SuperAdmin第一次启动应用程序时执行的操作)。客户端没有任何自己的数据库 - 它只能通过web服务进行通信。在这一点上,webservice也没有数据库 - “安装”方法实际上触发了为整个应用程序创建主数据库。所以我没有任何“外部”存储空间,我可以让我的状态持续下去...... – Erchi 2013-04-29 15:50:44

相关问题