鸟食轩的"SmartNavigation"补充版

关于asp.net的页面回滚后状态的保存一直是我头痛的问题.

我之前的处理方法是写一个函数来处理页面的定位问题.

这个函数也是参考了很多人的处理方法,自己再稍微处理了一下,代码如下:

ExpandedBlockStart.gif ContractedBlock.gif Retain Events #region Retain Events
InBlock.gif        
protected void Retain()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            StringBuilder saveScrollPosition 
= new StringBuilder ();
InBlock.gif            StringBuilder setScrollPosition 
= new StringBuilder ();
InBlock.gif
InBlock.gif            RegisterHiddenField(
"__SCROLLPOS""0");
InBlock.gif
InBlock.gif
InBlock.gif            saveScrollPosition.Append(
"<script language='javascript'>");
InBlock.gif            saveScrollPosition.Append(
"document.body.id='MyBody';");
InBlock.gif            saveScrollPosition.Append(
"function saveScrollPosition() {");
InBlock.gif            saveScrollPosition.Append(
"    document.forms[0].__SCROLLPOS.value = MyBody.scrollTop;");
InBlock.gif            saveScrollPosition.Append(
"}");        
InBlock.gif            saveScrollPosition.Append(
"MyBody.οnscrοll=saveScrollPosition;");
InBlock.gif            
InBlock.gif            saveScrollPosition.Append(
"</script>");
InBlock.gif
InBlock.gif            RegisterStartupScript(
"saveScroll", saveScrollPosition.ToString());
InBlock.gif
InBlock.gif
InBlock.gif            
if (Page.IsPostBack)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                setScrollPosition.Append(
"<script language='javascript'>");
InBlock.gif                setScrollPosition.Append(
"function setScrollPosition() {");
InBlock.gif                setScrollPosition.Append(
"    MyBody.scrollTop = " + Request["__SCROLLPOS"+ ";");
InBlock.gif                setScrollPosition.Append(
"}");
InBlock.gif                setScrollPosition.Append(
"MyBody.οnlοad=setScrollPosition;");
InBlock.gif                setScrollPosition.Append(
"</script>");
InBlock.gif
InBlock.gif                RegisterStartupScript(
"setScroll", setScrollPosition.ToString());
InBlock.gif            
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
protected void Retain(string div)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif            
string[] divs = dot.gif{div};
InBlock.gif            Retain(divs);
ExpandedSubBlockEnd.gif        }

InBlock.gif        
protected void Retain(string[] divs)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            StringBuilder saveScrollPosition 
= new StringBuilder ();
InBlock.gif            StringBuilder setScrollPosition 
= new StringBuilder ();
InBlock.gif
InBlock.gif            RegisterHiddenField(
"__SCROLLPOS""0");
InBlock.gif            
InBlock.gif
InBlock.gif            saveScrollPosition.Append(
"<script language='javascript'>");
InBlock.gif            saveScrollPosition.Append(
"document.body.id='MyBody';");
InBlock.gif            saveScrollPosition.Append(
"function saveScrollPosition() {");
InBlock.gif            saveScrollPosition.Append(
"    document.forms[0].__SCROLLPOS.value = MyBody.scrollTop;");
InBlock.gif            saveScrollPosition.Append(
"}");
InBlock.gif            saveScrollPosition.Append(
"MyBody.οnscrοll=saveScrollPosition;");
InBlock.gif
InBlock.gif            saveScrollPosition.Append(
"function saveDivDisplay() {");
InBlock.gif            
InBlock.gif            
foreach(string div in divs)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
if ((div != null)||(div != ""))
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    RegisterHiddenField(
"__"+div,"");
InBlock.gif                    saveScrollPosition.Append(
"    document.forms[0].__"+div+".value = "+div+".style.display;");
ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

InBlock.gif            
InBlock.gif            saveScrollPosition.Append(
"}");
InBlock.gif            saveScrollPosition.Append(
"MyBody.οnmοusedοwn=saveDivDisplay;");
InBlock.gif            
InBlock.gif            saveScrollPosition.Append(
"</script>");
InBlock.gif
InBlock.gif            RegisterStartupScript(
"saveScroll", saveScrollPosition.ToString());
InBlock.gif
InBlock.gif
InBlock.gif            
if (Page.IsPostBack)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                setScrollPosition.Append(
"<script language='javascript'>");
InBlock.gif                setScrollPosition.Append(
"function setScrollPosition() {");
InBlock.gif
InBlock.gif                
foreach(string div in divs)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    
if ((div != null)||(div != ""))
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
dot.gif{
InBlock.gif                        setScrollPosition.Append(
"    "+div+".style.display = '" + Request["__"+div] + "';");
ExpandedSubBlockEnd.gif                    }

