Остановить обратную передачу ImageButton OnCommand с помощью javascript в asp.net 4.0 (Internet Explorer)

Похоже, демон Internet Explorer снова атаковал, и я не могу понять это:

У меня есть ImageButton, использующий OnCommand для удаления определенной записи из моей базы данных. Однако я реализовал это так, что пользователь сначала подтвердит, что он хочет удалить определенный элемент.

Вот код моего ImageButton

<asp:ImageButton runat="server" ID="imgDelete" ImageUrl="~/Controls/TaskDetails/Images/delete.png" OnCommand="Tag_DeleteCommand" Visible='<%# CanDelete %>' OnClientClick="javascript:confirmDialog(this, 'Remove Tag','Are you sure you want to remove this tag?', 1); return false;"
            CommandArgument='<%# Eval("TagID") %>' />

А вот моя функция ConfirmDialog

function confirmDialog(sender, title, message, type) {

    //type entities
    //1 = warning
    //2 = error
    //3 = success
    //4 = Information
    var sender = $(sender);

    $("#message_dialog_inner_text").html(message);

    $("#message_dialog_message_container").dialog({
        modal: true,
        title: title,
        zIndex: 10003,
        dialogClass: (type > 0) ? "message_dialog_type_" + type : "",
        position: 'center',
        buttons: {
            "OK": function () {
                //the yes option was selected, we now disable the onclientclick event, and fire the click event.
                $(this).dialog("close");

                if (sender.hasAttr("href")) {
                    window.location = sender.attr('href');
                } else {
                    sender.removeAttr("onclick");
                    sender.trigger("click");
                }
            },
            "Cancel": function () { $(this).dialog("close"); }
        }
    });

return false;

}

Это отлично работает в Chrome, FF, Safari, но IE просто игнорирует это и выполняет обратную передачу. Я даже изменил свой OnClientClick на «возвратить ложь»; и, похоже, это не влияет на отправку кнопки назад. Я также изменил его с ImageButton на просто кнопку, но безрезультатно. Я предполагаю, что это как-то связано с событием OnCommand, но я в недоумении! Я реализовал это в довольно большом приложении, поэтому я хотел бы управлять масштабом изменений. Если у кого-то есть какой-то вклад, это было бы очень признательно!

ИЗМЕНИТЬ

Хорошо, позвольте мне также подчеркнуть, что я не хочу, чтобы он возвращался, и даже если у меня просто есть OnClientClick="return false;" командная кнопка все еще отправляет обратно (не то, что вы ожидаете).

Вот визуализированная разметка из моего элемента управления ImageButton

<input type="image" name="ctl00$body$pnlContentRight$pnlCurrentTaskDetails$repTags$ctl00$tagItem$imgDelete" id="ctl00_body_pnlContentRight_pnlCurrentTaskDetails_repTags_ctl00_tagItem_imgDelete" src="Controls/TaskDetails/Images/delete.png" onclick="javascript:confirmDialog(this, 'Remove Tag','Are you sure you want to remove this tag?', 1); return false;" style="border-width:0px;">

person tribe84    schedule 17.10.2011    source источник
comment
Вы пытались изменить начало на OnClientClick=return confirmDialog(... ?   -  person Doozer Blake    schedule 17.10.2011
comment
Не могли бы вы опубликовать отрендеренный HTML? Я подозреваю, что вы правы, виновником может быть OnCommand. Просмотр фактического HTML/JS, отправляемого в браузер, может помочь в диагностике.   -  person mikemanne    schedule 17.10.2011
comment
Doozer: я пробовал return confirmDialog(); но это ничего не изменило с точки зрения того, как IE не хочет останавливать обратную передачу. Очень странно, что это связано с IE, потому что хром обрабатывает все, как я и ожидал. MikeManne: Я обновил свой вопрос, включив в него обработанную разметку.   -  person tribe84    schedule 17.10.2011


Ответы (2)


Это не решение вашей конкретной проблемы, но это обходной путь, который вы, возможно, захотите рассмотреть (я использовал его в нескольких местах):

  1. Сделайте кнопку «удалить» простым изображением, а не кнопкой обратной связи.
  2. Дайте ему OnClientClick, который вызывает локальную функцию javascript (передавая соответствующие данные - как минимум, идентификатор удаляемого элемента).
  3. Эта локальная функция JS загружает соответствующие данные в скрытую переменную (чтобы к ним можно было получить доступ в вашем коде программной части) и открывает диалоговое окно подтверждения jQuery.
  4. Этот диалог настроен без кнопок jquery-dialog. Вместо этого запущенный DIV содержит две кнопки asp:Buttons: ok и Cancel. Кнопка отмены просто закрывает диалоговое окно jQuery. Кнопка OK — это обычная кнопка обратной передачи с функцией OnClick на стороне сервера.
  5. Таким образом, страница возвращается только в том случае, если пользователь нажимает кнопку «ОК» в диалоговом окне подтверждения. Функция подтверждения-диалога-события знает, какой элемент удалить, потому что идентификатор этого элемента находится в скрытом поле.

Вероятно, это не "правильный" способ реализации такого поведения (с точки зрения пуристов ASP.NET). Однако, что касается обходных путей, я не думаю, что это слишком болезненно. И по моему опыту, это работает во всех браузерах (конечно, при условии, что у них включен JS). ХТН.

person mikemanne    schedule 17.10.2011

Вы OnClientClick всегда возвращаете false, что означает, что событие никогда не будет выполнено. Попробуйте вернуть ввод из подтверждения следующим образом:

OnClientClick="return confirmDialog(...);"

Вам также нужно будет убедиться, что есть способ вернуть true из функции confirmDialog. Похоже, эта функция тоже всегда возвращает false.

Я не очень хорошо знаком с диалоговым окном пользовательского интерфейса jQuery, но по идее он должен работать так:

buttons: { 
    "OK": function () { return true; }, //perform a postback and execute command
    "Cancel": function () { return false; } //abort postback and do nothing
}
person James Johnson    schedule 17.10.2011
comment
Эй, Джеймс, спасибо за ответ. Я всегда возвращаю false, потому что диалог пользовательского интерфейса не поддерживает поток пользовательского интерфейса, как это делает родной JS confirm(). Что, по сути, должно произойти, так это то, что я должен заблокировать выполнение обратной передачи, а когда срабатывает событие OK, мне нужно перезагрузиться и вызвать исходную обратную передачу. Прямо сейчас, просто имея OnClientClick=return false; даже не мешает моему событию OnCommand запускаться в IE (работает в других браузерах). - person tribe84; 17.10.2011