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

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

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

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

Page.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 марта:

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


10
задан Joe Niland 6 March 2011 в 22:23
поделиться

0 ответов

Другие вопросы по тегам:

Похожие вопросы: