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

Я пытаюсь вызвать функцию JavaScript с помощью всплывающего окна, и если пользователь нажимает "ОК", он вызывает функцию C#. Но страница всегда PostBack, в то же время я загружаю функцию 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);
    });
}

И тогда моя функция C#:

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

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

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

ОБНОВЛЕНИЕ (см. Комментарии № 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");

Когда я нажимаю Ok или No, ничего не срабатывает. И содержимое подсказки 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 %>');
        }
    });

Только "Ок" стреляет. Кнопка отмены не высокая.

РЕШЕНИЕ: Взял еще один alertstify.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' }); 

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

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/

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

Сервер:

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 Source и css скачаны с: http://fabien-d.github.io/alertify.js/

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

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

document.getElementById("PrchBtnHiddenYes").click();  
Другие вопросы по тегам