繁体   English   中英

OnClick 在 asp.net 中的 OnClientClick 之后执行

[英]OnClick executes after OnClientClick in asp.net

我有一个使用 OnClientClick 执行 javascript function 的 asp 按钮,我还想在 OnClientClick 之后执行 OnClick,但是,它永远不会执行。 我在 StackOverflow 和其他页面上经历了很多相同的主题,但它似乎对我不起作用。

<asp:Button ID="btn_del" runat="server" Font-Bold="True" Text="DELETE" Width="130px" UseSubmitBehavior="false" OnClientClick="if (!RunDelete()) return false;" OnClick="btn_del_Click" />

function RunDelete() {
        OnDelete("Delete?", function yes() {
            var id = $('#<%=txt_id.ClientID%>').val();

            $.ajax({
                type: "POST",
                url: "/demo.aspx/DeleteRowDb",
                data: JSON.stringify({ "RecordID": id }),
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (response) {
                    alert(response.d);
                }
            });
            return true;
            
        },
            function no() {
                return false;
            });
    }

我还尝试使用相同的 OnClick 创建另一个按钮,并尝试使用document.getElementById('<%= btn_del2.ClientID %>').click();从 javascript 执行但它仍然不起作用。 我需要执行 OnClick,因为我需要后面代码中的受保护 void 才能工作,同时我不能在公共 static 字符串 function 中做很多事情。

好的,让我们分解一下。

首先,不需要(或理由)提交行为 = false。

我们这里有一个简单的简按钮。

所以,这样说:

        <asp:Button ID="btn_del" runat="server" 
            Font-Bold="True" Text="DELETE" Width="130px" 
            OnClick="btn_del_Click" />

好的,当我们点击上面的时候,我们后面的代码就会运行。

现在说这个:

    protected void btn_del_Click(object sender, EventArgs e)
    {
        Debug.Print("Code to delete follows");
    }

好的,以上工作。

现在,要控制这个按钮(后面的代码)是否运行我们的代码,那么我们可以引入一个 OnClientClick。

如果客户端(JavaScript)返回 true,那么后面的代码就会运行,如果我们返回 false,那么按钮代码就不会运行。

所以,我们现在可以有这个:

        <asp:Button ID="btn_del" runat="server" 
            Font-Bold="True" Text="DELETE" Width="130px" 
            OnClick="btn_del_Click"
            OnClientClick="return myprompt()"
            CssClass="btn" />

        <script>
            function myprompt() {
                return confirm("Really delete this?")
            }
        </script>

现在我们得到了这个结果:

在此处输入图像描述

所以,如果用户点击确定,那么后面的代码就会运行。

如果用户点击取消,那么后面的代码将不会运行。

所以,以上是基本的设计和方法。

好的,内置的浏览器对话框看起来不太好。

那么,让我们用我们可能想要使用的众多(大量)对话框助手和加载项之一来做到这一点。

Since every web site, even these webforms web site has jQuery included by default, then a really great dialog add-in is to use jQuery.ui.

假设 jQuery.UI,则必须对此类代码进行一些更改。

jQuery(和大多数对话框插件)的工作方式是创建一个 div,里面是提示的内容。

然而,这是非常重要的:

大多数(如果不是全部)第 3 方对话框小部件不会阻止调用代码。

换句话说,使用js alert('some message') 或confirm('some message') 非常容易,因为它们会暂停调用代码。

但是,如今大多数(如果不是全部)js 代码都不会阻塞或 HALT 调用代码。 这是为了不冻结浏览器,所以这些天几乎所有浏览器代码都是我们所说的异步。 代码不会等待。

所以,让我们用一个漂亮的对话框来做这件事,并让对话框放在按钮点击旁边。

所以,使用 jQuery.UI(我推荐),那么我们的代码就变成了这样:

        <asp:Button ID="btn_del" runat="server" 
            Font-Bold="True" Text="DELETE" Width="130px" 
            OnClick="btn_del_Click"
            OnClientClick="return myprompt(this)"
            CssClass="btn" />

        <script>
            mypromptok = false
            function myprompt(btn) {
                if (mypromptok) {
                    return true
                }
                // lets pop jquery.UI dialog
                var mydiv = $("#mydeldiv")
                mydiv.dialog({
                    modal: true,
                    appendTo: "form",
                    title: "Delete Hotel?",
                    closeText: "",
                    width: "400px",
                    position: { my: 'left top', at: 'right bottom', of: btn },
                    buttons: {
                        ' ok ': function () {
                            mypromptok = true
                            btn.click() // click button again
                        },
                        ' cancel ': function () {
                            mydiv.dialog('close')
                        }
                    }
                });
                return false
            }
        </script>

        <div id="mydeldiv" style="display:none">
            <h3><i>Delete this Hotel</i></h3>
            <h4><i>This cannot be un-done</i></h4>
        </div>

结果很好,因为弹出是对话框,它会淡出(灰色在背景上),并且对话框位于用户刚刚单击的位置(他们的眼睛将其聚焦在该按钮上,因此弹出对话框正下方并按钮的右侧是用户曾经/正在寻找的位置)。

好的,现在,让我们利用上面的知识,从行的网格中使用它,现在有一个删除按钮和我们的提示。

请注意,您可以按照第一个示例或花哨的第二个示例使用超级简单的 confirm() 对话框。

因此,让我们假设一个 gridview 和一个删除数据的按钮。

所以,说这个标记:

        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
            DataKeyNames="ID" CssClass="table table-hover" Width="40%">
            <Columns>
                <asp:BoundField DataField="FirstName" HeaderText="FirstName" />
                <asp:BoundField DataField="LastName" HeaderText="LastName" />
                <asp:BoundField DataField="HotelName" HeaderText="HotelName" />
                <asp:BoundField DataField="City" HeaderText="City" />
                <asp:BoundField DataField="Description" HeaderText="Description" />
                <asp:TemplateField HeaderText="" ItemStyle-HorizontalAlign="Center">
                    <ItemTemplate>
                    <asp:Button ID="btn_del" runat="server" 
                        Font-Bold="True" Text="Delete" 
                        OnClick="btn_del_Click"
                        OnClientClick="return myprompt(this)"
                        CssClass="btn" />
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>

请注意上面的按钮。

所以,加载网格的代码是这样说的:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
            LoadGrid();

    }

    void LoadGrid()
    {
        string strSQL = @"SELECT * FROM tblHotelsA ORDER BY HotelName";
        using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
        {
            using (SqlCommand cmdSQL = new SqlCommand(strSQL, conn))
            {
                conn.Open();
                DataTable rstData = new DataTable();
                rstData.Load(cmdSQL.ExecuteReader());
                GridView1.DataSource = rstData;
                GridView1.DataBind();
            }
        }            
    }

现在我们有了这个:

在此处输入图像描述

点击我们的按钮,我们会看到:

在此处输入图像描述

所以,现在我们对该按钮的删除代码将是这样的:

    protected void btn_del_Click(object sender, EventArgs e)
    {
        Button btn = (Button)sender;
        GridViewRow gRow = (GridViewRow)btn.NamingContainer;

        // get database PK id of row click
        int pkID = (int)GridView1.DataKeys[gRow.RowIndex]["ID"];

        string strSQL = "DELETE FROM tblHotelsA WHERE ID = @ID";
        using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
        {
            using (SqlCommand cmdSQL = new SqlCommand(strSQL, conn))
            {
                cmdSQL.Parameters.Add("@ID", SqlDbType.Int).Value = pkID;
                conn.Open();
                cmdSQL.ExecuteNonQuery();
            }
        }
    }

所以,再次,我们有一个简单的代码事件(代码隐藏),我们有条件地运行此代码基于客户端确认()(内置 js 对话框),或最后一个示例,其中我们使用了 jQuery.UI 对话框.

因此,如果您想使用第二个示例(jQuery.UI),那么您必须将 jQuery.UI 添加/安装到您的项目中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM