[英]Reset scroll position after Async postback - ASP.NET
异步回发后将滚动 position 重置到页面顶部的最佳方法是什么?
异步回发从 ASP.NET GridView CommandField 列和 ASP.NET 更新面板启动 ZBB404EDC3A078A49DZBB404EDC3A078D49DZB404EDC3A078DZ 更新面板。
我当前的应用程序是 ASP.NET 3.5 web 站点。
编辑:我收到了大家的优秀反馈,我结束了在脚本标签中使用 PageRequestManager 方法,但我的下一个问题是:
如何将其配置为仅在用户单击 GridView 控件中的 ASP.NET CommandField 时执行? 我在页面上有其他按钮执行异步回发,我不想滚动到页面顶部。
编辑 1:我开发了一个不需要使用 PageRequestManager 的解决方案。 请参阅我的后续答案以获取解决方案。
当您使用 UpdatePanels 时,您需要连接到 ASP.NET AJAX PageRequestManager
您需要向endRequest事件挂钩添加一个方法,这些挂钩是:
在异步回发完成并将控制权返回给浏览器后引发。
所以你会有类似的东西:
<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
异步回发的美妙之处在于页面将保持滚动高度而无需您设置 MaintainScrollPosition,因为没有“整页重新加载”发生,在这种情况下,您实际上希望发生这种效果,所以您需要手动创建它。
编辑以回应更新的问题
好的,所以如果您只需要在某些按钮按下时重置位置,您需要执行以下操作:
首先连接到 BeginRequest 代替/以及:
Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(BeginRequestHandler);
这是因为在 args 参数中您可以访问:
args.get_postBackElement().id
它将告诉您启动整个事件的按钮的 ID - 然后您可以检查此处的值,移动页面,或将其存储在变量中,并在最终请求中查询它 - 了解竞争条件,等用户在原始更新完成之前单击另一个按钮。
这应该会让你走运 - 在使用 PageRequestManager 事件上有很多例子
这是在 AJAX 中将滚动条 position 重置为 TOP 的完美解决方案
客户端代码
function ResetScrollPosition()
{
setTimeout("window.scrollTo(0,0)", 0);
}
服务器端代码
ScriptManager.RegisterStartupScript(Page, this.GetType(), "ScrollPage", "ResetScrollPosition();", true);
只有 window.scrollTo(0,0) 不起作用。 在这种情况下 Ajax 将优先,因此您必须使用 setTimeout function 。
这是我基于此源开发的以下解决方案
ASP.NET 网络表格
<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();");
}
}
}
}
您使用的是 asp.net AJAX 吗? 如果是这样,在客户端库 beginRequest 和 endRequest 中有两个非常有用的事件,部分/异步回发的问题之一是,一般页面不知道您在做什么。 begin 和 endrequest 事件将允许您在客户端维护滚动 position,您可以在 js 中有一个 var 设置为 beginrequest 上的滚动 position,然后在结束请求时您可以重置您需要的任何元素的 scrollTop..确实我以前看过这个,但找不到链接。 如果我找到一个例子,我会发帖
取自本教程:
http://aspnet.4guysfromrolla.com/articles/111407-1.aspx
我们设置 MaintainScrollPositionOnPostback=true
然后如果我们需要重置滚动 position 调用方法:
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? 不确定如果您执行异步回发是否会有任何不同。
编辑:您可以尝试的一件事是将焦点放在页面顶部附近的特定项目上,这可能会有所帮助并且是一项肮脏的工作。
我使用了一个名为 hScrollTop 的隐藏输入,我在回发 asp.net 表单之前设置了该输入。 然后,当页面加载时,它会根据隐藏输入的值设置 scrollTop。
在新页面上尝试此代码。
<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>");
把上面的 function 你想告诉 go 到页面顶部。 就像页面无效时一样,拥有它,它会添加临时 javascript 将您带到页面顶部。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.