Запретить полную обратную передачу от __doPostBack

У меня есть страница с содержанием, которая содержит следующее ...

  1. UpdatePanel1 - содержащий блоки отображения ошибок
    содержит триггеры обновления для обеих кнопок
  2. UpdatePanel2 - содержащий процесс 1 с кнопкой asp:
  3. updatePanel3 - содержащий процесс 2 с кнопкой asp:
  4. JavaScript, который предоставляет пользователю всплывающее окно подтверждения JQuery Messagebox в зависимости от выполняемого процесса.

UpdatePanel 2 или 3 становится видимым в зависимости от выбора пользователя в параметрах меню.

при выборе пункта меню 2 отобразится эта страница с сообщением об ошибке

Когда я нажимаю кнопку, появляется окно сообщения, и страница обрабатывается правильно с использованием __doPostback из ответа окна сообщения, и страница выполняет полную обратную передачу.

Я бы предпочел, чтобы страница выполняла частичную обратную передачу и содержимое, которое у нее было, и отображала блоки отображения ошибок, если произошла ошибка. Мы будем благодарны за любую помощь.

ничего особенного в кнопке

<asp:Button ID="ResetSomething" runat="server" Text="ResetSomething" Width="275px" />

вот блок скрипта страницы содержимого

    <script type="text/javascript" language="javascript">
<!--
    function pageLoad() {
        setform();

    };

    function setform() {
        var reset1_button = $('input[id*=ResetSomething]');
        var reset2_button = $('input[id*=ResetSomethingElse]');

        reset1_button.click(function() {
            var element = $(this);
            $.prompt('Message1', { show: 'slideDown', buttons: { Ok: true, Cancel: false },
                submit: function(v, m, f) { submit_reset_callback(v, m, element); }
            });
            return (false);
        });

        var submit_reset_callback = function(result, messages, element) {
            if (result) { __doPostBack("ResetSomething");}
            return (false);
        };

        reset2_button.click(function() {
            var element = $(this);
            $.prompt('Message2', { show: 'slideDown', buttons: { Ok: true, Cancel: false },
                submit: function(v, m, f) { submit_update_callback(v, m, element); }
            });
            return (false);
        });

        var submit_update_callback = function(result, messages, element) {
            if (result) { __doPostBack("ResetSomethingElse"); }
            return (false);
        };
    };     
-->
</script>

это код для OnInit:

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        this.PreLoad += (sender, args) =>
                            {

                                this.ClientScript.GetPostBackEventReference(this, "arg");

                                if (!IsPostBack) { return; }

                                string __targetaction = this.Request["__EVENTTARGET"];
                                string __args = this.Request["__EVENTARGUMENT"];

                                if (string.IsNullOrEmpty(__args)) return;

                                if (__targetaction == "ResetSomething")
                                {
                                    ResetSomething();
                                }
                                if (__targetaction == "ResetSomethingElse")
                                {
                                    ResetSomethingElse();
                                }
                                this.upnlNotifications.Update();
                            };
    }

person Tim    schedule 29.07.2011    source источник


Ответы (2)


Определите функцию ниже и замените свои вызовы __doPostBack на doPostBackAsync(controlId, null).

function doPostBackAsync(eventName, eventArgs) {
    var prm = Sys.WebForms.PageRequestManager.getInstance();

    if (!Array.contains(prm._asyncPostBackControlIDs, eventName)) {
        prm._asyncPostBackControlIDs.push(eventName);
    }

    if (!Array.contains(prm._asyncPostBackControlClientIDs, eventName)) {
        prm._asyncPostBackControlClientIDs.push(eventName);
    }

    __doPostBack(eventName, eventArgs);
}
person wonkim00    schedule 29.07.2011
comment
ControlId должен быть правильным идентификатором кнопки? Если это так, то я все равно получаю те же результаты, полную обратную передачу страницы. - person Tim; 29.07.2011
comment
Понятно. __doPostBack (eventName.attr ('id'), eventArgs); работал как шарм. Передача только eventName вызвала ошибку javascript. Спасибо wonkim00 - person Tim; 29.07.2011

ControlId должен быть идентификатором кнопки для генерации асинхронной обратной передачи, иначе на странице произойдет полная обратная передача. Для этого вы можете использовать clientidmode как статический, например

<asp:Button ID="button1" runat="server"  ClientIDMode="Static"/>

   //then you can use below code
   _doPostBack('button1', '');//clientidmode forces buttonid = id given by us

Проверить его правильно?

В таком случае вы можете получить асинхронную обратную передачу вместо полной обратной передачи страницы.

Это мне помогло. Спасибо @Tim за его комментарий.

person Ram    schedule 12.08.2014