【发布时间】:2014-05-29 04:08:54
【问题描述】:
我回到了一个我在 9 个月前工作的项目,查看我们编写的一些代码,希望现在有更好的方法来做到这一点......
虽然最初对 jQuery 的不显眼的验证印象深刻,但我们最终不得不将下面的 hack 组合在一起(部分基于我现在无法动手的博客文章)来处理远程验证。问题是服务器端验证过程很慢 - 通常是任何涉及数据库调用的事情 - 验证器不会等待来自验证方法的响应,并且会表现得好像它已经回传了一个肯定的。
黑客基本上是继续检查验证器是否有任何待处理的请求,直到它没有,当你可以确定一个真实的验证结果时才继续:
function SaveChangePassword() {
// Find form, fire validation
var $form = $("#btnSave").closest("form");
if ($form.valid()) {
//Do nothing - just firing validation
}
// Calls method every 30 milliseconds until remote validation is complete
var interval = setInterval(saveWhenValidationComplete, 30);
// Check if validation pending, save and clear interval if not
function saveWhenValidationComplete() {
// Find form validator, check if validation pending - save once remote validation is finished
var validator = $form.data("validator");
if (validator.pendingRequest === 0) {
clearInterval(interval);
//Force validation to present to user (this will not retrigger remote validation)
if ($form.valid()) {
var closeButton = "<br/><input type='button' value='OK' style='font-size:small; font-weight:bold; float:right;' onclick=\"$('#changePasswordDialog').dialog('close');\" class='greenbutton' />";
// If form is valid then submit
$.ajax(
{
type: "POST",
url: "/Account/SavePassword",
data: $form.serialize(),
success: function (result) {
var successMessage = "<div style='text-align:center; margin-top: 10px;'>" + result + "<div>";
$("#changePasswordDialog").html(successMessage + closeButton);
},
error: function (jqXhr, textStatus, errorThrown) {
// Populate dialog with error message and button
var errorMessage = "<div style='text-align:center'>Error '" + jqXhr.status + "' (Status: '" + textStatus + "', errorThrown: '" + errorThrown + "')<div>";
$("#changePasswordDialog").html(errorMessage + closeButton);
}
});
}
// Else validation will show
}
// Else don't save yet, wait another 30 miliseconds while validation runs
};
// Prevent default and stop event propagation
return false;
}
我希望在过去的 9 个月中出现了一些进展,而这不再是必要的了!欢迎任何想法,让我知道是否可以提供更多详细信息。
【问题讨论】:
-
我认为你应该做更多的挖掘来发现这个问题的根源。多年来,我一直在 MVC 中使用不显眼的验证,从未遇到过您所描述的问题。
-
你使用远程属性提交ajax表单了吗?这是 100% 的问题,我已经调试并看到了各种问题,只是希望有一些进展,因为它看起来有点令人震惊。
-
是的,我有。我想我可能明白这里发生了什么。
[Remote]属性应该在值更改后立即引起客户端验证,以便向用户提供即时反馈。但是,验证是异步的,因此是非阻塞的。与 all 客户端验证一样,它可以为用户提供更即时、一致的反馈,并且您仍然需要在服务器端执行相同的检查。如果你这样做了,那么表单发布将产生与[Remote]属性在提交之前返回的结果相同的结果。无需破解。 -
所以你是说重用验证方法来检查值并且只插入/更新/如果有效,那么验证消息一旦从服务器返回就会显示?我理解正确吗?这实际上不是一个坏主意
-
是的,我稍后会添加一些代码作为答案。
标签: jquery asp.net-mvc validation