2014-10-21 2 views
0

В моем приложении asp.NET я реализовал элемент управления для проверки входных данных форм с использованием логики на стороне сервера.Postback не запускается после javascript на событие изменения

Идея состоит в том, чтобы перетащить элемент управления туда, где он нужен, настроить его в коде позади и форма будет проверена. Эта проверка выполняется в событии onchange каждого поля и при отправке формы - синхронный вызов ajax на стороне сервера.

Это работало нормально, пока я не опубликовал его в IIS.

Проблема заключается в следующем: пользователь пишет что-то в текстовом поле. Затем, сосредоточив внимание на этом текстовом поле, нажимает кнопку или ссылку, не связанную с проверкой формы. Выполняется валидация вызова ajax (jQuery onchange fire), а обратная передача кнопки не достигается. Посредством отладки я обнаружил, что проблема заключается в вызове ajax - это как-то предотвращение срабатывания обратной передачи (почти похоже на проблему синхронизации).

Я уменьшил проблему до такой степени, что предупреждение, похоже, вызывает то же самое, что и вызов ajax. Пожалуйста, посмотрите на следующий проект: EDIT: ссылка удалена, потому что я не могу опубликовать более двух ссылок на одном и том же сообщении - извините!

Рассмотрите первые 2 текстовых поля и кнопку: 1) Если вы пишете что-то по первому, нажмите кнопку: поменяет огонь, появляется предупреждение, а обратная передача не возникает. 2) Если вы напишете что-то на втором, нажмите кнопку: поменять огонь и посылку.

Может кто-нибудь объяснить, почему это происходит, и если есть какое-либо решение для этого, т. Е. Сделать postback-огонь после завершения работы javascript?

Я могу думать о 2 способах решения моей проблемы, но мне нужно знать (внутри события изменения текстового поля) идентификатор элемента управления, щелкнутого пользователем. Любой способ получить его? Таким образом, я мог: явно вызвать элемент управления OR verifiy, если он не принадлежит элементам управления формы, и не регистрирует события в этот момент (что будет иметь смысл).

Заранее спасибо.


EDITED 22-10-2014:

Участок утолщается. Кажется, это проблема синхронизации. Проверьте this other test application, где я удалил предупреждения (это сосредоточило слишком много внимания и на самом деле не связано с проблемой, поскольку я не использую оповещения в своем проекте - я использую маленькие воздушные шары) и просто оставил вызов AJAX.

Теперь, на стороне сервера (WebMethod), я поставил Thread.Sleep(). Если поток слишком долго спит, он, похоже, пропускает обратную передачу. В моем случае, в моей среде разработки, порог, похоже, составляет 80 мс. Если вызов ajax занимает менее ~ 80 мс, тогда выполняется обратная передача, если требуется больше, он пропускает обратную передачу. Любые идеи или похожие (разрешенные) проблемы, которые вы видели? Обратите внимание, что мой вызов ajax имеет async: false.


EDITED 24-10-2014:

Наконец еще раз взглянуть на это. Я думаю, что я, возможно, пришел к возможному решению, хотя мне не нравится идея полагаться на setTimeout для обработки кнопки отправки «щелчок» перед «focusin» (тот же элемент управления).

Я изменил логику (по-прежнему достигая той же цели) и теперь использую разные события. Теперь мне нужно различать, когда подавать управляющие выстреливает «focusin» событие, потому что он просто получил фокус (1) или была нажата (2):

  1. Пользователь может просто быть обходе (проверяет последнее поле, было сосредоточиться - если он принадлежит к виду проверяемого)
  2. пользователь может щелкнули (не проверяет последнее поле, которое было в центре внимания, но в целом виде, а затем передает или нет)

имеют посмотрите at this new test app, который ближе к тому, что у меня есть в моем проекте.

Можете ли вы помочь мне найти лучший способ обработки/обработки события click перед событием focusin на одном элементе управления без чего-то непредсказуемого, как setTimeout? Если мне нужно полагаться на setTimeout, сколько, по вашему мнению, нужно установить wait? На моей машине работает 150 мс, но на других лицах может потребоваться больше времени? Что-то вроде своего обратного вызова было бы идеальным.

Еще раз спасибо

+0

'e.target.id' возвращает идентификатор элемента, но я не знаю, как это решить вашу проблему. – Rohith

+0

Привет Rohith. e.target дает мне идентификатор вызывающего объекта, и это TextBox1 или TextBox2 в моем маленьком примере. Это не помогает. Что поможет идентификатор элемента управления, который заставил фокус потеряться в текстовых окнах. Предположим, вы что-то писали в TextBox1, а затем нажали LinkButton25. Что мне помогло бы узнать, в событии Textbox1.change, что нажал LinkButton25, и фокус (действие, если он сработает!) Будет изменен на этот элемент управления. – ca2s7l

+0

Для этого см. Этот [ответ] (http://stackoverflow.com/a/497108/1374307) и [это] (http://stackoverflow.com/a/11278006/1374307) – Rohith

ответ

0

Использование __doPostBack ('', ''); в конце вашей функции javascript

+0

Спасибо, но это не работает. Я попробовал это после предупреждения в моем примере проекта, и все же обратная передача не была запущена. Кроме того, даже если бы это сработало, это вызовет обратную передачу, когда я не захочу ... и именно тогда я просто заполняю и настраиваю элементы управления, и происходит валидация. – ca2s7l

+0

не могли бы вы разместить функцию своего события для обоих событий – ascii

+0

, используя AutoPostBack = "true"? – ascii

0

Похоже, что в этом случае окно предупреждения останавливает обратную передачу. Разумным решением, которое я нашел, было использование диалогового окна jQuery, которое, похоже, не подавляет обратную передачу. Проблема, конечно, диалог не сохраняется через postback, но это решается скрытым полем, содержащим «флаг» для отображения диалогового окна после обратной передачи или нет.

Вам нужно будет добавить jquery-ui.js и некоторый стиль для диалога, если это серьезное приложение, я предлагаю вам загрузить оба файла и поместить их в папку сценариев, как у вас уже есть с jquery min.

<head runat="server"> 
<title>Postback with dialog</title> 
<link rel="stylesheet" href="//code.jquery.com/ui/1.11.2/themes/smoothness/jquery-ui.css"> 
<script src="scripts/jquery-1.8.2.min.js" type="text/javascript"></script> 
<script src="//code.jquery.com/ui/1.11.2/jquery-ui.js"></script> 
<script type="text/javascript"> 

    $(document).ready(function() { 

     $("#TextBox1").on('change', function(e) { 
      $("#doDisplayDialog").val("yes"); // Add a flag so it shows after postback. 
      $('#jqAlert').dialog({ 
       closeOnEscape: true, 
       open: function(event, ui) { 
        $(this).parent().appendTo("form"); 
       } 
      }); 
     }); 

     if ($("#doDisplayDialog").val() == "yes") { 
      $('#jqAlert').dialog({ 
       closeOnEscape: true, 
       open: function(event, ui) { 
        $(this).parent().appendTo("form"); 
       } 
      }); 
      $("#doDisplayDialog").val("no"); // Clear the flag so it doesn't display after postback. 
     } 

    }); 

</script> 
</head> 

Добавить скрытое поле:

<asp:HiddenField ID="doDisplayDialog" runat="server" /> 

И в Div быть диалоговое окно:

<div id="jqAlert" title="Alert" style="display: none;"> 
    <p>Postback will happen!</p> 
</div> 

Кодекс основан на вашем загружаемое приложение тест веб-сайта.

- не рабочий раствор ниже -

Попробуйте - копировать/вставить заменить эти строки в вашем веб-приложении тест:

$(document).ready(function() { 

    $("#TextBox1").on('change', function() { 
    alert('T1 Postback does not fire'); 
    return true; 
    //return AjaxCall(); 
    }); 

    $("#TextBox2").on('change', function() { 
    alert('T2 Postback does not fire'); 
    return true; 
    //return AjaxCall(); 
    }); 

}); 

Единственное изменение, которое я сделал, было заменить одиночные кавычки двойные кавычки в селекторе Jquery здесь

$('#TextBox2') 

с

$("#TextBox2") 

Редактировать: На самом деле это не работает, у меня была ошибка в моем тестовом коде. Будет больше смотреть на это.

+0

Я думаю, что вы, возможно, неправильно поняли вопрос (может быть?). Я хочу, чтобы postback произошел. Используя ваш код, postback не выполняется. – ca2s7l

+0

Просто увидел часть редактирования. Спасибо. – ca2s7l

+0

Да, я понял, я возился с моим тестовым кодом и получал обратные вызовы, но не с этим кодом. Не обращайте внимания на предлагаемое сегодня решение, я изучаю это, это интересная проблема. – Iztoksson

Смежные вопросы