如何在postback
上回到页面的相同位置。它总是似乎到达页面顶部。
我尝试过使用 maintainScrollPositionOnPostBack = "true"
但它不起作用。
答案 0 :(得分:36)
我最近也在寻找这个。想出了一大堆Javascript,直到找到以下内容:
在.aspx代码文件的顶部,插入以下内容:
MaintainScrollPositionOnPostback="true"
所以.aspx中的第一句开头
<%@ Page Language="C#" MaintainScrollPositionOnPostback="true" AutoEventWireup="true" CodeBehind="Default.aspx.cs"
这对我来说很好,而无需使用updatepanels添加任何其他代码来保持滚动条位置
答案 1 :(得分:15)
我用过几种方法来设置maintainScrollPositionOnPostBack。你试过不止一个吗?你能描述一下触发回发的内容以及你测试过的浏览器吗?你在使用母版页吗?
Page.MaintainScrollPositionOnPostBack = true;
。<%@ Page MaintainScrollPositionOnPostback="true" %>
<pages maintainScrollPositionOnPostBack="true" />
答案 2 :(得分:6)
当页面回发时,您可以将.Focus()设置到特定的服务器控件上。
答案 3 :(得分:3)
您是否使用Google Chrome进行测试?我遇到了同样的问题但是开始在IE和Firefox中进行测试并且它正在运行。我认为Chrome不支持此属性。它也可能是.NET Framework 3.5的问题。它可能已在.NET 4.0中修复
答案 4 :(得分:0)
如果您想要移动到特定的锚点,则可以执行类似here所述的操作。否则你必须使用javascript并找出你离顶部有多远,将它保存在隐藏字段或cookie中,并在页面加载后重置视图。
答案 5 :(得分:0)
虽然bbbwex的回复是正确的,但实际上我花了一段时间意识到我需要在两个地方放置MaintainScrollPositionOnPostback =“true”
ASPX页面的顶部。
在IsPostBack
在我满足这两个条件后它才有效。
答案 6 :(得分:0)
<script type="text/javascript">
var xPos, yPos;
var prm = Sys.WebForms.PageRequestManager.getInstance();
function BeginRequestHandler(sender, args) {
if ($get('<%=Panel1.ClientID%>') != null) {
xPos = $get('<%=Panel1.ClientID%>').scrollLeft;
yPos = $get('<%=Panel1.ClientID%>').scrollTop;
}
}
function EndRequestHandler(sender, args) {
if ($get('<%=Panel1.ClientID%>') != null) {
$get('<%=Panel1.ClientID%>').scrollLeft = xPos;
$get('<%=Panel1.ClientID%>').scrollTop = yPos;
}
}
prm.add_beginRequest(BeginRequestHandler);
prm.add_endRequest(EndRequestHandler);
将以上代码添加到ScriptManager
标记中
并在页面声明中添加MaintainScrollPositionOnPostback="true"
答案 7 :(得分:0)
注意:如果您定义了默认控件,则即使Page MaintenanceScrollPositionOnPostback =“ true”
,它也会在回发时滚动到该控件。答案 8 :(得分:0)
此问题:Maintain Panel Scroll Position On Partial Postback ASP.NET
几天来,我一直在寻找解决此问题的方法,使用了典型的MaintenanceScrollPositionOnPostback替代方法以及使用BeginRequestHandler和EndRequestHandler的JavaScript解决方案,而我使用的是MasterPage。
什么都没用,但是我想出了一个相当简单的解决方案,使用jQuery和BeginRequestHandler和EndRequestHandler并使用相同的@ waqas-raja算法:
<script type="text/javascript">
var scrollPosition = 0;
$(document).ready(function () {
$(window).scroll(function (event) {
scrollPosition = $(window).scrollTop();
});
});
</script>
<script type="text/javascript">
// It is important to place this JavaScript code after ScriptManager1
var xPos, yPos;
var prm = Sys.WebForms.PageRequestManager.getInstance();
function BeginRequestHandler(sender, args) {
console.log('BeginRequest');
}
function EndRequestHandler(sender, args) {
$(window).scrollTop(scrollPosition);
}
prm.add_beginRequest(BeginRequestHandler);
prm.add_endRequest(EndRequestHandler);
</script>
这个想法是,每当用户移动Scroll时,就将Scroll的位置捕获到全局变量中,这样就可以知道哪个是最后一个位置,并且在进行回发时,会输入EndRequestHandler事件并用它更新用户标记的最后位置
这在Firefox和Google Chrome中对我有用:)
答案 9 :(得分:0)
请确保您不要在<form id="form1" runat="server" defaultbutton="YourDefaultButton">
中设置默认按钮。删除defaultbutton="YourDefaultButton"
,MaintainScrollPositionOnPostback="true"
将起作用。
答案 10 :(得分:0)
对我来说最好的解决方案是用更新面板包装有问题的控件
<asp:UpdatePanel runat="server" id="UpdatePanel" updatemode="Conditional">
<ContentTemplate>
dropdown controls that cause postback etc..
</ContentTemplate>
</asp:UpdatePanel>
当然,您还需要
<asp:ScriptManager ID="ScriptManager1" runat="server" />
出现在网站的主要形式之内。
答案 11 :(得分:-1)
尝试一下。它为我工作。
<script type="text/javascript">
window.onload = function () {
var h = document.getElementById("<%=hfScrollPosition.ClientID%>");
document.getElementById("<%=scrollArea.ClientID%>").scrollTop = h.value;
}
function SetDivPosition() {
var intY = document.getElementById("<%=scrollArea.ClientID%>").scrollTop;
var h = document.getElementById("<%=hfScrollPosition.ClientID%>");
h.value = intY;
}
function afterpostback() {
var h = document.getElementById("<%=hfScrollPosition.ClientID%>");
document.getElementById("<%=scrollArea.ClientID%>").scrollTop = h.value;
}
</script>
<asp:HiddenField ID="hfScrollPosition" runat="server" Value="0" />
<div id="scrollArea" onscroll="SetDivPosition()" runat="server" style="height:225px;overflow:auto;overflow-x:hidden;">
if (Page.IsPostBack) {
ScriptManager.RegisterClientScriptBlock(Page, this.GetType(), "CallJS", "afterpostback();", true);
}