【问题标题】:Wait popup response before C# function在 C# 函数之前等待弹出响应
【发布时间】:2015-03-16 13:20:33
【问题描述】:

我正在尝试使用弹出窗口调用 JavaScript 函数,如果用户单击“确定”,它会调用 C# 函数。但是页面总是在我加载 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...
    }

它使用一个简单的“确认”对话框。但我想自定义弹出窗口,这就是我使用“Alertify”库的原因。

感谢您的帮助。

更新(参见 cmets #3): 通过点击此链接 (Call Code Behind Function from JavaScript (not 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 被窃听了。 提示:

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("No"); } }

并带有 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' }); 

它有效!

【问题讨论】:

  • 这会很棘手。由于您的 Confirm() 函数在其执行结束时不知道是否取消回发,因此您需要在那里阻止回发,然后在您的 alertify 的事件处理程序中手动触发回发.或者,如果我是你,我会借此机会消除回发并将其替换为对 Web API 的 AJAX 调用。
  • 有简单的方法吗?我试着只调用 JS 并在按钮上返回 false。然后在我的 JS 函数中,它会调用一个 C# 方法。但问题是这个方法需要是静态的......
  • 请参阅this question 上接受的答案,了解如何从 JS 触发回发并针对特定的 C# 事件处理程序。
  • 我用新的尝试更新了我的第一篇文章(使用您的链接)。但也不工作。 ://
  • 您需要从您的Confirm() 函数中return false; 以防止在该函数完成时发生回发。

标签: javascript c# asp.net alertify


【解决方案1】:

解决方案: 创建 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' });
}

当你点击第一个按钮时,它会调用 JS。然后JS会调用第二个按钮的PostBack。 我遇到了 Alertify 的问题,所以我使用了另一个来源:http://alertifyjs.com/

【讨论】:

    【解决方案2】:

    您可以触发对隐藏按钮的点击,您可以在其中在后面的代码上附加点击处理程序。

    服务器:

    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 的疼痛不会让您这样做。

    你可以使用纯java脚本没有jquery:

    document.getElementById("PrchBtnHiddenYes").click();  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-18
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 2023-01-17
      • 2018-11-23
      相关资源
      最近更新 更多