问题描述
我在 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
它看起来像这样:
所以我们只是在网格中放置了一个平面 jane 按钮。但是,除非我们确认漂亮的 jQuery.ui 对话框,否则那个按钮点击和后面的代码不会运行。
然后在按钮中单击?请注意我是如何使用 .parent 抓取一个网格视图行的。和所有的数据库操作一样吗?我们使用 PK,所以我们当然总是像在所有网格附近一样将 DataKeys 设置为 PK 值。