SimpleModal прерывает обратную передачу ASP.Net

Я использую jQuery и SimpleModal в проекте ASP.Net, чтобы создать приятные диалоги для веб-приложения. К сожалению, никакие кнопки в модальном диалоговом окне больше не могут выполнять свои обратные передачи, что на самом деле неприемлемо.

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

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

ОБНОВЛЕНИЕ: я должен уточнить, обратные передачи не работают, потому что Javascript, используемый для выполнения обратных сообщений, каким-то образом сломался, поэтому при нажатии кнопки ничего не происходит.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
25
0
10 311
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Все стандартные обратные передачи ASP.NET работают путем вызова метода javascript __doPostBack на странице. Эта функция отправляет форму (ASP.NET действительно любит только одну форму на странице), которая включает некоторое скрытое поле ввода, в котором живет все состояние просмотра и другие полезные свойства.

На первый взгляд, я не вижу в SimpalModal ничего, что могло бы испортить форму вашей страницы или любой из стандартных скрытых входов, если только содержимое этого модального окна не пришло из HTTP GET на страницу ASP.NET. Это привело бы к рендерингу двух форм ASP.NET в одну DOM и почти наверняка испортило бы функцию __doPostBack.

Вы рассматривали возможность использования Элемент управления ASP.NET AJAX ModalPopup?

Веб-браузеры не будут размещать какие-либо отключенные или скрытые элементы формы.

Итак, что происходит:

  1. Пользователь нажимает кнопку в вашем диалоговом окне.
  2. Кнопка вызывает метод close () SimpleModal, скрывая диалоговое окно и кнопку.
  3. Клиент отправляет форму POST (без идентификатора кнопки)
  4. Платформа ASP.NET не может определить, какая кнопка была нажата
  5. Ваш серверный код не выполняется.

Решение состоит в том, чтобы сделать на клиенте все, что вам нужно (в данном случае закрыть диалоговое окно), а затем самостоятельно вызвать __doPostback ().

Например (где "dlg" - ссылка на диалоговое окно SimpleModal на стороне клиента):

btn.OnClientClick = string.Format("{0}; dlg.close();",
                        ClientScript.GetPostBackEventReference(btn, null));

Это должно скрыть диалог, отправить форму и вызвать любое серверное событие, которое у вас есть для этой кнопки.

@Dan

All standard ASP.NET postbacks work by calling a __doPostBack javascript method on the page.

asp: кнопки не вызывают __doPostback (), потому что элементы управления вводом HTML уже отправляют форму.

Спасибо! Моя проблема еще не решена полностью, но из-за этого моя форма Rails по умолчанию не использовала ajax. Я думал, что обратные вызовы jquery-ujs не были прикреплены, когда SimpleModal переставлял вещи, но похоже, что браузер отказывается публиковать сообщения из скрытой формы. Имеет смысл в ретроспективе.

user657199 28.02.2012 23:32
Ответ принят как подходящий

Вы оба были на правильном пути. Я понял, что SimpleModal добавляет диалог в тело, которое находится за пределами <form> ASP.Net, что нарушает функциональность, поскольку не может найти элементы.

Чтобы исправить это, я просто изменил исходный код SimpleModal, добавив все в 'form' вместо 'body'. Когда я создаю диалог, я также использую опцию persist: true, чтобы кнопки оставались открытыми и закрытыми.

Спасибо всем за предложения!

ОБНОВИТЬ: Версия 1.3 добавляет в конфигурацию параметр appendTo для указания, к какому элементу должен быть добавлен модальный диалог. Вот документы.

Использование persist: true помогло мне, когда я заметил, что мои элементы управления проверкой .net не срабатывают после закрытия и повторного открытия модального окна. Ваш ответ решил мою проблему, большое спасибо! :)

Sgt Beardy 26.04.2012 14:57

Я нашел следующие работы без изменения simplemodal.js:

