Сведения о вопросе

CPdeveloper

08:36, 21st August, 2020

Теги

SimpleModal Break ASP.Net Postbacks

Просмотров: 383   Ответов: 10

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

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

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

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



  Сведения об ответе

VERSUION

18:49, 11th August, 2020

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

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

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

UPDATE: версия 1.3 добавляет параметр appendTo в конфигурацию для указания того, к какому элементу модального диалогового окна следует добавить. Вот эти документы .


  Сведения об ответе

DINO

19:17, 27th August, 2020

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

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

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


  Сведения об ответе

DO__IT

07:37, 5th August, 2020

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

Так вот что происходит:

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

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

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

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

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

@Dan

Все стандартные постбэки ASP.NET работают путем вызова метода _ _ doPostBack javascript на странице.

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


  Сведения об ответе

baggs

14:04, 22nd August, 2020

попался на этом один - большое спасибо tghw и со всеми остальными вкладчиками по форме добавление вместо того чтобы исправить тело. (разрешен по атрибутам в версии 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();
    }


  Сведения об ответе

lool

14:38, 10th August, 2020

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

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


  Сведения об ответе

davran

00:46, 10th August, 2020

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


  Сведения об ответе

LAST

19:44, 23rd August, 2020

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

Решение (по состоянию на мою последнюю проверку перед обедом ):

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

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

$('#myJQselector').modal({onClose: mynewClose});
  • Вызовите функцию закрытия диалогового окна по умолчанию.  в функции, которую вы определяете, вы должны сначала вызвать функциональность по умолчанию (рекомендуется для всего, что вы обычно переопределяете):
  • Установите диалог div innerHTML в один &nbsp;-это не обязательный шаг, поэтому пропустите его, если вы не понимаете этого.
  • Hijack _ _ 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();
    }
}
    


  Сведения об ответе

ASSembler

05:21, 27th August, 2020

Я нашел следующие работы без изменения 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();
    });
}          

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


  Сведения об ответе

screen

11:58, 10th August, 2020

В дополнение к ответу tghw, этот отличный пост в блоге помог мне: jQuery: исправьте ваши отклики в модальных формах - в частности, комментарий BtnMike: "You also must not have CssClass=”simplemodal-close”, установленный на вашем asp:button.- Убрать это из класса было решением not-obvious-to-me.

-Джон


  Сведения об ответе

9090

21:06, 1st October, 2020

если вы не хотите изменить источник SimpleModal. попробовать это..

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

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

плагин SimpleModal добавляет два это к вашему markup.

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться