Остановите обратную передачу ImageButton OnCommand с помощью JavaScript в asp.net 4.0 (Internet Explorer) - PullRequest
0 голосов
/ 17 октября 2011

Похоже, демон 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 на «return false;» и это, кажется, не влияет на кнопку, отправляющую назад. Я также изменил его с ImageButton на просто кнопку, но безрезультатно. Я предполагаю, что это как-то связано с событием OnCommand, но я в недоумении! Я реализовал это довольно большое приложение, поэтому я хотел бы управлять масштабом изменений. Если у кого-то есть какой-либо вклад, это будет с благодарностью!

EDIT

Хорошо, позвольте мне также подчеркнуть, что я не хочу, чтобы он отправлял обратно, и даже если у меня просто 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;">

Ответы [ 2 ]

1 голос
/ 17 октября 2011

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

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

Это, вероятно, не «правильный» способ реализовать это поведение (из ASP.NETпуристская точка зрения).Тем не менее, как обходные пути, я не думаю, что это слишком больно.По моему опыту, похоже, что он работает во всех браузерах (конечно, при условии, что у них включен JS).НТН.

0 голосов
/ 17 октября 2011

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

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

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

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

buttons: { 
    "OK": function () { return true; }, //perform a postback and execute command
    "Cancel": function () { return false; } //abort postback and do nothing
}
...