可编辑的Gridview行删除点击确认函数在用户响应前返回

问题描述

我在 asp.net 中的可编辑 Gridview 中有“删除”按钮,在单击删除时,我有我的功能显示用户反馈的确认弹出窗口,我想删除与否,但问题是在用户反馈功能返回它的输出之前总是假的。下面是客户端点击删除按钮

OnClientClick="return confirmDelete();"

下面是函数定义

function confirmDelete() {
            
            var isDelete = false;
             
             showPopup(null,function (response) {
                debugger;
                 if (response == "btnYes") {
                    return true;
                } else {
                    return false;
                }
            });
            return false;
            }

谁能指导我应该在哪里更改,以便在用户响应后在后端收到删除调用

解决方法

只有 confirm() 可以保存脚本。所以,如果你让你的 JavaScript 正常工作。

import { Serializer,OutgoingResponse } from '@nestjs/microservices';
import { Logger } from '@nestjs/common';

export class OutboundResponseSerializer implements Serializer {

    private readonly logger = new Logger('OutboundResponseIdentitySerializer');

    serialize(value: any): OutgoingResponse {
      this.logger.debug(`-->> Serializing outbound response: \n${JSON.stringify(value)}`);
      return value.data;
    }
}

您拥有它的方式只是在 showPopup 出现后继续 - 但您可能甚至看不到它,因为它会继续回发。

另一种方法是提出问题,然后在第二个动作调用中进行删除。

,

好的,问题如所指出? 您没有显示 ShowPopup() 的 js 代码。

但是,让我们假设您正在使用 jQuery.UI(对话框)或类似的东西。

如前所述,问题是大多数 Web 代码 (js) 是异步的。所以会发生什么是你点击按钮 - 客户端代码运行 - 但不会像在 js 中确认那样暂停或等待。因此,现在显示对话框,但单击按钮仍会运行服务器端代码存根,因为您的 showpopup() 代码不会停止。事实上,几乎所有的网络代码都是这样工作的。因此,如果您使用引导程序对话框,或者更好的是 jquery.UI 对话框,那么您必须设置稍微不同的函数调用。

会发生什么:

您点击按钮。 js 代码运行,显示对话框(但返回 false,因此服务器端按钮代码不运行)。用户现在处理对话框 - 说他们点击“确定”或“确认”。现在,您要做的是将该函数设置为返回 true,然后再次单击该按钮(在 js 中),它将根据您的选择返回 true 或 false,因此您可以根据该选择有条件地运行服务器端按钮.

这是一个使用 jQuery.UI 的工作示例。请注意我们如何确定布尔标志的范围以使其工作。

所以,我们现在有:

<asp:Button ID="btnDelete" runat="server" Text="Delete" 
  
  OnClientClick = "return mydeleteprompt(this)" />    

所以,假设我们在页面上有一些删除按钮。

现在,我们的 jQuery.UI 代码如下所示:

<script>

    mydelpromptok = false
    function mydelprompt(btn) {

        if (mydelpromptok) {
            return true
        }

        var myDialog = $("#mydelprompt")
        myDialog.dialog({
            title: "Confirm delete",modal: true,width: "320px",resizable: false,appendTo: "form",autoOpen: false,buttons: {
                ok: function () {
                    myDialog.dialog("close")
                    mydelpromptok = true
                    btn.click()
                },cancel: function () {
                    myDialog.dialog("close")
                }
            }
        })
        myDialog.dialog('open')
        return false
    }

注意我们如何设置函数返回 FALSE!!!。所以,您现在单击按钮,弹出对话框 - 我们已经返回 false !!!现在,当您点击确定或在对话框中确认时,请注意我们如何在 js 代码中设置标志 = true 并再次单击按钮。但是现在当 fucntion 运行时,它将根据该标志返回 true,现在服务器端按钮代码将运行。相同的想法可以与您的代码一起使用 - 我们只是不知道 ShowPopUP 是如何工作的 - 但相同的想法会起作用。

