2011-09-12 75 views
6
<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="Server"> 
    <meta http-equiv="refresh" content="4" /> 
<script type="text/javascript"> 

    var xPos1, yPos1; 

    var prm = Sys.WebForms.PageRequestManager.getInstance(); 
    prm.add_pageLoading(pageLoadingHandler); 
    prm.add_pageLoaded(pageLoaded); 
    function pageLoaded(sender, args) { 

     $get('<%=Panel_Users.ClientID %>').scrollLeft = xPos1; 
     $get('<%=Panel_Users.ClientID %>').scrollTop = yPos1; 
    } 
    function pageLoadingHandler(sender, args) { 
     xPos1 = $get('<%=Panel_Users.ClientID %>').scrollLeft 
     yPos1 = $get('<%=Panel_Users.ClientID %>').scrollTop; 
    } 
    </script> 
</asp:Content> 

不工作后,页面滚动位置,我要去哪里错了如何保持在asp.net页面回发

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

<div style="height: 504px; width: 941px;"> 
       <asp:Panel runat="server" ID="Panel_Users" ScrollBars="Auto" Style="z-index: 1; left: 748px; 
        top: 621px; position: absolute; height: 250px; width: 287px"> 
        <asp:UpdatePanel UpdateMode="Conditional" ID="UpdatePanel1" runat="server"> 
         <ContentTemplate> 
          <asp:GridView ID="Grid_UserTable" runat="server" Style="z-index: 1; left: 2px; top: 5px; 
           position: absolute; height: 152px; width: 243px" BorderColor="#666666" AutoGenerateColumns="False" 
           OnRowDataBound="MyGrid_RowDataBound"> 
           <Columns> 
            <asp:TemplateField HeaderText="Status"> 
             <ItemTemplate> 
              <asp:Image ID="Status" runat="server" /> 
             </ItemTemplate> 
            </asp:TemplateField> 
            <asp:BoundField DataField="TimeReceived" HeaderText="TimeReceived" InsertVisible="False" 
             ReadOnly="True" SortExpression="TimeReceived" /> 
            <asp:BoundField DataField="TimeRead" HeaderText="TimeRead" SortExpression="TimeRead" /> 
            <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" /> 
           </Columns> 
          </asp:GridView> 
         </ContentTemplate> 
        </asp:UpdatePanel> 
       </asp:Panel> 
      </div> 

我试图使页面入住当页面每5秒刷新一次并且页面翻到顶部时,位置相同。我试过页面MaintainScrollPositionOnPostback =“true”。它没有工作,我尝试使用Ajax,但不知道如何使用它。有人可以帮助我如何用Ajax做到这一点。

回答

4

MaintainScrollPositionOnPostback只适用于IE。要做到这一点,你可以滚动你自己的客户端脚本,或在页面/表单的不同部分使用锚链接。这里

类似的问题:

MaintainScrollPositionOnPostback is not working - how to debug?

MaintainScrollPositionOnPostback not working with javascript:__doPostBack

maintainScrollPositionOnPostback="true" does not work globally after setting in web.config ,but works in page level,what should I do?

+0

刚刚测试了MaintainScrollPositionOnPostback页面指令,它目前在Firefox 52,Edge 38和Chrome 57中工作。 – Mike

+1

不推荐:http://www.ryadel.com/en/asp-net-mantainscrollpositiononpostback-chrome-recent -browsers/ – IrishChieftain

2

什么听起来像可怕的UI(页面刷新,每5秒),一个廉价的解决将是加 '#'以及您想要在地址栏中查看网址的元素的ID,但会自动滚动到ID链接元素的顶部。

如果这是一个商业产品,并且你很匆忙,我建议查看JQuery的ajax实现并完全删除这些重新加载。

可能像一条线一样简单:

$.ajax(
    { 
     url:"/thisPath/requestPath", 
     complete:function(data){ 
     //apply data (the http-response) to HTML 
    } 
); 

如果看起来匪夷所思你,它只是对象AJAX方法的对象字面被送入JQuery的。分配给'complete'的函数在接收到http响应时触发,并将其作为在.ajax方法内部建立的参数'data'提供给函数。

2

从性能的角度来看,UpdatePanels是可怕的。我会用jQuery来做这件事,并完全避免回传。

$.ajax({ 
    url: "/path/to/url/that/returns/users", 
    type: "POST", 
    dataType: "json", 
    data: {}, 
    success: function(data, status, xhttp) 
    { 
     var html = "<table>"; 
     for (var i = 0; i < data.length; i++) 
     { 
      html += "<tr>"; 
      html += "<td></td>"; // build up table cells 
      html += "</tr>"; 
     } 
     html += "</table>"; 
     $("#NameOfDivToPutTableIn").html(html); 
    } 

}); 

如果这是一个选项,设置的URL基于本教程阅读:

http://encosia.com/using-jquery-to-directly-call-aspnet-ajax-page-methods/

如果你不想使用jquery,你仍然可以使用MS AJAX ,跳过那些更新面板。 http://www.geekzilla.co.uk/View7B75C93E-C8C9-4576-972B-2C3138DFC671.htm

1

<%@ Page MaintainScrollPositionOnPostback="true" %>作为Plage的声明将保留滚动位置,因为它是

+1

对不起,只是刚刚看了一下,说你已经试过了这个:) – Spike

