我在Visual Studio 10中使用MVC 3和razor,客户端不引人注意的验证。我要求为用户提供保存表单的机会fs缺少一些必填字段。提交是使用Ajax.bgein表单结构。
我有以下JavaScript来捕获提交事件。
$(document).ready(function () {
$('#submit-11').click(function (event) {
var validator = $("#form0").validate();
if (!$("#form0").valid()) {
// for partial save needs either ID number
// or family name and date of birth
var NameExists = true;
var DateOfBirthExists = true;
var IDNumberExists = true;
if (validator.errorMap["model.FamilyName"]) { NameExists = false; }
if (validator.errorMap["model.DateOfBirth"]) { DateOfBirthExists = false; }
if (validator.errorMap["model.IDNumber"]) { IDNumberExists = false; }
if (IDNumberExists || (NameExists && DateOfBirthExists)) {
if ($("#model_PartialSave").attr('checked')) {
// partial save has been requested
alert("saving");
return true; // AJAX save is NOT triggered
}
$("#AgreePartialSave").show();
$("#model_PartialSave").removeAttr('checked');
}
return false;
}
return true; // AJAX save IS triggered
});
}); //document ready end
逻辑似乎是正确的 - 我已经在firebug中跟踪了这个 - 并且触发了警报但是AJAX提交调用没有发生。如果表单有效,则会发生AJAX提交调用。
我也试过event.preventDefault();
,但这可以阻止任何保存。
我还在萤火虫中追踪了这一点,并且似乎正在进行所有正确的调用。
感激不尽的任何帮助。
更新
似乎这可能是Microsoft Ajax库中的限制。 See this link了解详情和解决方法。
答案 0 :(得分:0)
我相信你需要拦截的是表单的提交事件,而不是提交按钮的点击事件。正在发生的事情(我怀疑)是,因为验证框架仍然认为您的表单无效,所以即使您通过return true
让点击事件通过,也不会提交表单。
验证完成后但在实际发布之前有一个运行javascript的示例here。
$(function() {
$('#form0').submit(function() {
if (!$(this).valid()) {
// do your thing
return true;
}
});
});
ETA:在阅读了你的回复之后,我想知道问题不在于验证框架是否认为你的网页无效,而且你试图覆盖其结论并提交。在这种情况下,我提供的代码永远不会执行,因为提交永远不会发生。
我建议尝试这样做:从模型中与3个输入字段对应的属性中删除Required属性,并将检查逻辑移动到submit
函数中,如我所建议的那样。但不是说if(!$(this).valid())
,而是只有在表单有效时才会执行代码。