使用 SweetAlert2 替换 ASP.Net 按钮上的 "return confirm()"
Using SweetAlert2 to replace "return confirm()" on an ASP.Net Button
在 ASP.Net 中工作时,我经常喜欢 "Are you sure?" 在单击删除按钮之类的内容时出现弹出窗口。这很容易像这样完成:
<asp:Button runat="server" id="btnDelete" Text="Delete" onClientClick="return confirm('Are you sure?');" onClick="btnDelete_Click" />
我真的很喜欢 SweetAlert2 的确认对话框的样式和总体感觉,但是当我尝试以类似的方式集成它们时,它们似乎有点麻烦。有人可以向我解释一下我如何能够 return SweetAlert2 对话框结果根据单击的按钮继续或停止吗?
这是我目前得到的:
<asp:Button runat="server" id="btnDelete" Text="Delete" onClientClick="return sweetAlertConfirm();" onClick="btnDelete_Click" />
function sweetAlertConfirm() {
event.preventDefault();
swal({
title: 'Are you sure?',
text: "You won't be able to revert this!",
type: 'warning',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: 'Yes, delete it!'
// }).then(function() {
// CONFIRM WAS CHOSEN
// }, {function() {
// CANCEL WAS CHOSEN
});
}
对话框出现,删除没有被处理,当然,因为我目前正在做一个 event.preventDefault()
并且什么都没有被 returned。我还注意到 I can use promises,在我的 swal({...})
之后添加了一个 .then()
,但是我不确定在这种情况下如何使用它。
如果需要,我可以使用实际触发代码隐藏方法的隐藏按钮,并根据用户选择单击该隐藏按钮,但我希望避免这种情况。
由于 SweetAlert2 对话框是异步处理的,您必须在解决承诺时以编程方式触发另一个按钮单击。无需创建隐藏按钮,您可以通过设置标志以指示操作已确认来重用 btnDelete
。当第二次点击被处理时,该标志将被检测到,按钮点击将被允许继续并触发服务器事件。
<asp:Button ... OnClientClick="return sweetAlertConfirm(this);" OnClick="btnDelete_Click" />
function sweetAlertConfirm(btnDelete) {
if (btnDelete.dataset.confirmed) {
// The action was already confirmed by the user, proceed with server event
btnDelete.dataset.confirmed = false;
return true;
} else {
// Ask the user to confirm/cancel the action
event.preventDefault();
swal({
title: 'Are you sure?',
text: "You won't be able to revert this!",
type: 'warning',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: 'Yes, delete it!'
})
.then(function () {
// Set data-confirmed attribute to indicate that the action was confirmed
btnDelete.dataset.confirmed = true;
// Trigger button click programmatically
btnDelete.click();
}).catch(function (reason) {
// The action was canceled by the user
});
}
}
var obj = { status: false, ele: null };
function DeleteConfirm(btnDelete) {
if (obj.status) {
obj.status = false;
return true;
};
Swal.fire({
title: 'Are you sure?',
text: "You won't be able to revert this!",
type: 'warning',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: 'Yes, delete it!'
}).then((result) => {
if (result.value) {
obj.status = true;
//do postback on success
obj.ele.click();
Swal.fire({
title: 'Deleted!',
text: 'Your file has been deleted.',
type: 'success',
timer: 800
})
}
});
obj.ele = btnDelete;
return false;
}
<link href="https://cdn.jsdelivr.net/npm/sweetalert2@8/dist/sweetalert2.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js">
</script>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@8/dist/sweetalert2.min.js"></script>
<asp:LinkButton ID="cmdDelete" runat="server" CausesValidation="False" OnClientClick="return DeleteConfirm(this);">
在 ASP.Net 中工作时,我经常喜欢 "Are you sure?" 在单击删除按钮之类的内容时出现弹出窗口。这很容易像这样完成:
<asp:Button runat="server" id="btnDelete" Text="Delete" onClientClick="return confirm('Are you sure?');" onClick="btnDelete_Click" />
我真的很喜欢 SweetAlert2 的确认对话框的样式和总体感觉,但是当我尝试以类似的方式集成它们时,它们似乎有点麻烦。有人可以向我解释一下我如何能够 return SweetAlert2 对话框结果根据单击的按钮继续或停止吗?
这是我目前得到的:
<asp:Button runat="server" id="btnDelete" Text="Delete" onClientClick="return sweetAlertConfirm();" onClick="btnDelete_Click" />
function sweetAlertConfirm() {
event.preventDefault();
swal({
title: 'Are you sure?',
text: "You won't be able to revert this!",
type: 'warning',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: 'Yes, delete it!'
// }).then(function() {
// CONFIRM WAS CHOSEN
// }, {function() {
// CANCEL WAS CHOSEN
});
}
对话框出现,删除没有被处理,当然,因为我目前正在做一个 event.preventDefault()
并且什么都没有被 returned。我还注意到 I can use promises,在我的 swal({...})
之后添加了一个 .then()
,但是我不确定在这种情况下如何使用它。
如果需要,我可以使用实际触发代码隐藏方法的隐藏按钮,并根据用户选择单击该隐藏按钮,但我希望避免这种情况。
由于 SweetAlert2 对话框是异步处理的,您必须在解决承诺时以编程方式触发另一个按钮单击。无需创建隐藏按钮,您可以通过设置标志以指示操作已确认来重用 btnDelete
。当第二次点击被处理时,该标志将被检测到,按钮点击将被允许继续并触发服务器事件。
<asp:Button ... OnClientClick="return sweetAlertConfirm(this);" OnClick="btnDelete_Click" />
function sweetAlertConfirm(btnDelete) {
if (btnDelete.dataset.confirmed) {
// The action was already confirmed by the user, proceed with server event
btnDelete.dataset.confirmed = false;
return true;
} else {
// Ask the user to confirm/cancel the action
event.preventDefault();
swal({
title: 'Are you sure?',
text: "You won't be able to revert this!",
type: 'warning',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: 'Yes, delete it!'
})
.then(function () {
// Set data-confirmed attribute to indicate that the action was confirmed
btnDelete.dataset.confirmed = true;
// Trigger button click programmatically
btnDelete.click();
}).catch(function (reason) {
// The action was canceled by the user
});
}
}
var obj = { status: false, ele: null };
function DeleteConfirm(btnDelete) {
if (obj.status) {
obj.status = false;
return true;
};
Swal.fire({
title: 'Are you sure?',
text: "You won't be able to revert this!",
type: 'warning',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: 'Yes, delete it!'
}).then((result) => {
if (result.value) {
obj.status = true;
//do postback on success
obj.ele.click();
Swal.fire({
title: 'Deleted!',
text: 'Your file has been deleted.',
type: 'success',
timer: 800
})
}
});
obj.ele = btnDelete;
return false;
}
<link href="https://cdn.jsdelivr.net/npm/sweetalert2@8/dist/sweetalert2.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js">
</script>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@8/dist/sweetalert2.min.js"></script>
<asp:LinkButton ID="cmdDelete" runat="server" CausesValidation="False" OnClientClick="return DeleteConfirm(this);">