我目前在我的 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 被证明是不可靠的。
最后的过程是:
- 请求安装状态并导航以查看安装进度(进度完成时将收到状态)。
- 每当我从服务器收到带有进度信息的回调时,通过使用 javascript 更新安装进度来导航到我将在哪里查看
- 当安装完成(返回状态)将该状态传递给另一个视图
在上面的示例中,我有一些虚拟代码隐藏,因此状态会立即返回,但这对我遇到的问题没有影响。
目前我可以做 1 和 2,我可以调用最终视图,但我不能在那里传递状态,因为我不再有它在控制器上,而且 TempData 对此不可靠(有时它仍然存在,有时它不是) .
任何帮助将不胜感激。