如何在autopostback上保持滚动位置?

时间:2011-02-28 21:46:27

标签: c# asp.net postback

如何在postback上回到页面的相同位置。它总是似乎到达页面顶部。

我尝试过使用 maintainScrollPositionOnPostBack = "true"

但它不起作用。

12 个答案:

答案 0 :(得分:36)

我最近也在寻找这个。想出了一大堆Javascript,直到找到以下内容:

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

 MaintainScrollPositionOnPostback="true"

所以.aspx中的第一句开头

<%@ Page Language="C#" MaintainScrollPositionOnPostback="true" AutoEventWireup="true" CodeBehind="Default.aspx.cs"

这对我来说很好,而无需使用updatepanels添加任何其他代码来保持滚动条位置

答案 1 :(得分:15)

我用过几种方法来设置maintainScrollPositionOnPostBack。你试过不止一个吗?你能描述一下触发回发的内容以及你测试过的浏览器吗?你在使用母版页吗?

  1. 您可以在页面加载后面的代码中设置Page.MaintainScrollPositionOnPostBack = true;
  2. 您可以将其添加到页面声明<%@ Page MaintainScrollPositionOnPostback="true" %>
  3. 您可以将其添加到网络配置文件<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”

  1. ASPX页面的顶部。

  2. 在IsPostBack

  3. 在我满足这两个条件后它才有效。

答案 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);
}