¿Cómo evitar el desplazamiento de UpdatePanel en AutoPostBack?

Tengo un ASP.NET FormView dentro de un panel de actualización. Estoy guardando automáticamente el formulario estableciendo AutoPostBack = true para cada uno de los elementos dentro de FormView.

Esto significa que el usuario puede hacer clic en algunos elementos en sucesión rápida y disparar algunas devoluciones de datos asíncronas casi simultáneamente.

El problema que tengo es que el usuario puede seguir desplazándose por el formulario mientras las devoluciones asíncronas aún no están completas. El navegador siempre vuelve a la posición en la que se encontraba en la primera devolución de datos.

Page.MaintainScrollPositionOnPostback está establecido en False.

He intentado todo tipo de cosas en ajax y jquery con:

pageLoad add_initializeRequest add_endRequest document.readyetc ..

pero siempre parece que solo puedo acceder al desplazamiento Y como estaba en la primera devolución de datos.

¿Hay alguna forma de recuperar el desplazamiento actual Y cuando se completa la devolución, para que pueda detener el desplazamiento? ¿O tal vez es posible deshabilitar el comportamiento de desplazamiento?

¡Gracias

Actualiza

Gracias a @chprpipr, pude hacer que esto funcione. Aquí está mi solución abreviada:

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;
    }
}

Pagina principal

...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);
    }

Traté también de llamar al EndRequestHandler (tuve que eliminar la verificación args.error) para ver si reducía el parpadeo al desplazarse pero no lo hace. Vale la pena señalar que la solución perfecta sería evitar que el navegador intente desplazarse; en este momento hay una fluctuación momentánea que no sería aceptable en aplicaciones con una gran base de usuarios.

(El código de desplazamiento superior no es mío, lo encontré en la web).

(Aquí hay una página útil de MSDN para el ciclo de vida del lado del cliente:http: //msdn.microsoft.com/en-us/library/bb386417.asp)

Update 7 de marzo:

Acabo de encontrar una manera extremadamente simple de hacer esto:

<script type="text/javascript">

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

prm.add_beginRequest(beginRequest);

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

</script>

Respuestas a la pregunta(2)

Su respuesta a la pregunta