Restablecer la posición de desplazamiento después de la devolución de datos de Async – ASP.NET

¿Cuál es la mejor manera de restablecer la posición de desplazamiento en la parte superior de la página después de una devolución de datos asincrónica?

La devolución de datos asíncrona se inicia desde una columna de Command.Field de GridView de ASP.NET y se llama al método de actualización del panel de actualización de ASP.NET en el GridView OnRowCommand.

Mi aplicación actual es un sitio web ASP.NET 3.5.

EDIT: recibí excelentes comentarios de todos, y terminé usando el método PageRequestManager en una etiqueta de script, pero mi siguiente pregunta es:

¿Cómo lo configuro para que se ejecute solo cuando el usuario hace clic en el campo CommandField de ASP.NET en mi control GridView? Tengo otros botones en la página que realizan una devolución de datos asincrónica que no quiero desplazar a la parte superior de la página.

EDIT 1: he desarrollado una solución donde no necesito usar el PageRequestManager. Ver mi respuesta de seguimiento para la solución.

Aquí está la solución perfecta para restablecer la posición de la barra de desplazamiento en TOP en AJAX

Código del lado del cliente

 function ResetScrollPosition() { setTimeout("window.scrollTo(0,0)", 0); } 

Código de servidor

 ScriptManager.RegisterStartupScript(Page, this.GetType(), "ScrollPage", "ResetScrollPosition();", true); 

Solo, window.scrollTo (0,0) no funcionará. Ajax tendrá prioridad en este caso, por lo que debe usar la función setTimeout con eso.

Aquí está la siguiente solución que desarrollé basada en esta fuente

Webform de ASP.NET

       

Código de formulario web ASP.NET detrás

 protected void MyGridView_OnRowDataBound(object sender, GridViewRowEventArgs e) { if(e.Row.RowType.Equals(DataControlRowType.DataRow)) { foreach (DataControlFieldCell cell in e.Row.Cells) { foreach(Control control in cell.Controls) { LinkButton lb = control as LinkButton; if (lb != null && lb.CommandName == "Edit") lb.Attributes.Add("onclick", "SetScrollEvent();"); } } } } 

¿Estás usando asp.net AJAX? Si es así, hay dos eventos muy útiles en las bibliotecas del cliente beginRequest y endRequest, uno de los problemas con las devoluciones de datos parciales / asincrónicas es que la página general no tiene ni idea de lo que estás haciendo. los eventos de inicio y finalización le permitirán mantener la posición de desplazamiento en el cliente, podría tener una var en js que esté configurada en la posición de desplazamiento en beginrequest, y luego en la solicitud final podrá restablecer el scrollTop de cualquier elemento que necesite … estoy Seguro que he visto esto hecho antes, pero no puedo encontrar un enlace. publicar mal si encuentro un ejemplo

tomado de este tutorial:

http://aspnet.4guysfromrolla.com/articles/111407-1.aspx

Configuramos MaintainScrollPositionOnPostback = true

Luego, si necesitamos restablecer la posición de desplazamiento, llame al método:

 Private Sub ResetScrollPosition() If Not ClientScript.IsClientScriptBlockRegistered(Me.GetType(), "CreateResetScrollPosition") Then 'Create the ResetScrollPosition() function ClientScript.RegisterClientScriptBlock(Me.GetType(), "CreateResetScrollPosition", _ "function ResetScrollPosition() {" & vbCrLf & _ " var scrollX = document.getElementById('__SCROLLPOSITIONX');" & vbCrLf & _ " var scrollY = document.getElementById('__SCROLLPOSITIONY');" & vbCrLf & _ " if (scrollX && scrollY) {" & vbCrLf & _ " scrollX.value = 0;" & vbCrLf & _ " scrollY.value = 0;" & vbCrLf & _ " }" & vbCrLf & _ "}", True) 'Add the call to the ResetScrollPosition() function ClientScript.RegisterStartupScript(Me.GetType(), "CallResetScrollPosition", "ResetScrollPosition();", True) End If End Sub 

¿Ha establecido la propiedad de página MaintainScrollPosition? No estoy seguro si eso sería diferente si haces una devolución de datos Async o no.

Editar: Una cosa que podría intentar es enfocarse en un elemento en particular cerca de la parte superior de la página, que puede ayudar y ser un trabajo sucio.

Utilizo una entrada oculta llamada hScrollTop que configuro antes de que se publique el formulario asp.net. Luego, cuando la página se carga, establece el scrollTop de acuerdo con el valor de la entrada oculta.

Pruebe este código en una página nueva.

 
 Page.RegisterStartupScript("MyScript", ""); 

Coloque lo anterior en la función que desea indicar para ir a la parte superior de la página. Como cuando la página no es válida, póngala allí y agregará javascript temporal para enviarlo a la parte superior de la página.