簡體   English   中英

異步回發后重置滾動 position - ASP.NET

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM