在.NET较早的版本里,您可能考虑使用SmartNavigation这个特性.SmartNavigation是Web
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" SmartNavigation="true" %> |
不过,正如好多人已经注意到的,SmartNavigation本身就有洗衣阿问题,事实上微软也被这个问题所困扰以至于在ASP.NET2.0里添加了MaintainScrollbackPositionOnPostback属性而取代SmartNavigation 。遗憾的是,我在使用它们时,感觉它们都有一些问题,我稍后将进行解释。
本文我将介绍SmartNavigation和MaintainScrollbackPositionOnPostback 在维护页面回发位置方面的缺点,并提供如何利用Javascript来解决这个问题,这个小技巧即使对复杂的Web页面也同样有效.
再见了SmartNavigationeb,欢迎MaintainScrollbackPositionOnPostback
下一步
ASP.NET2.0引进了MaintainScrollbackPositionOnPostback,和SmartNavigation类似,您可以在Page属性里设置它的值为true或者为false。
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" MaintainScrollPositionOnPostback="true" %> |
非常简明,这个属性/属性值对是用来维护页面位置的。遗憾的是,它只是维护页面的位置,因为如果你在用户控件里使用了TreeView控件,然后在页面里使用该用户控件,那么页面在在回发后您将返回到用户控件的位置而不是TreeView节点位置。
在TreeView里维护控件的位置
首先,利用TreeView控件的SelectedNode属性,可以知道哪个节点被选取,这个被选取的节点需要保存起来,它最终会程序为HTML元素。如果我知道了被选择HTML控件的ID,那么我就可以滚动到该控件并设置该控件为当前焦点。确实,如果您看以下使用TreeView控件的页面HTML代码,你将发现生成的一个隐藏<input>元素,以及为textbox类型,它的ID可能类似TreeViewx_SelectedNode
<input type="hidden" name="TreeView1_SelectedNode" id="TreeView1_SelectedNode" value="TreeView1t54" /> |
为了具体说明做法,我使用TreeView编写了一些代码,在Page_Load时间里加载一段脚本来找到需要的单元格(参考下表),在<body>的onload时间里调用该函数.
Imports System.Collections.Generic Partial Class _Default Inherits System.Web.UI.Page Protected Sub Page_Load(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Me.Load InjectLoadEvent() If (IsPostBack) Then Return TreeView1.Nodes.Clear() Dim chicken As New TreeNode("Chicken") TreeView1.Nodes.Add(chicken) Dim beef As New TreeNode("Beef") TreeView1.Nodes.Add(beef) Dim pork As New TreeNode("Pork") TreeView1.Nodes.Add(pork) Dim fish As New TreeNode("Fish") TreeView1.Nodes.Add(fish) chicken.ChildNodes.Add(New TreeNode("Crepes Florentine with Buffalo Chicken")) fish.ChildNodes.Add(New TreeNode("Linguine with White Clam Sauce")) pork.ChildNodes.Add(New TreeNode("Pork Loin with Peanut and Madarin Orange Sauce")) beef.ChildNodes.Add(New TreeNode("Standing Rib Roast with Fennel and Blue Cheese Potatoes")) ' We need a bunch of stuff here so we will add some stubs Dim I As Integer For I = 1 To 50 chicken.ChildNodes.Add(New TreeNode("Placeholder " + I.ToString())) fish.ChildNodes.Add(New TreeNode("Placeholder " + I.ToString())) pork.ChildNodes.Add(New TreeNode("Placeholder " + I.ToString())) beef.ChildNodes.Add(New TreeNode("Placeholder " + I.ToString())) Next TreeView1.CollapseAll() End Sub Public Sub InjectLoadEvent() Dim script As String = _ "function LoadEvent()" + _ "{{" + _ " try" + _ " {{" + _ " var elem = document.getElementById('{0}_SelectedNode');" + _ " if(elem != null )" + _ " {{" + _ " var node = document.getElementById(elem.value);" + _ " if(node != null)" + _ " {{" + _ " node.scrollIntoView(true);" + _ " {1}.scrollLeft = 0;" + _ " }}" + _ " }}" + _ " }}" + _ " catch(oException)" + _ " {{}}" + _ "}}" Page.ClientScript.RegisterClientScriptBlock(Me.GetType(), "LoadEvent", _ String.Format(script, TreeView1.ClientID, Panel1.ClientID), True) End Sub End Class |
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/