+0

这个方法在'Page_Load'方法中很完美!谢谢......'Page.MaintainScrollPositionOnPostBack = true;' – Pierre

19

尝试在你的设计page..It工作正常,我下面的代码..

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="frmName.aspx.vb" Inherits="frmName" MaintainScrollPositionOnPostBack = "true" %> 
+0

当答案像这样简单时,它总是很好:) – dlchambers

-3
<pages maintainScrollPositionOnPostBack="true"> 
0

尝试这在后面的代码中:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (Page.IsPostBack) 
    { 
     Page.MaintainScrollPositionOnPostBack = true; 
    } 
} 

Posdata:我试过用C#。

0

@{ 
 
    
 
} 
 

 
<html> 
 

 
<head> 
 
<script type="text/javascript"> 
 

 
window.onload = function() { 
 
    var div = document.getElementById("dvScroll"); 
 
    var div_position = document.getElementById("div_position"); 
 
    var position = parseInt(@Request.Form("div_position")); 
 
    if (isNaN(position)) { 
 
     position = 0; 
 
    } 
 

 
    div.scrollTop = position; 
 
    div.onscroll = function() { 
 
     div_position.value = div.scrollTop; 
 
    }; 
 
}; 
 

 
</script> 
 
</head> 
 

 
<body> 
 

 
<div id="dvScroll" style="overflow-y: scroll; height: 260px; width: 300px"> 
 
    1. This is a sample text 
 
    <br /> 
 
    2. This is a sample text 
 
    <br /> 
 
    3. This is a sample text 
 
    <br /> 
 
    4. This is a sample text 
 
    <br /> 
 
    5. This is a sample text 
 
    <br /> 
 
    6. This is a sample text 
 
    <br /> 
 
    7. This is a sample text 
 
    <br /> 
 
    8. This is a sample text 
 
    <br /> 
 
    9. This is a sample text 
 
    <br /> 
 
    10. This is a sample text 
 
    <br /> 
 
    11. This is a sample text 
 
    <br /> 
 
    12. This is a sample text 
 
    <br /> 
 
    13. This is a sample text 
 
    <br /> 
 
    14. This is a sample text 
 
    <br /> 
 
    15. This is a sample text 
 
    <br /> 
 
    16. This is a sample text 
 
    <br /> 
 
    17. This is a sample text 
 
    <br /> 
 
    18. This is a sample text 
 
    <br /> 
 
    19. This is a sample text 
 
    <br /> 
 
    20. This is a sample text 
 
    <br /> 
 
    21. This is a sample text 
 
    <br /> 
 
    22. This is a sample text 
 
    <br /> 
 
    23. This is a sample text 
 
    <br /> 
 
    24. This is a sample text 
 
    <br /> 
 
    25. This is a sample text 
 
    <br /> 
 
</div> 
 

 
<hr /> 
 
<form method="post"> 
 
<input type="hidden" id="div_position" name="div_position" /> 
 
<input type="submit" value="Cool" /> 
 
</form> 
 
</body> 
 
</html>

您可以用它来保持回发后滚动位置。

来源:http://www.aspsnippets.com/Articles/Maintain-Scroll-Position-of-DIV-on-PostBack-in-ASPNet.aspx

0

别人用这种挣扎。最简单的解决方案是保持整个窗口的滚动位置

var xPos, yPos; 

    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function (evt, args) { 
     window.scrollTo(xPos , yPos); 
    }); 


    Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(function (evt, args) { 
     xPos = $(window).scrollLeft(); 
     yPos = $(window).scrollTop(); 

    }); 

广告开始和结束请求。开始请求使用Jquery获取窗口滚动位置。在结束请求时,请滚动到该位置。

0

添加此行

<%@ Page MaintainScrollPositionOnPostback="true" %> 
0

有答案全网解决这个问题,并亲自他们没有工作,为我的Firefox将试图恢复以前的滚动位置(错误地),触发window.scroll事件,它会覆盖隐藏字段的错误位置,然后我的scrollTo会读取它。 (我有Gridbacks来自回发,然后自动折叠一些行。)

所以这里有另一个解决这个问题的方法 - 我决定我只想在提交之后恢复滚动位置,而不是刷新,所以这是充足:

ASPX页面:

<form runat="server" onsubmit="$('#hfScroll').val($(window).scrollTop()); return true;"> 
    <input type="hidden" id="hfScroll" value="0" /> 

的Javascript:

function restoreScroll() 
{ 
    var position = parseInt($('#hfScroll').val()); 
    if (!isNaN(position)) { 
     $(document).scrollTop(position); 
    } 
}; 
var prm = Sys.WebForms.PageRequestManager.getInstance(); 
prm.add_pageLoaded(restoreScroll); 

出于某种原因,在浏览器刷新我的隐藏输入不重置为零,所以这确实有时表现奇怪。我很想知道这是怎么回事,我认为它是Firefox,因为它不会发生在IE上,但是生活太短了[他说......下载了一半的互联网,并花了数小时在这..]。

相关问题