ExpandedSubBlockEnd.gif                }

InBlock.gif
InBlock.gif                setScrollPosition.Append(
"    MyBody.scrollTop = " + Request["__SCROLLPOS"+ ";");
InBlock.gif                setScrollPosition.Append(
"}");
InBlock.gif                setScrollPosition.Append(
"MyBody.οnlοad=setScrollPosition;");
InBlock.gif                setScrollPosition.Append(
"</script>");
InBlock.gif
InBlock.gif                RegisterStartupScript(
"setScroll", setScrollPosition.ToString());
InBlock.gif                
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif
ExpandedBlockEnd.gif        
#endregion

用隐藏控件来保存值,但是有个问题,再回滚回来之后,页面再处理层的显示的时候会出现跳动.

看了 鸟食轩SmartNavigation系列文章,觉得非常的好用,解决了自己一直苦恼的问题,我想如果在控件里面自动循环出所有的层,然后控件呈现的时候把这些状态还原回去.
但是改了之后发现无法正常工作,估计还是自己太菜了.修改后的代码如下:

None.gif     [DefaultProperty( " Text " )] 
None.gif    [ToolboxData(
" <{0}:ClientNavigation runat=server></{0}:ClientNavigation> " )] 
None.gif    
public   class  ClientNavigation : WebControl, INamingContainer, IPostBackDataHandler 
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
public ClientNavigation() : base() dot.gif{} 
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
Properties#region Properties 
InBlock.gif        
public int PositionTop 
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif
InBlock.gif            
get 
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif
InBlock.gif                
object obj = ViewState["PositionTop"]; 
InBlock.gif                
return obj == null ? 0 : (int)obj; 
ExpandedSubBlockEnd.gif            }
 
InBlock.gif            
set 
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif
InBlock.gif                ViewState[
"PositionTop"= value; 
ExpandedSubBlockEnd.gif            }
 
ExpandedSubBlockEnd.gif        }
 
InBlock.gif 
InBlock.gif        
public int PositionLeft 
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif
InBlock.gif            
get 
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif
InBlock.gif                
object obj = ViewState["PositionLeft"]; 
InBlock.gif                
return obj == null ? 0 : (int)obj; 
ExpandedSubBlockEnd.gif            }
 
InBlock.gif            
set 
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif
InBlock.gif                ViewState[
"PositionLeft"= value; 
ExpandedSubBlockEnd.gif            }
 
ExpandedSubBlockEnd.gif        }
 
InBlock.gif
InBlock.gif        
public string DivDisplay
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
get 
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif
InBlock.gif                
object obj = ViewState["DivDisplay"]; 
InBlock.gif                
return obj == null ? "''": (string)obj; 
ExpandedSubBlockEnd.gif            }
 
InBlock.gif            
set 
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif
InBlock.gif                ViewState[
"DivDisplay"= value; 
ExpandedSubBlockEnd.gif            }
 
ExpandedSubBlockEnd.gif        }

InBlock.gif
ExpandedSubBlockEnd.gif        
#endregion
 
InBlock.gif 
InBlock.gif        
protected override void Render(HtmlTextWriter writer) 
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif
InBlock.gif            
this.RegisterClientScript(); 
InBlock.gif            writer.AddAttribute(HtmlTextWriterAttribute.Type, 
"hidden"); 
InBlock.gif            writer.AddAttribute(HtmlTextWriterAttribute.Id, 
this.ClientID); 
InBlock.gif            writer.AddAttribute(HtmlTextWriterAttribute.Name, 
this.ClientID); 
InBlock.gif            writer.AddAttribute(HtmlTextWriterAttribute.Value,
string.Format("{0}:{1}:{2}"this.PositionTop,this.PositionLeft,this.DivDisplay)); 
InBlock.gif            
//writer.AddAttribute(HtmlTextWriterAttribute.Value,string.Format("{0}:{1}", this.PositionTop,this.PositionLeft)); 
InBlock.gif
            writer.RenderBeginTag(HtmlTextWriterTag.Input); 
InBlock.gif            writer.RenderEndTag(); 
ExpandedSubBlockEnd.gif        }
 
