有没有一种方法可以在具有每 15 秒刷新一次的更新面板的网站上强制页面位置?

Is there a way to force page position on a website that has an update panel that refreshes every 15 seconds?

我有一个 Web 控件,它是一个用户填写的长表单。一路上有很多检查,很多滚动和很多回发。

对于每个按钮点击或回发操作(单选select,下拉列表更改),我在后面的代码中使用它:

 Page.MaintainScrollPositionOnPostBack = True

按预期工作。它会滚动回调用它的那个按钮或事件。 但是,在 Web 控件上,有一个更新面板:

<asp:PlaceHolder runat="server" ID="plFingerprint" Visible="false">
                <tr>
                    <td colspan="2" class="l">
                        <asp:UpdatePanel ID="updatePanel" runat="server" UpdateMode="Conditional">
                            <ContentTemplate>
                                <uc1:Listener id="tidListener" runat="server" />
                                <a href="FingerBio:match,--=7392=--,<%= tidListener.SessionID.ToString() %>,<%= ReplyIndex.BaseSiteUrl %>">
                                    <img id="Img1" runat="server" src="~/images/finger.png" class="scan"
                                        alt="Scan Finger" /></a>
                                <asp:Label ID="matchlabel" runat="server"></asp:Label>
                                <div style="display: none">
                                    <asp:Label ID="matchIDLabel" runat="server"></asp:Label></div>
                            </ContentTemplate>
                        </asp:UpdatePanel>
                    </td>
                </tr>
            </asp:PlaceHolder>

这本质上是一个指纹扫描仪,每 15 秒刷新一次以捕获任何新的指纹。基本上发生的是,用户将在表单下方很好地捕获数据,当间隔开始时,面板会更新并且屏幕会回到顶部(这是更新面板位于 BTW 的位置)。它从链接到站点的 Web 服务读取数据。

现在至少可以说这是令人沮丧的。用户抱怨屏幕一直在跳动。

我有

Page.MaintainScrollPositionOnPostBack = True

它需要的任何地方,但这并不能阻止更新面板接管。

我想使用锚点,但这不适用于我们的网站结构。

还有什么我可以尝试的吗?我希望更新面板继续正常更新,每 15 秒一次,而不是每次都重新定位屏幕。

这可以在 Javascript 中完成吗?背后的代码?像更改表单本身一样简单?

编辑

这是在该控件本身上:

<asp:Timer ID="timerTid" runat="server" Interval="1500" OnTick="timerTid_Tick">

我可以在代码中设置时间间隔,在用户使用或未使用此功能之后吗?

最好只更新需要的内容。但我认为还有另一种选择。您可以尝试使用 Sys.WebForms.PageRequestManager.getInstance。当 UpdatePanel 有更新时调用哪些 js 函数。我没怎么用过,我觉得应该是这样的。

<script type="text/javascript" language="javascript">
    Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(BeginRequestHandler);
    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);

    function BeginRequestHandler(sender, args)    
    {
        // Get current scroll position
    }
    function EndRequestHandler(sender, args)
    {
        // Set scroll position back to where it was
    }
</script>

如果将新记录添加到网格顶部,您可能会遇到问题。

通过将此添加到我的 ScriptManager 设法解决了我的问题

LoadScriptsBeforeUI="true"

这会加载所有脚本,因此控件会获取数据并刷新,但不会进行所有滚动。