2012-04-19 3 views
1

Я использую MVC и хотел бы отправить форму через jquery, но для того, чтобы mvc, встроенный в валидацию, работать в случае любого недопустимого ввода, я вызвал «return false» из событие click (также пыталось «event.preventDefault»), в случае получения «успешного» json-возврата от контроллера.jquery event preventDefault() не работает

Вот код:

$(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?

обновленный: Если я пытаюсь описать мое желание более просто: я хочу кондиционировать preventDefault события щелчка, так что в определенных условиях он будет ссылаться на форму представить, и в других, он не будет, и работает только $ .ajax. Второе сообщение после подтверждения на стороне сервера, что никаких действий не произошло. Должен быть способ, я думаю ...

ответ

6

Проблема, скорее всего, потому, что ваш аякс асинхронный. Установите его синхронно, и ваш код должен работать нормально. Однако имейте в виду, что если сервер не отвечает мгновенно, вы рискуете замораживать браузер своего пользователя.

+0

+1 У меня была такая же проблема, как и на прошлой неделе. Я совершенно уверен, что это решение. – Curt

+0

Если вы имеете в виду, делая то, что предлагает Curt выше, то это не работает для меня ... tnks. –

+0

Кажется теперь работать. –

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(); 
     } 

    }); 
}); 
+0

tnks, но не работает. Проблема заключается в том, что событие click никогда не предотвращается, когда я его устанавливаю в любом случае. –

+0

@Tall См. Править – Curt

+0

еще не работает ... –

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(); 
        });      
      } 

     }); 
    }); 
+0

Я бы предпочел придерживаться проверки MVC .. tnks. –