Async Postback -Asp.net 다음에 스크롤 위치를 재설정하십시오
-
03-07-2019 - |
문제
비동기 포스트 백 이후 스크롤 위치를 페이지 상단으로 재설정하는 가장 좋은 방법은 무엇입니까?
비동기 포스트 백은 ASP.NET GridView CommandField 열에서 시작되며 ASP.NET 업데이트 패널 업데이트 메소드는 GridView OnRowCommand에서 호출됩니다.
현재 응용 프로그램은 ASP.NET 3.5 웹 사이트입니다.
편집하다: 나는 모든 사람으로부터 훌륭한 피드백을 받았으며 스크립트 태그에서 PagerequestManager 메소드를 사용하여 끝났지 만 다음 질문은 다음과 같습니다.
GridView Control에서 사용자가 ASP.NET CommandField를 클릭 할 때만 실행하도록 구성하려면 어떻게 구성합니까? 페이지 상단으로 스크롤하지 않으려는 비동기 포스트 백을 수행하는 페이지에 다른 버튼이 있습니다.
편집 1 : PagerequestManager를 사용할 필요가없는 솔루션을 개발했습니다. 솔루션에 대한 내 후속 답변을 참조하십시오.
해결책 3
다음은 이것을 기반으로 개발 한 다음 솔루션입니다. 원천
asp.net webform
<script language="javascript" type="text/javascript">
function SetScrollEvent() {
window.scrollTo(0,0);
}
</script>
<asp:GridView id="MyGridView" runat="server" OnRowDataBound="MyGridView_OnRowDataBound">
<Columns>
<asp:CommandField ButtonType="Link" ShowEditButton="true" />
</Columns>
</asp:GridView>
ASP.NET WebForm 코드 뒤에 있습니다
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();");
}
}
}
}
다른 팁
UpdatePanels를 사용하면 ASP.NET AJAX에 연결해야합니다. PagerequestManager
메소드를 추가해야합니다 엔드 레퍼스트 이벤트 후크입니다.
비동기 우편 백이 완료되고 제어가 브라우저로 반환 된 후에 발생합니다.
그래서 당신은 다음과 같은 것이 있습니다.
<script type="text/javascript">
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(pageLoaded);
function pageLoaded(sender, args) {
window.scrollTo(0,0);
}
</script>
업데이트 요청이 완료되면 브라우저가 페이지 상단으로 다시 스크롤해야합니다.
물론 다른 이벤트가 있습니다.
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
비동기식 포스트백의 아름다움은 페이지가 "전체 페이지 재 장전"이 없으므로 유지 관리를 설정하지 않고도 스크롤 높이를 유지한다는 것입니다.이 경우 실제로 해당 효과가 발생하기를 원하므로 수동으로 만들어.
업데이트 된 질문에 응답하려면 편집하십시오
좋아, 따라서 특정 버튼 누름에 위치 만 재설정 해야하는 경우 다음과 같은 작업을 수행해야합니다.
대신 Tegrequest에 연결하여 시작하십시오.
Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(BeginRequestHandler);
Args 매개 변수에서 다음에 액세스하기 때문입니다.
args.get_postBackElement().id
전체 이벤트를 시작한 버튼의 ID를 알려줍니다. 그런 다음 여기에서 값을 확인한 다음 페이지를 이동하거나 변수에 저장 한 다음 마지막 요청에 쿼리하여 레이스 조건을 인식 할 수 있습니다. 기타 사용자가 원래 업데이트가 완료되기 전에 다른 버튼을 클릭하는 경우.
그것은 당신이 행운으로 갈 것입니다 -이 주위에 몇 가지 예가 있습니다. PagerequestManager 이벤트와 협력합니다
다음은 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 ajax를 사용하고 있습니까? 그렇다면 클라이언트 라이브러리에 BeginRequest와 EndRequest에 두 가지 유용한 이벤트가 있습니다. 부분/비동기 Postbacks의 문제 중 하나는 일반 페이지가 당신이하고있는 일에 대한 단서를 얻지 못했다는 것입니다. 시작 및 엔드 레퍼스트 이벤트는 클라이언트에서 스크롤 위치를 유지할 수있게 해줄 수 있습니다. js가 var를 가질 수 있습니다. 물론이 일이 전에는 본 적이 있지만 링크를 찾을 수 없습니다. 내가 예를 찾으면 게시 할 것입니다
이 튜토리얼에서 가져온 :
http://aspnet.4guysfromrolla.com/articles/111407-1.aspx
우리는 유지 관리를 설정합니다
그런 다음 스크롤 위치를 재설정 해야하는 경우 메소드를 호출합니다.
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
페이지 속성을 유지 관리 했습니까? Async Postback을 수행하는 경우 그렇지 않은지 확실하지 않습니다.
편집 : 시도 할 수있는 한 가지는 페이지 상단 근처의 특정 항목에 초점을 맞추는 것입니다. 이는 더러운 작업이 될 수 있습니다.
asp.net 양식이 다시 게시되기 전에 설정 한 hscrolltop이라는 숨겨진 입력을 사용합니다. 그런 다음 페이지가로드되면 숨겨진 입력의 값에 따라 스크롤 탑을 설정합니다.
새 페이지 에서이 코드를 사용해보십시오.
<div style="height:500px"></div>
<form id="Form1" runat=server onsubmit="javascript:saveScrollTop();">
<input type=submit value="Submit" runat=server>
<input type="hidden" id="hScrollTop" runat=server>
</form>
<div style="height:1000px"></div>
<script language="javascript">
function saveScrollTop() {
document.getElementById("<%= hScrollTop.ClientID %>").value = document.body.scrollTop;
return true;
}
window.onload = function() {
document.body.scrollTop = document.getElementById("<%= hScrollTop.ClientID %>").value;
}
</script>
Page.RegisterStartupScript("MyScript", "<script language=javascript>setTimeout('window.scrollTo(0,0)', 0);</script>");
위를 페이지 상단으로 이동하도록 지시하려는 함수에 위의 내용을 넣으십시오. 페이지가 유효하지 않은 경우와 같이, 거기에 있으면 임시 JavaScript를 추가하여 페이지 상단으로 촬영합니다.