我被困在一个非常奇怪的情况下。这很复杂,但我会尽力解释。
问题的详细说明:
每次点击顶部导航(绿色甜甜圈/圆圈)或下一步按钮时,如果表单存在且有效,则必须提交表单。如果无效,则form.valid()会触发验证错误,返回false将停止任何进一步的传播。这个设置一直运行得很完美,直到我注意到了一个奇怪的行为,这种行为并不是非常持久。我的第三个选项卡上的表单具有相当多的数据。当我点击下一步按钮时,它应该实际上经过相同的过程:检查是否存在现有表单,如果有效,则提交。提交调用POST操作方法,当POST完成后,它GETs下一个选项卡的视图。它像这样工作5/10次,但其他时间GET在POST之前执行,这会导致下一页以不完整的数据加载。当我打断点进行调试时,我看到下一个选项卡的GET在当前选项卡的POST之前执行。
UI解释:
我有一个带有4个导航按钮的UI,顶部有
这个函数在页面加载时绑定到每个顶部链接。
我的下一个和上一个按钮基本上触发点击事件,即
问题是,由于某些原因,当导航链接3处于活动状态并且我点击NEXT按钮时-而不是首先通过form.submit()提交表单-导航4被触发-因此在导航3的表单POST之前GET了导航4。
我的ValidateForm方法基本上只是检查表单是否存在且有效,然后提交,否则返回false。代码如下:
我的猜测是,form.submit确实被触发了,但由于提交需要一些时间才能完成,它会继续执行button标签onclick事件中的下一个代码块。
起初我认为这是服务器端问题,因为在POST中,我保存了大量数据并进行了几个循环,任何处理重负载的代码块都在其中。
var saveTask = Task.Factory.StartNew(() => ControllerHelper.SomeMethod(db, model)); Task.WaitAll(saveTask);
WaitAll将等待并暂停执行,直到SomeMethod执行完成。我不确定如何在JavaScript中锁定进程并等待其执行完成。因为我认为,如果我可以通过回调方法在ValidateForm中锁定form.submit(),直到其完成处理...
请问是否有人能够指导我正确的方向,我将非常感激帮助。如果您需要更多信息,请告诉我,我很乐意提供!
问题的详细说明:
每次点击顶部导航(绿色甜甜圈/圆圈)或下一步按钮时,如果表单存在且有效,则必须提交表单。如果无效,则form.valid()会触发验证错误,返回false将停止任何进一步的传播。这个设置一直运行得很完美,直到我注意到了一个奇怪的行为,这种行为并不是非常持久。我的第三个选项卡上的表单具有相当多的数据。当我点击下一步按钮时,它应该实际上经过相同的过程:检查是否存在现有表单,如果有效,则提交。提交调用POST操作方法,当POST完成后,它GETs下一个选项卡的视图。它像这样工作5/10次,但其他时间GET在POST之前执行,这会导致下一页以不完整的数据加载。当我打断点进行调试时,我看到下一个选项卡的GET在当前选项卡的POST之前执行。
UI解释:
我有一个带有4个导航按钮的UI,顶部有
<a>
按钮,在中心始终有一个表单,在底部有上一页和下一页按钮。
使用 Ajax.BeginForm
在MVC中构建表单。
对于顶部的每个导航链接 <a>
元素,我有一个JavaScript函数。
var LoadTabs = function (e, arg) {
// This is to validate a form if one of the top links is clicked and form has incomplete fields...
if (arg !== "prev" && arg !== "next") {
if (!window.ValidateForm(false)) return false;
}
var url = $(this).attr('data'); // this contains link to a GET action method
if (typeof url != "undefined") {
$.ajax(url, { context: { param: arg } }).done(function (data) {
$('#partialViewContainer').html(data);
});
}
}
这个函数在页面加载时绑定到每个顶部链接。
$('.navLinks').on('click', LoadTabs);
我的下一个和上一个按钮基本上触发点击事件,即
LoadTabs
函数。$('button').on('click', function () {
if (this.id === "btnMoveToNextTab") {
if (!window.ValidateForm(true)) return false;
$.ajax({
url: url,
context: { param: 'next' },
method: "GET",
data: data,
success: function(response) {
if (typeof response == 'object') {
if (response.moveAhead) {
MoveNext();
}
} else {
$('#mainView').html(response);
}
ScrollUp(0);
}
});
}
if (this.id === "btnMoveToPreviousTab") {
MoveBack();
}
return false;
});
MoveNext() Implementation is as below:
function MoveNext() {
var listItem = $('#progressbarInd > .active').next('li');
listItem.find('.navLink').trigger('click', ['next']);
ScrollUp(0);
}
问题是,由于某些原因,当导航链接3处于活动状态并且我点击NEXT按钮时-而不是首先通过form.submit()提交表单-导航4被触发-因此在导航3的表单POST之前GET了导航4。
我的ValidateForm方法基本上只是检查表单是否存在且有效,然后提交,否则返回false。代码如下:
function ValidateForm(submit) {
var form = $('form');
// if form doesn't exist on the page - return true and continue
if (typeof form[0] === "undefined") return true;
// now check for any validation errors
if (submit) {
if (!$(form).valid()) {
return false;
} else {
$(form).submit();
}
}
else {
return true;
}
return true;
}
我的猜测是,form.submit确实被触发了,但由于提交需要一些时间才能完成,它会继续执行button标签onclick事件中的下一个代码块。
起初我认为这是服务器端问题,因为在POST中,我保存了大量数据并进行了几个循环,任何处理重负载的代码块都在其中。
var saveTask = Task.Factory.StartNew(() => ControllerHelper.SomeMethod(db, model)); Task.WaitAll(saveTask);
WaitAll将等待并暂停执行,直到SomeMethod执行完成。我不确定如何在JavaScript中锁定进程并等待其执行完成。因为我认为,如果我可以通过回调方法在ValidateForm中锁定form.submit(),直到其完成处理...
请问是否有人能够指导我正确的方向,我将非常感激帮助。如果您需要更多信息,请告诉我,我很乐意提供!
Ajax.BeginForm()
,而不是使用$.ajax()
。但问题在于 ajax 是异步的。当你调用ValidateForm()
并且它有效时,一个 ajax 调用将被发送到 POST 方法。然后代码进入下一个$.ajax()
调用到你的 GET 方法。它们同时发生,并不能保证哪个先完成。 - user3559349