javascript - ASP.Net MVC Ajax 请求触发一次,然后不再触发
问题描述
我正在尝试开发一个 ASP.Net MVC 页面,该页面显示长时间运行的操作的进度,因为它在表单发布期间发生。我已经通过使用在帖子发生时获取 JSON 数据的重复 Ajax 请求来做到这一点(最初的想法是基于这个帖子)。我的示例有效,但是在多次运行后发生了一些奇怪的事情。第一次执行时,一切正常,一切正常。在第一次运行之后,后续的 JSON 请求会失败,直到我在调试中重新启动应用程序(从 Visual Studio)或回收应用程序池(如果它部署到我们的开发服务器)。表单帖子本身继续运行良好,并且它正在执行的存储过程无论如何都可以正常工作。似乎表单帖子本身正在阻止它们,但我很奇怪这不是第一次发生。
我已经尝试过以我能找到的所有方式禁用 Ajax 缓存。我有从 jQuery 完成的提交功能,因为提交它的按钮实际上是在一个单独的弹出窗口中。但是,如果我删除它并使用普通的提交按钮,也会发生同样的事情。数据库连接是 Oracle 和实体框架。我试图应用的概念对我来说似乎是一种代码味道,因为在另一个请求期间发生了请求,所以如果有更好的方法可以让这个工作,我没有发现我愿意接受它。如果这种方法很好,有谁知道为什么 JsonResult 的后续提交可能不会发生?
更新
我注意到,当我清除浏览器缓存时,它也允许它重新开始工作。我没有想到要这样做,因为在禁用缓存的 Chrome 中调试时仍然会发生这种情况。罪魁祸首似乎是 Session 或 ASP.NET_SessionId cookie。当手动删除 cookie 并重新建立会话时,它会起作用。SetInfoNotification 调用将一些数据放入 TempData 以显示在通知 div 中。如果我删除这个电话,它也将继续工作。在进行 Ajax 调用的请求期间使用 Session 或 TempData 时是否会挂断?
控制器动作
[HttpPost]
public ActionResult RunCalcPost(MONTHLY_RUN monthRun)
{
try
{
MyContext.Database.ExecuteSqlCommand("BEGIN MY_SCHEMA.MY_STORED_PROCEDURE; END;");
setInfoNotification($"Calculations for \"{monthRun.RUN_ID}\" have completed successfully");
}
catch(Exception e)
{
setErrorNotification(e, "An error occurred while executing the monthly run.");
}
return RedirectToAction("Index", new { runID = monthRun.RUN_ID });
}
[HttpGet]
public JsonResult CheckStatus(string runID)
{
string status = "";
try
{
MONTHLY_RUN monthRun = MyContext.MonthlyRuns
.FirstOrDefault(x => x.RUN_ID == runID);
if (monthRun != null)
{
string calc = monthRun.IS_CALCULATED;
switch (calc)
{
case "1": status = "Step 1 of 8: Clearing temporary tables..."; break;
case "2": status = "Step 2 of 8: Reticulating Splines..."; break;
...
default: status = "Determining status, please wait..."; break;
}
}
else
{
status = "Error in finding ID...please wait.";
}
}
catch
{
status = "Controller error determining progress...please wait.";
}
return Json(new { success = true, message = status }, JsonRequestBehavior.AllowGet);
}
在视图中 (JavaScript)
<script type="text/javascript">
var currentRunID = "@(Model.RUN_ID)";
$(document).ready(function () {
$('#MyForm').submit(function (event) {
HideConfirmation();
ProcessingLoader.Show();
setTimeout(GetProcessStatus, 2000);
});
});
function OnProcessConfirm(s, e) {
$("#MyForm").submit();
}
function GetProcessStatus() {
$.ajax({
type: "GET",
url: "@Url.Action("CheckStatus", "MonthlyRuns")",
data: { runID: currentRunID },
dataType: "json",
cache: false,
success: function (response) { $("#loadingMessage").text(response.message); },
complete: function () { setTimeout(GetProcessStatus, 2000); }
});
}
</script>
解决方案
只是一个猜测,但问题可能出在提交中。
您正在为提交创建一个事件处理程序#MyForm
:
$(document).ready(function () {
$.ajaxSetup({ cache: false });
$('#MyForm').submit(function (event) {
HideConfirmation();
ProcessingLoader.Show();
setTimeout(GetProcessStatus, 2000);
});
});
我怀疑,在此过程中,您的表单正在被新表单替换,或者由于某种原因,您失去了表单的提交事件绑定。
您可以尝试将提交事件绑定到正文,因此即使将表单替换为另一个表单,您仍然可以获得提交事件处理程序:
$(document).ready(function () {
// try binding the submit event handler to document's body
$('body').on("submit", "#MyForm", function(event){
HideConfirmation();
ProcessingLoader.Show();
setTimeout(GetProcessStatus, 2000);
});
});
推荐阅读
- php - 如何修复以下 404 错误。这是缓存问题吗?
- javafx - 是否有一种简单的方法可以检查是否在 TableView 中单击了列标题?
- javascript - 使用 JavaScript/jQuery 改变线性渐变百分比
- symfony - 模型示例在 api 平台中未正确显示
- ios - UIPresentationController委托如何设置
- mysql - 错误号:从数据库中选择时出现 1064
- python - 使用 Beautifulsoup 进行网页抓取并收集表格文本值
- php - 当我使用 jquery 将数据添加到表价格和未定义项目时
- c - 无法在将字符串的每个单词写入新行的代码中找到错误
- android - OntouchEvent() 方法有什么用?