我在用户控件中有一个树视图。我需要使用每个异步回发运行一个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>
希望这有助于某人。
答案 0 :(得分: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();
}
答案 1 :(得分:1)
我认为这是一种“干净”的方式。您正在使用ScriptManager的方式。
如果您不喜欢该行代码的外观,您可以随时将其重构为“脚本实用程序”类或其他内容。我不会,但那只是我。
答案 2 :(得分:1)
我认为你正确地这样做了。我会摆脱这个独特的钥匙。
根据MSDN:
通过使用密钥识别脚本,多个服务器控件实例可以请求脚本块,而不会将其发送到输出流两次。
具有相同关键参数值的任何脚本块都被视为重复。
该密钥用于防止您多次创建脚本,因此您不需要它在您的情况下是唯一的。