InBlock.gif 
InBlock.gif
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
Client Script#region Client Script 
InBlock.gif        
private void RegisterClientScript() 
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif
InBlock.gif            
const string REGISTER_KEY = "__ClientNavigate586787__"
InBlock.gif            
string strScript = @" 
InBlock.gif            <script language=""javascript""> 
InBlock.gif            window.attachEvent('onload', CLN_ClientNavigation); 
InBlock.gif            function CLN_ClientNavigation() 
InBlock.gif            {
InBlock.gif                var scrollTop = {0}; 
InBlock.gif                var scrollLeft = {1}; 
InBlock.gif                var scrollCount = 0; 
InBlock.gif                var divdisplay = {2};    
InBlock.gif
InBlock.gif                var dis = divdisplay.split('$$$');                                    
InBlock.gif                
InBlock.gif                do 
InBlock.gif                {
InBlock.gif                    scrollCount ++; 
InBlock.gif                    window.scrollTo(scrollLeft, scrollTop); 
InBlock.gif                }} 
InBlock.gif                while(document.body.scrollTop < scrollTop && scrollCount < 10 ); 
InBlock.gif                
InBlock.gif                var divs = document.getElementsByTagName('div');
InBlock.gif                for(i=0;i<divs.length;i++)
InBlock.gif                {{
InBlock.gif                    if (dis[i+1] != null)
InBlock.gif                    divs[i].style.cssText = dis[i+1];
InBlock.gif                }}
InBlock.gif            }} 
InBlock.gif            document.body.onscroll = function() 
InBlock.gif            {
InBlock.gif                var body = document.body; 
InBlock.gif                
InBlock.gif                var dis = ' ';
InBlock.gif                var divs = document.getElementsByTagName('div');
InBlock.gif                
InBlock.gif                for(i=0;i<divs.length;i++) 
InBlock.gif                {{
InBlock.gif                    
InBlock.gif                    dis = dis + '$$$' + divs[i].style.cssText;
InBlock.gif                }}
InBlock.gif                document.all.{3}.value = body.scrollTop + ':' + body.scrollLeft+ ':' + dis; 
InBlock.gif                
InBlock.gif            }} 
InBlock.gif    
InBlock.gif    
InBlock.gif
InBlock.gif
InBlock.gif            </script>
"
InBlock.gif
InBlock.gif
InBlock.gif            
if ( !this.Page.IsStartupScriptRegistered(REGISTER_KEY) ) 
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif
InBlock.gif                strScript 
= String.Format(strScript, this.PositionTop, this.PositionLeft, this.DivDisplay, this.ClientID); 
InBlock.gif                
//strScript = String.Format(strScript, this.PositionTop, this.PositionLeft, this.ClientID); 
InBlock.gif
                this.Page.RegisterStartupScript(REGISTER_KEY, strScript); 
ExpandedSubBlockEnd.gif            }
 
ExpandedSubBlockEnd.gif        }
 
ExpandedSubBlockEnd.gif        
#endregion
 
InBlock.gif 
ExpandedSubBlockStart.gifContractedSubBlock.gif        
IPostBackDataHandler interface#region IPostBackDataHandler interface 
InBlock.gif
InBlock.gif        
public void RaisePostDataChangedEvent() 
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif
InBlock.gif            
// TODO:  Add ClientNavigation.RaisePostDataChangedEvent implementation 
ExpandedSubBlockEnd.gif
        }
 
InBlock.gif
InBlock.gif
InBlock.gif        
public bool LoadPostData(string postDataKey, NameValueCollection postCollection) 
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif
InBlock.gif            
bool modify = false
InBlock.gif            
string postData = postCollection[postDataKey]; 
InBlock.gif            
if ( !StringHelper.IsEmpty(postData) ) 
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif                
string [] topleft = postData.Split(new char [] dot.gif{':'}); 
InBlock.gif                
int iPositionTop = int.Parse(topleft[0]); 
InBlock.gif                
int iPostionLeft = int.Parse(topleft[1]); 
InBlock.gif                
string sDiv = topleft[2];
InBlock.gif                
if ( iPositionTop != this.PositionTop ) 
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif
InBlock.gif                    
this.PositionTop = iPositionTop; 
InBlock.gif                    modify 
|= true
ExpandedSubBlockEnd.gif                }
 
InBlock.gif                
if ( iPostionLeft != this.PositionLeft ) 
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif
InBlock.gif                    
this.PositionLeft = iPostionLeft; 
InBlock.gif                    modify 
|= true
ExpandedSubBlockEnd.gif                }
 
InBlock.gif                
if ( sDiv != this.DivDisplay)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    
this.DivDisplay = sDiv;
InBlock.gif                    modify 
|= true;
ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }
 
InBlock.gif            
return modify; 
ExpandedSubBlockEnd.gif        }
 
InBlock.gif
ExpandedSubBlockEnd.gif        
#endregion
 
ExpandedBlockEnd.gif    }
 


不知道是否有更好的解决方法.

转载于:https://www.cnblogs.com/walkingboy/archive/2005/07/29/202746.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值