如何在自动回发时保持滚动位置?

31

如何在postback后返回同一页面位置?它总是跳转到页面顶部。

我尝试使用maintainScrollPositionOnPostBack = "true",但它没有起作用。


你能提供一些示例代码吗? - Cyberdrew
2
你尝试过将“m”大写吗?它在常规的 postback 上工作吗?而且你是把它放在 <%@ Page %> 指令中,对吧? - Richard Marskell - Drackir
嗨,谢谢你的询问,但我想.Focus()是有效的。无论如何,还是谢谢。 - BobLoblaw
12个回答

51

我最近也在寻找这个问题的解决方法。最终找到了如下解决方法,无需插入大量JavaScript代码:

在您的.aspx代码文件顶部插入以下内容:

 MaintainScrollPositionOnPostback="true"

因此,在您的.aspx中,第一句话应该开始。
<%@ Page Language="C#" MaintainScrollPositionOnPostback="true" AutoEventWireup="true" CodeBehind="Default.aspx.cs"

对我来说,这个方法很有效,而且不需要添加任何其他代码来使用updatepanels来保持滚动条的位置。


15
所以问题明确表示这个解决方案不起作用,但它不仅被提出,而且被接受为答案? - Christofer Ohlsson
4
看起来问题可能是在问题的评论部分指出的,"m" 没有大写。这对我有效。 - Eddie
如果需要的话,还可以查看重置滚动位置 - Eddie
MaintainScrollPositionOnPostback=true; -- 在 C# 中不要使用引号将 true 括起来 - dspyank
1
@dspyank 引用没有造成任何问题! - undefined
@dspyank 引用没有造成任何问题! - Khalid Bin Sarower

18

我使用了几种方法来设置maintainScrollPositionOnPostBack。您尝试过多种方法吗?您能描述一下是什么触发了postback以及您测试了哪些浏览器吗?您是否使用了母版页(master page)?

  1. 您可以在后端代码的页面加载事件中设置Page.MaintainScrollPositionOnPostBack = true;
  2. 您可以将其添加到页面声明中<%@ Page MaintainScrollPositionOnPostback="true" %>
  3. 您可以在web.config文件中添加<pages maintainScrollPositionOnPostBack="true" />

7
当页面回传时,您可以将 .Focus() 设置到特定的服务器控件上。

非常感谢。关于为什么“maintainScrollPositionOnPostBack =“true””无法工作,您有任何反馈吗? - BobLoblaw
这个问题没有简单的答案。我认为如果没有你的解决方案、你的环境等,我无法进行调查。 - TheGeekYouNeed

3

您是否正在使用Google Chrome进行测试?我曾遇到过同样的问题,但在IE和Firefox中开始测试后就可以正常工作了。我认为Chrome不支持此属性。这可能也是.NET Framework 3.5的问题。它可能已经在.NET 4.0中修复了。


我正在使用 .Net Framework 2.0...遇到了相同的问题...有没有其他的选择? - user5710892

1

对我来说最好的解决方法是,使用更新面板包裹有问题的控件。

<asp:UpdatePanel runat="server" id="UpdatePanel" updatemode="Conditional">
<ContentTemplate>
dropdown controls that cause postback etc..
</ContentTemplate>
</asp:UpdatePanel>

当然,你也需要


<asp:ScriptManager ID="ScriptManager1" runat="server" />

在网站的主要表单中出现。

0
注意:如果您定义了默认控件,即使页面的MaintainScrollPositionOnPostback属性设置为“true”,它也会在回发时滚动到该控件。

0

请确保在<form id="form1" runat="server" defaultbutton="YourDefaultButton">不要设置默认按钮。删除defaultbutton="YourDefaultButton",然后MaintainScrollPositionOnPostback="true"就会起作用。


0

如果您想要移动到特定的锚点,您可以像这里所描述的那样进行操作。否则,您将需要使用JavaScript来找出距离页面顶部有多远,将其保存在隐藏字段或cookie中,并在页面加载后重置视图。


0

尽管bbbwex的回复是正确的,但我实际上花了一些时间才意识到我需要在以下两个位置都放置MaintainScrollPositionOnPostback="true":

  1. ASPX页面的顶部。

  2. 在IsPostBack中

只有满足这两个条件后,它才能正常工作。


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"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接