Как избежать прокрутки UpdatePanel на AutoPostBack?

У меня есть ASP.NET FormView внутри панели обновления. Я автоматически сохраняю форму, устанавливая AutoPostBack = true для каждого из элементов в FormView.

Это означает, что пользователь может быстро щелкнуть несколько элементов и сразу же отключить несколько асинхронных обратных передач.

Проблема заключается в том, что пользователь может продолжать прокручивать форму, пока асинхронные обратные вызовы еще не завершены. Браузер всегда прокручивается назад до положения, в котором он находился при первой обратной передаче.

Страница .MaintainScrollPositionOnPostback установлена ​​в значение False.

Я пробовал всевозможные вещи в ajax и jquery с помощью:

  • Pageload
  • add_initializeRequest
  • add_endRequest
  • document.ready
  • и т.д.

но я всегда только могу получить доступ к прокрутке Y, как это было при первой обратной передаче.

Есть ли способ получить текущую прокрутку Y после завершения обратной передачи, чтобы я мог остановить прокрутку? Или, возможно, можно отключить поведение прокрутки?

Спасибо!


Обновление

Благодаря @chprpipr, я смог заставить это работать. Здесь мое сокращенное решение:

var FormScrollerProto = function () {
    var Me = this;
    this.lastScrollPos = 0;
    var myLogger;

    this.Setup = function (logger) {
        myLogger = logger;
        // Bind a function to the window
        $(window).bind("scroll", function () {
            // Record the scroll position
            Me.lastScrollPos = Me.GetScrollTop();
            myLogger.Log("last: " + Me.lastScrollPos);
        });
    }

    this.ScrollForm = function () {
        // Apply the last scroll position
        $(window).scrollTop(Me.lastScrollPos);
    }

    // Call this in pageRequestManager.EndRequest
    this.EndRequestHandler = function (args) {
        myLogger.Log(args.get_error());
        if (args.get_error() == undefined) {
            Me.ScrollForm();
        }
    }

    this.GetScrollTop = function () {
        return Me.FilterResults(
                window.pageYOffset ? window.pageYOffset : 0,
                document.documentElement ? document.documentElement.scrollTop : 0,
                document.body ? document.body.scrollTop : 0
            );
    }

    this.FilterResults = function (n_win, n_docel, n_body) {
        var n_result = n_win ? n_win : 0;
        if (n_docel && (!n_result || (n_result > n_docel)))
            n_result = n_docel;
        return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
    }
}

Главная страница:

...snip...

var logger;
    var FormScroller;

    // Hook up Application event handlers.
    var app = Sys.Application;

    // app.add_load(ApplicationLoad); - use pageLoad instead
    app.add_init(ApplicationInit);
    // app.add_disposing(ApplicationDisposing);
    // app.add_unload(ApplicationUnload);

    // Application event handlers for component developers.
    function ApplicationInit(sender) {
        var prm = Sys.WebForms.PageRequestManager.getInstance();
        if (!prm.get_isInAsyncPostBack()) {
            prm.add_initializeRequest(InitializeRequest);
            prm.add_beginRequest(BeginRequest);
            prm.add_pageLoading(PageLoading);
            prm.add_pageLoaded(PageLoaded);
            prm.add_endRequest(EndRequest);
        }

        // Set up components
        logger = new LoggerProto();
        logger.Init(true);
        logger.Log("APP:: Application init.");

        FormScroller = new FormScrollerProto();
    }

    function InitializeRequest(sender, args) {
        logger.Log("PRM:: Initializing async request.");
        FormScroller.Setup(logger);
    }

...snip...

function EndRequest(sender, args) {
        logger.Log("PRM:: End of async request.");

        maintainScroll(sender, args);

        // Display any errors
        processErrors(args);
    }

...snip...

function maintainScroll(sender, args) {
        logger.Log("maintain: " + winScrollTop);
        FormScroller.EndRequestHandler(args);
    }

Я также пробовал вызывать EndRequestHandler (должен был удалить проверку args.error), чтобы увидеть, уменьшилось ли оно при прокрутке, но это не так. Стоит отметить, что идеальным решением было бы остановить браузер, который будет прокручиваться вообще - прямо сейчас есть кратковременный дрожание, которое неприемлемо для приложений с большой базой пользователей.

(Верхний код прокрутки не мой - нашел его в Интернете.)

(Здесь полезная страница MSDN для жизненного цикла клиентов: http://msdn.microsoft.com/en-us/library/bb386417.aspx)


Обновление 7 марта:

Я просто нашел очень простой способ сделать это:

<script type="text/javascript">

var prm = Sys.WebForms.PageRequestManager.getInstance();

prm.add_beginRequest(beginRequest);

function beginRequest()
{
    prm._scrollPosition = null;
}

</script>

Ответ 1

Вы можете связать функцию, которая регистрирует текущую позицию прокрутки, а затем повторно применяет ее после каждого endRequest. Это может выглядеть примерно так:

// Wrap everything up for tidiness' sake
var FormHandlerProto = function() {
    var Me = this;

    this.lastScrollPos = 0;

    this.SetupForm = function() {
        // Bind a function to the form scroll container
        $("#ContainerId").bind("scroll", function() {
            // Record the scroll position
            Me.lastScrollPos = $(this).scrollTop();
        });
    }

    this.ScrollForm = function() {
        // Apply the last scroll position
        $("#ContainerId").scrollTop(Me.lastScrollPos);
    }

    this.EndRequestHandler = function(sender, args) {
        if (args.get_error() != undefined)
            Me.ScrollForm();
        }
    }
}

var FormHandler = new FormHandlerProto();
FormHandler.Setup(); // This assumes your scroll container doesn't get updated on postback.  If it does, you'll want to call it in the EndRequestHandler.

Sys.WebForms.PageRequestManager.getInstance().add_endRequest(FormHandler.EndRequestHandler);