Дождитесь ответа всплывающего окна перед функцией С#

Я пытаюсь вызвать функцию JavaScript с помощью всплывающего окна, и если пользователь нажимает «ОК», он вызывает функцию С#. Но страница всегда выполняет обратную передачу в то же время, когда я загружаю функцию JavaScript.

Мой HTML ASP:Кнопка:

<asp:Button ID="PrchBtn" runat="server" class="PrchBtn" Text="<%$ Resources:Resource, WebEDI_Save %>" OnClick="PrchBtn_Click" OnClientClick = "Confirm();" />

OnClientClick вызывает эту функцию JS:

function Confirm() {
    var confirm_value = document.createElement("INPUT");
    confirm_value.type = "hidden";
    confirm_value.name = "confirm_value";

    alertify.confirm('<%= GetGlobalResourceObject("Resource","WebEDI_PDF_MsgBox") %>', function (e) {
        if (e) {
            confirm_value.value = "Yes";
        } else {
            confirm_value.value = "No";
        }
        document.forms[0].appendChild(confirm_value);
    });
}

И затем моя функция С#:

public void PrchBtn_Click(object sender, EventArgs e)
    {
        //Code here...
    }

Он работает с простым диалоговым окном «подтвердить». Но я хочу настроить всплывающее окно, поэтому я использую библиотеку «Alertify».

Спасибо за вашу помощь.

ОБНОВЛЕНИЕ (см. комментарии №3): Перейдя по этой ссылке (Вызов кода функции из JavaScript (не AJAX!)) Это мой фактический код:

<asp:Button ID="PrchBtn" runat="server" class="PrchBtn" Text="<%$ Resources:Resource, WebEDI_Save %>" OnClientClick="Confirm(); return false;" />
<asp:Button runat="server" ID="PrchBtnHidden" ClientIDMode="Static" OnClick="PrchBtn_Click" style="display:none;" />

function Confirm() {
    var confirm_value = document.createElement("INPUT");
    confirm_value.type = "hidden";
    confirm_value.name = "confirm_value";

    alertify.confirm('<%= GetGlobalResourceObject("Resource","WebEDI_PDF_MsgBox") %>', function (e) {
        if (e) {
            confirm_value.value = "Yes";
            document.forms[0].appendChild(confirm_value);
            __doPostBack('<%= PrchBtnHidden.UniqueID %>');
        } else {
            confirm_value.value = "No";
            document.forms[0].appendChild(confirm_value);
            __doPostBack('<%= PrchBtnHidden.UniqueID %>');
        }
    });
}

Но проблема та же, JS и C# делают что-то одновременно.

ОБНОВЛЕНИЕ (дополнительная ошибка): я не знаю почему, но мое оповещение содержит ошибку. В подсказке:

alertify.prompt("Message", function (e, str) {
        // str is the input text
        if (e) {
            Console.Log("Ok");
        } else {
            Console.Log("No");
        }
    }, "Default Value");

Когда я нажимаю «ОК» или «Нет», ничего не срабатывает. И содержимое TextBox подсказки:

