【问题标题】:how can a clicked asp.net button open jQuery dialog and then resume default when Yes is clicked?单击的 asp.net 按钮如何打开 jQuery 对话框,然后单击“是”时恢复默认设置?
【发布时间】:2011-09-28 21:52:57
【问题描述】:

我有一个 jQuery 对话框和一个 asp.net 按钮(删除)。单击删除按钮时,我希望对话框打开一个确认窗口,显示“您确定要删除此记录吗?”。当用户单击是时,我想恢复 asp.net 回发。到目前为止,这是我的代码:

   $("#dialog-delete").dialog({
        autoOpen: false,
        height: 200,
        width: 400,
        modal: true,
        resizable: false,
        buttons: {
            'Cancel': function () {
                $(this).dialog('close');
            },
            'Yes': function () {
                $(this).dialog('close');
                //__doPostBack('ctl00$cp1$btnDelete','');
            }
        },
        open: function () {
            $(":button:contains('Yes')").addClass("red");
        }
    });
     $("[id*=btnDelete]").live('click', function (e) {
        e.preventDefault();
        $("#dialog-delete").dialog('open');
     });

所以我使用 preventDefault 停止回发,对话框打开并显示消息,但如果不对删除按钮进行硬编码,我无法触发删除,这很讨厌。无论如何我可以在对话框显示时暂停点击事件并在取消时调用 preventDefault 并在是时恢复?

【问题讨论】:

  • 您可以使用javascript在一行代码中完成。 lbtnDelete.Attributes.Add("onclick", "return confirm('你确定要删除这条记录吗?');");
  • 是的,但那是使用浏览器确认。我们在整个应用程序中使用 jQuery 对话框作为标准,我必须保持一致。到目前为止,除了在一个地方之外,我们不需要以这种方式“继续”回发(并且我们对回发调用进行了硬编码 - 就像我说的那样令人讨厌)。

标签: jquery asp.net jquery-dialog


【解决方案1】:

您可以将实时事件类型更改为 mouseup 而不是 click,然后使用 click 事件来触发回发。

$("[id*=btnDelete]").live('mouseup', function (e) { ...

...

$("[id*=btnDelete]").click();

编辑(基于 cmets)

另一个想法,您可以坚持处理点击事件的原始想法,并在确认删除后调用.die() 函数来删除先前附加的实时事件处理程序,使您能够调用.click() 并导致回发.

你可以像这样调用 .die() 函数:

$("#dialog-delete").dialog({
    autoOpen: false,
    height: 200,
    width: 400,
    modal: true,
    resizable: false,
    buttons: {
        'Cancel': function () {
            $(this).dialog('close');
        },
        'Yes': function () {
            $(this).dialog('close');
            $("[id*=btnDelete]").die('click');
            $("[id*=btnDelete]").click();
        }
    },
    open: function () {
        $(":button:contains('Yes')").addClass("red");
    }
});

 $("[id*=btnDelete]").live('click', function (e) {
    e.preventDefault();
    $("#dialog-delete").dialog('open');
 });

【讨论】:

  • 我会试一试,但我的网格顶部和底部有 2 个删除按钮。我现在将其简化为一个按钮。但是如果 jQuery/javascript 返回了与我的选择器匹配的 2 个元素并且我尝试调用 click 方法,那么使用 2 个按钮会引发咆哮吗?最好有一个更优雅的解决方案,这样我就可以通过将事件参数传递给对话框或类似的东西来确定单击了哪个按钮。感谢您的回复。
  • 好的,mousedown(尽管有 preventDefault)仍然会触发回发。 :s 打算试试 mouseup。
  • mouseup 工作但必须修改我的代码以在我的选择器中返回 2 个匹配按钮时选择第一个按钮。尽管如此,仍然坚持寻求更清洁的解决方案。将在下面发布我的代码作为答案。
【解决方案2】:

单击相应按钮时提交 ASP.NET 表单。

...
buttons: {
      'Cancel': function () {
           $(this).dialog('close');
       },
       'Yes': function () {
           $(this).dialog('close');
           $('#aspnetForm').submit();   // you may need to use a different selector based on your form name
       }
   }

【讨论】:

  • 以这种方式提交表单不会向调用者提供代码隐藏,我需要触发回发(但我还需要调用项目的 id - 这几乎是我的问题在于)。
【解决方案3】:

我得到了这个工作,但到目前为止我不喜欢这个解决方案。我更喜欢更简洁的解决方案,如果可能的话,我可以在按钮单击时捕获事件并将其以某种方式传递到我的对话框中。所以我坚持下去,希望有人有更好的答案。我让它工作的代码(现在)是:

$("#dialog-delete").dialog({
    autoOpen: false,
    height: 200,
    width: 400,
    modal: true,
    resizable: false,
    buttons: {
        'Cancel': function () {
            $(this).dialog('close');
        },
        'Yes': function () {
            $(this).dialog('close');
            $("[id*=btnDelete]")[0].click();
            //__doPostBack('ctl00$cp1$btnVoid','');
        }
    },
    open: function () {
        $(":button:contains('Yes')").addClass("red");
    }
});
 $("[id*=btnDelete]").live('mousedown', function (e) {
    e.preventDefault();
    $("#dialog-delete").dialog('open');
 });

基于上述@jdavies 的帮助(以及我的 cmets 以增强答案)。我将按钮处理程序更改为 mousedown 事件并在 Yes 按钮处理程序中触发 click 事件。

我想知道如果用户通过键盘触发按钮会发生什么,这也是我觉得恶心的部分原因。 :)

坚持争取更好的东西,但至少它正在运行......

【讨论】:

  • 因为这样的问题,我已经不再使用 ASP.NET WebForms。我总是发现要完全控制用户体验需要大量杂乱的代码。您可能不应该有 2 个具有相同 ID (btnDelete) 的控件。我会他们 btnDeleteTop & btnDeleteBottom 什么的。如果您愿意,您可以处理 keydown 并检查 ENTER 键以及具有焦点的控件,但很快就会变得混乱。祝你好运!
  • 它们被命名为 btnDeleteTop 和 btnDeleteBottom,我使用的 jQuery 选择器对两者都适用,它有效。我也在家里为我的项目使用 MVC,我工作的公司正在慢慢考虑使用它,但我现在被困在带有 webforms 的 asp.net 2 (delphi) 中。 :(
猜你喜欢
  • 1970-01-01
  • 2016-12-06
  • 1970-01-01
  • 2011-06-18
  • 2013-04-10
  • 2015-03-25
  • 2017-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多