我目前在我的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,我可以调用最终视图,但是我不能在那里传递状态,因为我不再在控制器上有它并且TempData对此不可靠(有时它仍然存在,有时它不是)。
非常感谢任何帮助。
答案 0 :(得分:0)
当它在控制器上调用“CompletedStatus”动作时,变量 控制器上的“status”为空(先前设置的实例不是 有?
如何确保其值会持续存在?
<强>
private InstallationStatus status = null;
强>
除非它是一个静态值,否则它将是一个非常糟糕的事情。请记住,变量值(私有成员的值)仅在http请求中作用域。如果你做了另一个请求,那么这对你的私有变量来说是一个全新的范围。
我尝试使用TempData来存储它,但因为它可以存在多个 存储它和检索它之间的一步TempData证明 不可靠的。
这是因为TempData
一旦你做了另一个请求就没有你期望它拥有的价值。使用此TempData
的一个好例子是,当您想要在POST和GET之间传递/移动某些值时,即执行POST并执行重定向时。 TempData不适合你的情况。
现在为您的方案提供可能的解决方案,一个很好的问题是:安装过程是否被调用一次?每个用户是否独一无二?如果是,我非常怀疑它是,那么你需要唯一识别每个请求。您只需使用GUID
标识每个请求即可。将其保存到您的数据库中(优于保存在会话中)以及其他一些信息,例如安装状态。将该guid传递回客户端,让它们将其传递回控制器并检索安装状态的更新。