function modalShow(dialog) {

    // if the user clicks "Save" in dialog
    dialog.data.find('#ButtonSave').click(function(ev) {
        ev.preventDefault();

        //Perfom validation                

        // close the dialog
        $.modal.close();

        //Fire the click event of the hidden button to cause a postback
        dialog.data.find('#ButtonSaveTask').click();
    });

    dialog.data.find("#ButtonCancel").click(function(ev) {
        ev.preventDefault();
        $.modal.close();
    });
}          

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

FWIW, я обновил сообщение в блоге, на которое вы указали, добавив разъяснения, репосты здесь - рассуждения и другие подробности в сообщении в блоге:

Решение (на момент моей последней регистрации перед обедом):

  1. Переопределите событие onClose диалогового окна и выполните следующие действия:
    1. Вызов функции закрытия диалогового окна по умолчанию
    2. Установите для тега innerHTML диалогового окна один
    3. Перехватите __doPostBack, указав его на новую функцию newDoPostBack

Судя по некоторым комментариям, которые я видел в сети, пункт 1 требует пояснения. К сожалению, я больше не работаю у того же работодателя и у меня нет доступа к используемому мной коду, но я сделаю все, что в моих силах. Во-первых, вам нужно переопределить функцию onClose диалогового окна, определив новую функцию и указав на нее свое диалоговое окно, например:

$('#myJQselector').modal({onClose: mynewClose});
  • Вызвать функцию закрытия диалогового окна по умолчанию. В определяемой вами функции вы должны сначала вызвать функциональность по умолчанию (лучшая практика практически для всего, что вы обычно переопределяете):
  • Задайте для innerHTML диалогового блока значение single - это необязательный шаг, поэтому пропустите его, если вы этого не понимаете.
  • Перехватите __doPostBack, указав его на новую функцию newDoPostBack
function myNewClose (dialog)
{
    dialog.close();
   __doPostBack = newDoPostBack;
}
  1. Напишите функцию newDoPostBack:
function newDoPostBack(eventTarget, eventArgument)
{
    var theForm = document.forms[0];
    if (!theForm)
    {
        theForm = document.aspnetForm;
    }
 
    if (!theForm.onsubmit || (theForm.onsubmit() != false))
    {
        document.getElementById("__EVENTTARGET").value = eventTarget;
        document.getElementById("__EVENTARGUMENT").value = eventArgument;
        theForm.submit();
    }
}
    

В новом Jquery.simplemodal-1.3.js есть опция appendTo. Поэтому добавьте параметр с именем appendTo: 'form', потому что по умолчанию appendTo: 'body', который не работает в asp.net.

Была та же проблема, но {appendTo:'form'} привел к тому, что модальное всплывающее окно отображалось совершенно неправильно (как будто у меня проблема с CSS).

Оказывается, шаблон, который я создаю поверх, включает в себя другие формы на странице. Как только я установил {appendTo:'#aspnetForm'} (идентификатор формы Asp.net по умолчанию), все заработало отлично (включая обратную передачу).

был пойман этим - большое спасибо tghw и всем другим участникам за форму appendto вместо body fix. (решено атрибутами в версии 1.3)

кстати: если кому-то нужно программно закрыть диалоговое окно из .net - вы можете использовать этот тип синтаксиса

private void CloseDialog()
{
    string script = string.Format(@"closeDialog()");
    ScriptManager.RegisterClientScriptBlock(this, typeof(Page), UniqueID, script, true);
}

где javascript для closedialog выглядит так ....

    function closeDialog() {
        $.modal.close();
    }

В дополнение к ответу tghw мне помогло это отличное сообщение в блоге: jQuery: исправьте ваши постбэки в модальных формах - в частности, комментарий BtnMike: «У вас также не должно быть CssClass =” simplemodal-close ”, установленного на кнопке asp :.» Убрать это из класса было неочевидным для меня решением.

-Джон

если вы не хотите изменять исходный код SimpleModal. попробуй это..

После вызова метода modal () добавьте следующее:

$("#simplemodal-overlay").appendTo('form');
$("#simplemodal-container").appendTo('form');

плагин SimpleModal добавляет два таких файла в вашу разметку.

  1. 'simplemodal-overlay' для фона
  2. 'simplemodal-container' содержит div, который вы хотите использовать как всплывающее модальное окно.

Другие вопросы по теме