function (e, str) { // str - это входной текст if (e) { Console.Log("Ok"); } else { Console.Log("Нет"); } }

И с помощью Alertify.Confirm

alertify.confirm('<%= GetGlobalResourceObject("Resource","WebEDI_PDF_MsgBox") %>', function (e) {
        if (e) {
            confirm_value.value = "Yes";
            document.forms[0].appendChild(confirm_value);
            __doPostBack('<%= PrchBtnHidden.UniqueID %>');
        } else {
            confirm_value.value = "No";
            document.forms[0].appendChild(confirm_value);
            __doPostBack('<%= PrchBtnHidden.UniqueID %>');
        }
    });

Только "Ок" горит. Кнопка отмены ничего не делает.

РЕШЕНИЕ. Взял другой файл alertify.js (http://alertifyjs.com/) и это моя функция JS:

alertify.confirm('<%= GetGlobalResourceObject("Resource","WebEDI_PDF_MsgBox") %>', function () {
        confirm_value.value = "Yes";
        document.forms[0].appendChild(confirm_value);
        __doPostBack('<%= PrchBtnHidden.UniqueID %>');
    },
      function () {
          confirm_value.value = "No";
          document.forms[0].appendChild(confirm_value);
          __doPostBack('<%= PrchBtnHidden.UniqueID %>');
      }).set('labels', { ok: 'Ok', cancel: 'No' }); 

И это работает!


person Phobie    schedule 16.03.2015    source источник
comment
Это будет сложно сделать. Поскольку ваша функция Confirm() не будет знать в конце своего выполнения, следует ли отменить обратную передачу или нет, вам нужно будет предотвратить обратную передачу там, а затем вручную запустить обратную передачу в обработчике событий для вашего alertify. Или на вашем месте я бы воспользовался возможностью, чтобы исключить обратную передачу и заменить ее вызовом AJAX для Веб-API.   -  person mason    schedule 16.03.2015
comment
Есть ли простой способ сделать это? Я попытался вызвать только JS и вернуть false на кнопку. Затем в моей функции JS он вызовет метод С#. Но проблема в том, что этот метод должен быть статическим...   -  person Phobie    schedule 16.03.2015
comment
См. принятый ответ на этот вопрос о том, как вызвать обратная передача из JS и нацеливается на конкретный обработчик событий C#.   -  person mason    schedule 16.03.2015
comment
Я обновил свой первый пост новой попыткой (по вашей ссылке). Но тоже не работает. :/   -  person Phobie    schedule 16.03.2015
comment
Вам нужно return false; из вашей Confirm() функции, чтобы предотвратить обратную передачу после завершения этой функции.   -  person mason    schedule 16.03.2015
comment
Хорошо, забыл это возвращение. Итак, теперь, когда я нажимаю кнопку, он вызывает JS. Затем JS вызывает C#, но только при нажатии кнопки OK. Кнопка Отмена ничего не вызывает.   -  person Phobie    schedule 16.03.2015
comment
Готово. Я не понимаю, почему, но когда я нажимаю «Отмена», С# не вызывается.   -  person Phobie    schedule 16.03.2015
comment
Бьюсь об заклад, причина, по которой он не продолжается, когда вы нажимаете «Нет», связана с тем, как оповещение обрабатывает ответ «Нет» для alertify.confirm. Попробуйте использовать alertify.prompt, как описано здесь (обратите внимание на разные аргументы).   -  person mason    schedule 16.03.2015
comment
Так что да, мое оповещение прослушивается. В примере подтверждения в документе Alertify срабатывает только OK. С подсказкой ничего не срабатывает, а содержимое текстового поля - моя функция оповещения.   -  person Phobie    schedule 16.03.2015
comment
Извините, я недостаточно хорошо знаком с alertify, чтобы помочь вам в этом. Если вы добавите свой код alertify.prompt к своему вопросу, я смогу установить alertify в своей системе сегодня вечером и попробовать отладить таким образом.   -  person mason    schedule 16.03.2015
comment
Обновил свой первый пост. Я новичок в JS и не могу найти проблему.   -  person Phobie    schedule 16.03.2015
comment
На данный момент у меня нет времени, чтобы на самом деле играть с вашим кодом, я попробую позже. Я скажу, что я думаю, что все выглядит хорошо, поэтому я предполагаю, что alertify работает не так, как мы ожидаем. Обычно я использую jQuery Noty, кстати, это похоже на alertify. Возможно, вы захотите поэкспериментировать с ним.   -  person mason    schedule 16.03.2015
comment
Нашел решение с другим файлом alertify.js. Спасибо за вашу помощь !   -  person Phobie    schedule 16.03.2015
comment
Обязательно опубликуйте свое решение в качестве ответа, чтобы другие знали, что делать, если они столкнутся с той же проблемой.   -  person mason    schedule 16.03.2015
comment
Не публикуйте свое решение в своем вопросе! Поместите его в отдельный пост ответа.   -  person mason    schedule 16.03.2015


Ответы (2)


Решение. Создайте 2 HTML-кнопки, одну видимую, связанную с функцией JavaScript, а другую невидимую, связанную с методом C#:

<asp:Button ID="PrchBtn" runat="server" class="PrchBtn" Text="<%$ Resources:Resource, WebEDI_Save %>" OnClientClick="Confirm(); return false;" />
<asp:Button runat="server" ID="PrchBtnHidden" ClientIDMode="Static" OnClick="PrchBtn_Click" style="display:none;" />

JS:

function Confirm() {
    var confirm_value = document.createElement("INPUT");
    confirm_value.type = "hidden";
    confirm_value.name = "confirm_value";

    alertify.confirm('<%= GetGlobalResourceObject("Resource","WebEDI_PDF_MsgBox") %>', function () {
        confirm_value.value = "Yes";
        document.forms[0].appendChild(confirm_value);
        __doPostBack('<%= PrchBtnHidden.UniqueID %>');
    },
      function () {
          confirm_value.value = "No";
          document.forms[0].appendChild(confirm_value);
          __doPostBack('<%= PrchBtnHidden.UniqueID %>');
      }).set('labels', { ok: 'Ok', cancel: 'No' });
}

Когда вы нажмете на 1-ю кнопку, она вызовет JS. Затем JS вызовет PostBack второй кнопки. У меня возникла проблема с Alertify, поэтому я использовал другой источник: http://alertifyjs.com/.

person Phobie    schedule 16.03.2015

Вы можете инициировать щелчок по скрытым кнопкам, где вы можете прикрепить обработчики кликов к коду позади.

Сервер:

protected void Page_Load(object sender, EventArgs e)
        {
            PrchBtnHiddenNo.Click += PrchBtnHiddenNo_Click;
            PrchBtnHiddenYes.Click += PrchBtnHiddenYes_Click;
        }

        void PrchBtnHiddenYes_Click(object sender, EventArgs e)
        {
            throw new NotImplementedException();
        }

        void PrchBtnHiddenNo_Click(object sender, EventArgs e)
        {
            throw new NotImplementedException();
        }

Клиент:

<asp:Content runat="server" ID="BodyContent" ContentPlaceHolderID="MainContent">
    <script src="Scripts/alertify.js"></script>
    <link href="Content/alertify.default.css" rel="stylesheet" />
    <link href="Content/alertify.core.css" rel="stylesheet" />
    <hgroup class="title">
        <h1>Test alertify</h1>
    </hgroup>


    <asp:Button ID="PrchBtn" runat="server" class="PrchBtn" Text="Click Here" OnClientClick="Confirm(); return false;" />
    <asp:Button runat="server" ID="PrchBtnHiddenYes" ClientIDMode="Static" Style="display: none;" />
    <asp:Button runat="server" ID="PrchBtnHiddenNo" ClientIDMode="Static" Style="display: none;" />
    <script>
        function Confirm() {
            var confirm_value = document.createElement("INPUT");
            confirm_value.type = "hidden";
            confirm_value.name = "confirm_value";

            alertify.confirm('Do it', function (e) {
                if (e) {
                    $('#PrchBtnHiddenYes').click();
                    confirm_value.value = "Yes";

                } else {
                    $('#PrchBtnHiddenNo').click();
                    confirm_value.value = "No";                    
                }
            });
        }
    </script>    
</asp:Content>

Исходный код JS и css загружены с: http://fabien-d.github.io/alertify.js/

Важное примечание. Если вы пытаетесь инициировать нажатие на ввод загрузки файла, IE for sore не позволит вам это сделать.

Вы можете использовать чистый java-скрипт без jquery:

document.getElementById("PrchBtnHiddenYes").click();  
person SilentTremor    schedule 16.03.2015