Принудительная обратная передача из кода? Или перезагрузить JavaScript из асинхронной обратной передачи?
У меня есть диалоговое окно Jquery UI, которое появляется, чтобы подтвердить создание элемента после заполнения формы. У меня есть форма в панели обновления из-за различных потребностей формы, и особенно потому, что я хочу, чтобы проверка выполнялась в форме без перезагрузки страницы.
Похоже, JavaScript не перезагружается при асинхронной обратной передаче. Это означает, что когда форма успешна, и я изменяю переменную formSubmitPass на true, она не передается в Javascript через <% = formSubmitPass%>. Если я добавлю триггер к кнопке отправки, чтобы выполнить полную обратную передачу, это сработает. Однако я не хочу, чтобы кнопка отправки выполняла полную обратную передачу, как я уже сказал, чтобы я мог проверить форму на панели обновлений.
Как это сделать, чтобы моя форма проверялась асинхронно, но мой javaScript будет правильно перезагружаться, когда форма успешно завершена и элемент сохранен в базе данных?
Javascript:
var formSubmitPass = '<%= formSubmitPass %>';
var redirectUrl = '<%= redirectUrl %>';
function pageLoad() {
$('#formPassBox').dialog({
autoOpen: false,
width: 400,
resizable: false,
modal: true,
draggable: false,
buttons: {
"Ok": function() {
window.location.href = redirectUrl;
}
},
open: function(event, ui) {
$(".ui-dialog-titlebar-close").hide();
var t = window.setTimeout("goToUrl()", 5000);
}
});
if(formSubmitPass == 'True')
{
$('#formPassBox').dialog({
autoOpen: true
});
}
Итак, как я могу форсировать обратную передачу из кода, или перезагружать JavaScript в асинхронной обратной передаче, или сделать это так, чтобы я мог продолжать выполнять проверку асинхронной формы?
Редактировать: я изменяю formSubmitPass в самом конце кода:
If errorCount = 0 Then
formSubmitPass = True
upForm.Update()
Else
formSubmitPass = False
End If
Таким образом, при полной обратной передаче значение меняется.
3 ответа
Я понял, что для меня сработало, сначала поместив диалоговое окно javascript в page_load, чтобы свойство auto open было установлено в false следующим образом:
function pageLoad() {
$('#formPassBox').dialog({
autoOpen: false
});
}
Затем создайте совершенно отдельную функцию, например, так:
function formSubmitPass() {
$('#formPassBox').dialog({
autoOpen: true,
width: 400,
resizable: false,
modal: true,
draggable: false,
buttons: {
"Ok": function() {
window.location.href = redirectUrl;
}
},
open: function(event, ui) {
$(".ui-dialog-titlebar-close").hide();
var t = window.setTimeout("goToUrl()", 10000);
}
});
}
Затем используйте RegisterStartupScript, как указано в следующих вопросах: Запустить javascript после отправки формы на панели обновления? и что не так с ScriptManager.RegisterStartupScript?
Мой код:
ScriptManager.RegisterStartupScript(Me, upForm.GetType(), "AutoPostBackScript", "formSubmitPass();", True)
ПРИМЕЧАНИЕ. Убедитесь, что вы используете ScriptManager NOT ClientScript, также для второго параметра используйте GetType() на панели обновления.
Вместо использования строителя строк ( эффективное использование метода ASP.NET RegisterStartupScript) в коде, который, как мне показалось, было бы неудобно помещать в код javaScript, я просто делаю отдельную функцию и вызываю ее, что прекрасно работает
Мне кажется, что HTML заменяется панелью обновлений, а ваши селекторы jQuery не привязаны к новым элементам.
Попробуйте использовать.Live для всех ваших событий или выполнить повторную привязку после обновления ajax (для этого вы можете использовать плагин UpdatePanel)
Не совсем уверен, что вы пытаетесь сделать. <%= formSubmitPass %>
конечно, не будет пересматриваться, потому что это переменная сервера, которая устанавливается только при перезагрузке страницы. Даже если вы снова выполните javascript, значение не изменится.
Тем не менее, вы также можете передать succes
обратный звонок в .dialog()
метод:
$('#formPassBox').dialog({
// ...
success: function(){
// do something, e.g.
$("#formPassBox").dialog({autoOpen:false});
}
});