Сброс позиции прокрутки после обратной пересылки Async – ASP.NET
Каков наилучший способ сброса позиции прокрутки в верхнюю часть страницы после асинхронной обратной передачи?
Асинхронная обратная передача инициируется из столбца CommandField ASP.NET GridView, а в группе GridView OnRowCommand вызывается метод обновления панели обновления ASP.NET.
Мое текущее приложение является веб-сайтом ASP.NET 3.5.
- Как скрыть столбцы в ASP.NET GridView с автогенерированными столбцами?
- Столбцы двух связанных таблиц базы данных в одном ASP.NET GridView с EntityDataSource
- Пересечение столбцов GridLayoutManager Android Recyclerview
- Высота Gridview снижается
- Редактирование строки Gridview - динамическое связывание с DropDownList
EDIT: я получил отличные отзывы от всех, и я закончил использовать метод PageRequestManager в теге скрипта, но мой следующий вопрос:
Как настроить его только для выполнения, когда пользователь нажимает на CommandField ASP.NET в моем элементе управления GridView? У меня есть другие кнопки на странице, которые выполняют асинхронную обратную передачу, которую я не хочу прокручивать до верхней части страницы.
EDIT 1: Я разработал решение, в котором мне не нужно использовать PageRequestManager. См. Мой последующий ответ для решения.
- Изменение цвета ячейки на разные значения - Gridview
- Экспорт GridView в несколько листов Excel
- GridView связан с свойствами вложенного classа
- Lazy загружает изображения в gridView
- Как удалить строку из GridView?
- Как реализовать Yii2 Modal Dialog на кнопке просмотра и обновления Gridview?
- Простой пример сетки Android, использующий RecyclerView с GridLayoutManager (например, старый GridView)
- Сортировка GridView: SortDirection всегда по возрастанию
Поскольку вы используете 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, чтобы снять вас в верхней части страницы.