因此,我试图将我的应用程序中的确认框更改为更时尚的东西。
JQueryecomm.js添加的内容非常吸引人,但我真的很难让它以我想要的方式工作。
我在页面上有一个简单的链接按钮。
<asp:LinkButton ID="lnkDelete" CssClass="btn btn-danger" runat="server" OnClientClick="return ShowConfirm();" CommandArgument='<%#Eval("StatusId")%>' OnClick="DeleteStatus">
在他们的站点上,这是推荐的实现,但它不返回值或停止回发。
$.confirm({
title: 'Encountered an error!',
content: 'Something went downhill, this may be serious',
type: 'red',
typeAnimated: true,
buttons: {
tryAgain: {
text: 'Try again',
btnClass: 'btn-red',
action: function(){
close: function () {
});
我知道我可以将我的onclick函数移到这里,但是这样它就不能被重用了。当用户点击cancel时,我只想停止回发。那样的话,我可以在任何地方调用它,它就能正常工作。
我试了几件没有用的东西,这里有几个例子。所有这些都不能阻止回发,但我认为我应该包括我尝试过的内容。
function ShowConfirm() {
var Confirmed = $.confirm({
title: 'Please Confirm!',
content: 'Are you sue that you want to delete this record?',
type: 'red',
typeAnimated: true,
buttons: {
tryAgain: {
text: 'Delete',
btnClass: 'btn-red',
action: function () {
this.preventDefault();
close: function () {
return Confirmed;
}
另一个
function confirmation() {
var defer = $.Deferred();
$.confirm({
title: 'Please Confirm!',
content: 'Are you sue that you want to delete this record?',
type: 'red',
typeAnimated: true,
buttons: {
tryAgain: {
text: 'Delete',
btnClass: 'btn-red',
action: function () {
//Do something
defer.resolve(true);
close: function () {
//Do Something
defer.resolve(false);
return defer.promise();
function ShowConfirm() {
confirmation().then(function (answer) {
console.log(answer);
ansbool = (String(answer) == "true");
if (ansbool) {
alert("this is obviously " + ansbool);//TRUE
} else {
alert("and then there is " + ansbool);//FALSE
}
我还尝试了最后一个发送返回值的方法,但这也不起作用。我的onclick服务器端代码总是执行。
任何帮助都将不胜感激。
发布于 2022-05-11 15:13:59
好吧,这是怎么回事?
在接近“每一个”的情况下,使用一些jQuery.UI对话框,甜警报和99%的情况下?
这些jQuery和JavaScript外接程序全部,在所有情况下都有一个巨大的“相似”方面:
也就是说,代码不等待,也不阻塞调用代码。
这种类型代码的技术术语是我们所称的异步代码。
在螺母壳中,当您调用这样的代码时,提示对话框或任何内容都会显示,但是代码不会停止。您调用的例程将100%通过其代码运行,显示对话框或其他什么,然后100%完成、退出并返回值。
这样的代码的原因是不冻结浏览器,不损坏重新绘制,并显示信息。
因此,在JavaScript中只有两个真正停止代码的命令是
“警报()”,并确认()。
以上两个命令将停止代码。因此,你的问题:
您有一个平面简按钮,并说一些代码删除或执行一个破坏性的选项,然后我们都连线代码如下:
<asp:Button ID="cmdDelete" runat="server" Text="Server delete prompt"
OnClientClick="return confirm('Really delete this file?');" />
而且,正如我们所知道的,如果用户点击cancel,那么按钮代码就不会运行。
但是,那些js外接程序和高级对话框呢?他们不会等的。
我没有您特定的js插件,但是由于我们都使用jQuery,所以我给出了一个如何使用jQuery.UI来实现这个功能的例子。
所以,我们拿着上面的按钮,现在这样做:
<asp:Button ID="cmdTest" runat="server" Text="Server Delete Prompt"
ClientIDMode="Static"
OnClientClick="return mydeleteprompt(this)"/>
现在,在上面,我们调用一个例程,它将“显示”我们的对话框提示符。但是请记住上面的规则:代码流并不会停止调用js代码。
因此,我们需要做的仍然是第一次返回假。(现在显示了我们的酷提示对话框。
让这件事成功的方法?在上面我们通过了“这个”。在这种情况下," this“是当前按钮。所以,我们的代码现在看起来如下:
<div id="MyDialog" style="">
<h4><i>my cool dialog text</i></h4>
<h4><i>This delete can't be undone</i></h4>
<script>
var mydeleteok = false
function mydeleteprompt(cmdBtn) {
if (mydeleteok) {
return true
myDialog = $("#MyDialog")
myDialog.dialog({
title: "Delete the whole server system",
modal: true,
appendTo: "form",
buttons: {
ok: function () {
myDialog.dialog('close')
mydeleteok= true
$(cmdBtn).click()
cancel: function () {
myDialog.dialog('close')
return false
}
请注意,非常-但超级杜柏关闭在上面。例程将返回false。这意味着您单击按钮,调用js例程,显示对话框,然后返回FALSE。
现在,显示对话框。如果单击“确定”按钮,我们设置变量= true,然后再次单击该按钮!
这一次,相同的例程将运行,但我们设置“标志”= true,代码运行,并返回true,服务器端按钮代码将运行。
它看起来是这样的:
所以,用户点击按钮,运行代码,显示对话框,返回"false“。
现在,如果用户点击"ok",那么我们运行以下代码:
buttons: {
ok: function () {
myDialog.dialog('close')
mydeleteok= true
$(cmdBtn).click()
},
所以,我们设置了标志= true,然后再次单击按钮!这一次,按钮调用我们的例程,但这次例程将返回true,现在该按钮的服务器端代码将运行。
那么,你的大问题和问题?近100%,如果不是所有的JavaScript代码,这些天异步运行。它不需要等待。
因此,有一些先进的概念,如“等待”和诸如JavaScript“承诺”之类的东西,但它仍然没有解决这个问题。
因此,asp.net按钮单击事件,使用onclientclick是一个很好的特性,但是当您想要使用某种类型的对话框“外接程序”时,它往往会出现一些问题,因为正如我所说的,它们都没有等待。因此,您必须采用上述概念,设置一个标志(该标志代码仅在页面加载时运行--第一次)。
实际上,在使用.click()运行该按钮之后,可能会再次设置标志= false。但是,由于服务器端按钮导致回发,那么在大多数情况下,我们的标志将被重新设置为false。
编辑:使用jquery的示例-确认。
如前所述,我从未使用过确认库(其中大约有1+百万可供查找--您可能应该提供一个链接)。
无论如何,该对话框的工作方式如下:
<asp:Button ID="Button1" runat="server" Text="Button" CssClass="btn"
OnClick="Button1_Click"
OnClientClick="return myconfirm(this)"
<script>
var myconfirmok = false
function myconfirm(btn) {
if (myconfirmok) {
return true
$.confirm({
title: 'Confirm!',
content: 'Simple confirm!',
buttons: {
confirm: function () {
myconfirmok = true
$(btn).click()
cancel: function () {
console.log("user hit cancel")
return false // routine MUST return false!!!!
}
注意,在上面非常小心-我们在最后一行返回false!
因此,单击按钮,客户端代码运行,显示对话框,返回false。
现在,用户可以单击“取消”按钮,也可以单击“确认”。如果他们点击确认,我们设置标志= true,然后单击再次传递的按钮。现在,我们的例程再次运行,这次返回true,因此您的服务器端代码现在运行。
Edit3:-问题是LinkButton的使用
这里的问题是如何使用jQuery (甚至JavaScript)来单击链接按钮?
你必须用这个:
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Eval("HotelName") %>' >
</asp:TextBox>
<asp:LinkButton ID="cmdDel" runat="server" ClientIDMode="Static"
CommandArgument='<%# Eval("ID") %>'
onclick="cmdDel_Click"
OnClientClick="return myconfirm(this)"
>delete</asp:LinkButton>
</ItemTemplate>
</asp:Repeater>
<script>
var myconfirmok = false
function myconfirm(btn) {
if (myconfirmok) {
return true
$.confirm({
title: 'Confirm!',
content: 'Simple confirm!',
buttons: {
confirm: function () {
myconfirmok = true
$(btn)[0].click()
cancel: function () {
console.log("user hit cancel")
return false // routine MUST return false!!!!
</script>
所以,你必须解决的点击,甚至与。
当然,我从不使用链接按钮--我通常只是插入一个标准按钮,并且没有太多的理由使用链接按钮。但是,问题是是否使用了jQuery.Click --它需要使用单击事件才能工作。
我的链接按钮单击事件背后的代码如下:
Protected Sub cmdDel_Click(sender As Object, e As EventArgs)
Dim cmdDel As LinkButton = sender
Dim intPKID As Integer = cmdDel.CommandArgument
Debug.Print("code here to delete row with PK id = " & intPKID)
' get current repeater row
Dim OnerepRow As RepeaterItem = cmdDel.NamingContainer
Debug.Print("Repeter index row click = " & OnerepRow.ItemIndex)