Сброс позиции прокрутки после обратной пересылки Async – ASP.NET

Каков наилучший способ сброса позиции прокрутки в верхнюю часть страницы после асинхронной обратной передачи?

Асинхронная обратная передача инициируется из столбца CommandField ASP.NET GridView, а в группе GridView OnRowCommand вызывается метод обновления панели обновления ASP.NET.

Мое текущее приложение является веб-сайтом ASP.NET 3.5.

EDIT: я получил отличные отзывы от всех, и я закончил использовать метод PageRequestManager в теге скрипта, но мой следующий вопрос:

Как настроить его только для выполнения, когда пользователь нажимает на CommandField ASP.NET в моем элементе управления GridView? У меня есть другие кнопки на странице, которые выполняют асинхронную обратную передачу, которую я не хочу прокручивать до верхней части страницы.

EDIT 1: Я разработал решение, в котором мне не нужно использовать PageRequestManager. См. Мой последующий ответ для решения.

Поскольку вы используете UpdatePanels, вам нужно будет подключиться к ASP.NET AJAX PageRequestManager

Вам нужно будет добавить метод к методам endRequest , которые:

Поднят после завершения асинхронной обратной передачи, и управление возвращается в браузер.

Таким образом, у вас будет что-то вроде:

 

Это заставит браузер прокручивать назад до верхней части страницы после завершения запроса на обновление.

Есть и другие события, которые вы могли бы зацепить, а не, конечно:

 beginRequest // Raised before the request is sent initializeRequest // Raised as the request is initialised (good for cancelling) pageLoaded // Raised once the request has returned, and content is loaded pageLoading // Raised once the request has returned, and before content is loaded 

Красота асинхронных post-backs заключается в том, что страница будет поддерживать высоту прокрутки без необходимости устанавливать MaintainScrollPosition, так как нет «полной перезагрузки страницы», в этом случае вы действительно хотите, чтобы этот эффект произошел, поэтому вам нужно будет вручную создайте его.

Изменить для ответа на обновленный вопрос

Итак, если вам нужно только сбросить позицию на некоторых нажатиях кнопок, вам нужно будет сделать что-то вроде этого:

Начните с подключения к BeginRequest вместо этого:

 Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(BeginRequestHandler); 

Это связано с тем, что в параметре args вы получаете доступ к:

 args.get_postBackElement().id 

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

Это должно заставить вас идти с какой-либо удачей – здесь есть много примеров работы с событиями PageRequestManager

Вот идеальное решение для сброса позиции полосы прокрутки в TOP в AJAX

Код стороны клиента

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

Код сервера

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

Только window.scrollTo (0,0) не будет работать. В этом случае Ajax будет иметь приоритет, поэтому вам нужно будет использовать функцию setTimeout.

Вот следующее решение, которое я разработал на основе этого источника

ASP.NET Webform

       

Код веб-страницы ASP.NET

 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();"); } } } } 

Вы используете asp.net AJAX? Если это так, есть два очень полезных события в клиентских библиотеках beginRequest и endRequest, одна из проблем с частичными / асинхронными обратными передачами заключается в том, что общая страница не знает, что вы делаете. события begin и endrequest позволят вам поддерживать положение прокрутки на клиенте, вы можете иметь переменную js, которая установлена ​​в положение прокрутки в начале запроса, а затем в конце запроса вы можете сбросить требуемый scrollTop элемента, который вам нужен. i’m Конечно, я видел это раньше, но не могу найти ссылку. плохой пост, если я найду пример

взятый из этого урока:

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

Мы устанавливаем MaintainScrollPositionOnPostback = true

Тогда, если нам нужно сбросить вызов прокрутки, вызовите метод:

 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 

Установили ли вы свойство страницы MaintainScrollPosition? Не уверен, что это было бы иначе, если вы делаете Async Postback или нет.

Изменить. Одна вещь, которую вы можете попытаться сделать, – сосредоточить внимание на определенном элементе в верхней части страницы, что может помочь и быть грязной работой.

Я использую скрытый ввод, называемый hScrollTop, который я установил, прежде чем форма asp.net будет отправлена ​​обратно. Затем, когда страница загружается, она устанавливает scrollTop в соответствии со значением скрытого ввода.

Попробуйте этот код на новой странице.

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

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

  • Android: Как GridView auto_fit находит количество столбцов?
  • как связать выпадающий список в gridview?
  • Пейджинговые и сортировочные сетки с ASP.Net MVC
  • ASP.NET GridView RowIndex как CommandArgument
  • GridView с двумя столбцами, шириной заливки
  • Сетка изображений внутри ScrollView
  • Преобразование DBContext в ObjectContext для использования с GridView
  • Условно скрыть CommandField или ButtonField в Gridview
  • Android gridview сохраняет выбранный элемент
  • Создать миниатюру
  • Получить значения DataKey в GridView RowCommand
  • Давайте будем гением компьютера.