1

我在用户控件中有一个树视图。我需要在每次异步回发时运行一个 javascript 函数,以将它所在的 div 滚动到正确的位置。我已经让它工作了,但我认为必须有一种“更清洁”的方式来做到这一点。在控件的 Page_Load 函数中,我有以下代码。有更好的方法吗?

ScriptManager.RegisterStartupScript(this.UpdatePanel1, this.GetType(), "key" + DateTime.Now.Ticks, "RestorePosition();", true);

为了任何寻找此答案的人的利益,这就是我最终所做的工作。在 ascx 页面的顶部,我有以下代码:


<script type="text/javascript">
    function pageLoad(sender, args) {
        Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(SavePosition);
        Sys.WebForms.PageRequestManager.getInstance().add_endRequest(RestorePosition);
    }

    function SavePosition(sender, args) {
        document.getElementById('hdnScrollSaver').value = document.getElementById('reportTreeViewdiv').scrollTop;
    } 
    function RestorePosition(sender, args) {
        document.getElementById('reportTreeViewdiv').scrollTop = document.getElementById('hdnScrollSaver').value;
    } 

</script>

然后我将树视图包装在一个 div 标签中,如下所示:


<div class="reportTreeView" id="reportTreeViewdiv">
                    <asp:TreeView ID="TreeView1" runat="server" OnTreeNodePopulate="TreeView1_TreeNodePopulate" 
                        OnSelectedNodeChanged="TreeView1_SelectedNodeChanged" PathSeparator="|" SkinID="ReportTreeView" />
                </div>

希望这可以帮助某人。

4

3 回答 3

4

Ajax 为您提供了一个类似于 ASP.Net 页面的页面生命周期,但在客户端。因此,在 pageLoad 事件中,我们可以连接要在每个开始请求和结束请求上调用的函数。

function pageLoad(sender, args) {
  Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(beginRequest);
  Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequest);
}

function beginRequest(sender, args) {
        // begin request code - i.e. make a "processing" div visible
}

function endRequest(sender, args) {
        // we are back
        RestorePosition(); 
}
于 2010-03-17T16:07:46.377 回答
1

我认为这是一种“干净”的方式。您正在以应有的方式使用 ScriptManager。

如果您不喜欢那行代码的外观,您可以随时将其重构为“脚本实用程序”类或其他东西。我不会,但这只是我。

于 2010-03-17T14:52:23.973 回答
1

我认为你这样做是正确的。不过,我会摆脱唯一键。

根据MSDN

通过使用密钥识别脚本,多个服务器控制实例可以请求脚本块,而无需将其发送到输出流两次。

任何具有相同关键参数值的脚本块都被认为是重复的。

该密钥用于防止您多次创建脚本,因此您不需要它在您的情况下是唯一的。

于 2010-03-17T16:11:45.023 回答