由于代码无法暂停,所以我们只需将代码设置为始终返回 false 并弹出对话框。当用户做出选择时,我们设置该标志,然后再次单击该按钮。现在,它将返回 true(或 false),因此我们可以有条件地运行该按钮,但是我们在不停止代码的情况下完成了此操作 - 正如我所指出的,这在如今的 Web 代码中非常罕见 - 现在都是异步代码,因此您现在必须牢记这种非停机代码概念。

所以,现在让我们假设按钮在网格中,像这样说:

   <asp:GridView ID="GridView1" runat="server" 
        AutoGenerateColumns="False" 
        DataKeyNames="ID" CssClass="table table-hover  borderhide" >
      <Columns>

        <asp:TemplateField  HeaderText="HotelName" >
            <ItemTemplate><asp:TextBox id="HotelName" runat="server" Text='<%# Eval("HotelName") %>' /></ItemTemplate>
        </asp:TemplateField>

        <asp:TemplateField  HeaderText="FirstName" SortExpression="ORDER BY FirstName" >
            <ItemTemplate><asp:TextBox id="FirstName" runat="server" Text='<%# Eval("FirstName") %>' /></ItemTemplate>
        </asp:TemplateField>

        <asp:TemplateField  HeaderText="LastName" >
            <ItemTemplate><asp:TextBox id="LastName" runat="server" Text='<%# Eval("LastName") %>' /></ItemTemplate>
        </asp:TemplateField>

       <asp:TemplateField  HeaderText="City" >
            <ItemTemplate><asp:TextBox id="City" runat="server" Text='<%# Eval("City") %>' /></ItemTemplate>
        </asp:TemplateField>

          <asp:TemplateField HeaderText="Delete">
              <ItemTemplate>
                  <asp:Button ID="btnDelete" runat="server" Text="Delete"
                      OnClientClick = "return mydelprompt(this);"
                      OnClick="btnDelete_Click"
                      />
              </ItemTemplate>
          </asp:TemplateField>
    </Columns>

      </asp:GridView>

所以,我们的代码来加载这个:

Protected Sub Page_Load(ByVal sender As Object,ByVal e As System.EventArgs) Handles Me.Load

    If IsPostBack = False Then
        LoadGrid()
    End If

End Sub

Sub LoadGrid()

    ' load up our grid
    Using cmdSQL As New SqlCommand("SELECT TOP 10 * from tblHotels  ORDER BY HotelName ",New SqlConnection(My.Settings.TEST4))
        cmdSQL.Connection.Open()

        GridView1.DataSource = cmdSQL.ExecuteReader
        GridView1.DataBind()

    End Using


End Sub

现在,我使用 jQuery.ui,所以我们额外的标记是这样的:

        <div id="MyDialog" style="display:none">
            <h2>Delete this hotel?</h2>
        </div>

     <script>
        mydelpromptok = false
        function mydelprompt(btn) {

            if (mydelprompt) {
                return true
            }

            myDialog = $("#MyDialog")
            myDialog.dialog({
                title: "Delete this Hotel - confirm?",buttons: {
                    Delete: function () {
                        myDialog.dialog('close')
                        mydelprompt = true
                        btn.click()
                    },cancel: function () {
                        myDialog.dialog('close')
                    }
                }
            })
            return false
        }
   </script>

那么,现在我们后面的删除按钮代码是这样的:

Protected Sub btnDelete_Click(sender As Object,e As EventArgs)

    Dim btn As Button = sender

    Dim rRow As GridViewRow = btn.Parent.Parent

    ' get pk,and then delete this row.

    Using cmdSQL As New SqlCommand("DELETE FROM tblHotels Where ID = @ID",New SqlConnection(My.Settings.TEST4))
        cmdSQL.Parameters.Add("@ID",SqlDbType.Int).Value = GridView1.DataKeys(rRow.RowIndex).Item("ID")
        cmdSQL.ExecuteNonQuery()
    End Using

End Sub

它看起来像这样:

enter image description here

所以我们只是在网格中放置了一个平面 jane 按钮。但是,除非我们确认漂亮的 jQuery.ui 对话框,否则那个按钮点击和后面的代码不会运行。

然后在按钮中单击?请注意我是如何使用 .parent 抓取一个网格视图行的。和所有的数据库操作一样吗?我们使用 PK,所以我们当然总是像在所有网格附近一样将 DataKeys 设置为 PK 值。