我使用MVC并希望通过jquery提交表单,但是对于mvc内置验证在任何无效输入的情况下工作,我已经条件化了click事件的“return false”(也尝试了“ event.preventDefault“),如果从控制器获得”成功“json返回。
以下是代码:
$(document).ready(function () {
var request;
$('#formSubmit').click(function (event) {
request = $.ajax({
url: '/personManager/loadDetails/',
type: 'post',
data: $('form').serialize()
});
request.done(function(data){
if(data=="success")
event.preventDefault();
});
});
});
我不能让它发挥作用...... 我做错了什么? 还有,有没有更有效的方法来保存mvc验证机制,同时使用jquery?
更新:如果我尝试更简单地描述我的愿望:我想调整click事件的preventDefault,所以在某种情况下它将调用表单提交,而在其他情况下,它不会,只有$ .ajax工作。 在我在服务器端确认没有发生任何动作之后,第二个是有效的。 我猜必须有办法......
答案 0 :(得分:6)
问题很可能是因为你的ajax是异步的。将它设置为同步,您的代码应该可以正常工作。但请注意,如果服务器无法立即响应,您可能会冒着用户浏览器冻结的风险。
答案 1 :(得分:1)
上周我遇到了类似的问题。您需要在async:false
功能上设置$.ajax
。您的默认事件可能在ajax
响应有机会阻止此操作之前运行。这是因为AJAX以异步方式运行。设置async:false
可以防止这种情况发生。但正如@Kolink指出的那样,这意味着如果响应失败,您的页面可能会冻结。
$(document).ready(function (e) {
var request;
var preventDefault = false;
$('#formSubmit').click(function (event) {
request = $.ajax({
url: '/personManager/loadDetails/',
type: 'post',
data: $('form').serialize()
, async: false
});
request.done(function (data) {
if (data == "success")
preventDefault = true;
});
if (preventDefault){
e.preventDefault();
}
});
});
答案 2 :(得分:0)
为什么不使用,jQuery验证?您需要服务器端特定验证吗? 我意识到您已经在使用内置验证的mvc,但由于您使用jQuery提交表单,因此您可以使用它进行验证。只是一个建议,因为你可以这样做:
$(document).ready(function () {
$('form').validate({
rules: {},
messages: {}
});
var request;
$('#formSubmit').click(function (event) {
if($('form').valid()){
request = $.ajax({
url: '/personManager/loadDetails/',
type: 'post',
data: $('form').serialize()
});
request.done(function(data){
if(data=="success")
event.preventDefault();
});
}
});
});