我有一个MVC项目,并且有一个异步操作,该操作在一个循环中多次调用外部API(每次都传递一个diff参数)。我想在等待提交此表单的同时,每隔一段时间执行一次ajax调用,以便用户可以看到他们所在的位置。我具有以下设置,但是来自辅助调用的所有“成功”回调似乎都已暂停/置于“待处理”状态,直到完成第一种形式为止。有人可以告诉我我在做什么错吗?
我的第一个调用主代码以遍历API调用的动作是这样设置的:
public async Task<ActionResult> Default(
此过程可能需要几分钟,因此我想更新正在传递参数的用户。我计算出提交提交时调用Defauly操作的表单时,我将使用ajax调用另一个Controller操作来执行setInterval并返回一些json以返回给用户,让他们知道静态变量的值,该变量在环。因此,在控制器顶部添加了
private static string mystatus = "started";
在for循环中,我更新了此“ mystatus”。我添加了另一个操作
public ActionResult Progress()
{
dynamic showMessageString = string.Empty;
showMessageString = new
{
param1 = mystatus,
};
return Json(showMessageString, JsonRequestBehavior.AllowGet);
}
因此,我尝试在常规表单和Ajax表单(Html.Beginform和Html.AjaxForm)中都设置Default操作。我有一个提交表单的按钮。我尝试了SUBMIT类型和BUTTON类型,并与后者手动提交。点击按钮时,这是在表单提交时处理它的JS代码
function alertMe() {
alert("start");
setInterval(function () {getStatus();}, 3000);
}
function getStatus() {
$.ajax({
url: '/Home/Progress',
dataType: 'json',
type: 'POST',
success: function (responseText) {
alert("test1: " + responseText.param2);
}
});
alert("test2");
}
$(document).ready(function () {
$('#submitme').click(function () {
alertMe();
});
});
理论上,当我长时间运行的表单正在提交/研读时,这应该每3秒用ajax调用一次我的Progress操作。我在“进度”动作中添加了一个断点。实际发生的是此alert(“ test2”);会按预期每3秒执行一次,并且在浏览器开发人员工具中,我可以看到状态显示为“正在执行”的调用“进度”。然后,当长时间运行的表单完成提交后,我的断点就会被击中很多次(每处理3秒一次),最后我受到一堆警报的轰炸(“ test1:无论最终状态是什么” )连续很多次。
我尝试从中取出整个Default表单,只是保留了执行相同JS代码的按钮(称为Progress动作),并且效果很好,每3秒执行一次成功回调函数。只有在提交另一种表单时,ajax调用才会“暂停”,直到完成第一种表单为止。
有没有一种方法可以确保在执行第一种形式的同时执行这些辅助ajax回调函数?
答案 0 :(得分:0)
Bam!
我在类名上方添加了此属性,它开始起作用。 [SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]
我想MS默认情况下不会让您同时运行不同的操作,以防您更改会话变量而弄乱了它们。这行很简单