关于asp.net的页面回滚后状态的保存一直是我头痛的问题.
我之前的处理方法是写一个函数来处理页面的定位问题.
这个函数也是参考了很多人的处理方法,自己再稍微处理了一下,代码如下:
Retain Events
#region Retain Events
protected void Retain()
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
StringBuilder saveScrollPosition = new StringBuilder ();
StringBuilder setScrollPosition = new StringBuilder ();
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
RegisterHiddenField("__SCROLLPOS", "0");
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
saveScrollPosition.Append("<script language='javascript'>");
saveScrollPosition.Append("document.body.id='MyBody';");
saveScrollPosition.Append("function saveScrollPosition() {");
saveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = MyBody.scrollTop;");
saveScrollPosition.Append("}");
saveScrollPosition.Append("MyBody.οnscrοll=saveScrollPosition;");
saveScrollPosition.Append("</script>");
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
RegisterStartupScript("saveScroll", saveScrollPosition.ToString());
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
if (Page.IsPostBack)
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
setScrollPosition.Append("<script language='javascript'>");
setScrollPosition.Append("function setScrollPosition() {");
setScrollPosition.Append(" MyBody.scrollTop = " + Request["__SCROLLPOS"] + ";");
setScrollPosition.Append("}");
setScrollPosition.Append("MyBody.οnlοad=setScrollPosition;");
setScrollPosition.Append("</script>");
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
RegisterStartupScript("setScroll", setScrollPosition.ToString());
}
}
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
protected void Retain(string div)
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
string[] divs =
{div};
Retain(divs);
}
protected void Retain(string[] divs)
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
StringBuilder saveScrollPosition = new StringBuilder ();
StringBuilder setScrollPosition = new StringBuilder ();
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
RegisterHiddenField("__SCROLLPOS", "0");
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
saveScrollPosition.Append("<script language='javascript'>");
saveScrollPosition.Append("document.body.id='MyBody';");
saveScrollPosition.Append("function saveScrollPosition() {");
saveScrollPosition.Append(" document.forms[0].__SCROLLPOS.value = MyBody.scrollTop;");
saveScrollPosition.Append("}");
saveScrollPosition.Append("MyBody.οnscrοll=saveScrollPosition;");
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
saveScrollPosition.Append("function saveDivDisplay() {");
foreach(string div in divs)
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if ((div != null)||(div != ""))
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
RegisterHiddenField("__"+div,"");
saveScrollPosition.Append(" document.forms[0].__"+div+".value = "+div+".style.display;");
}
}
saveScrollPosition.Append("}");
saveScrollPosition.Append("MyBody.οnmοusedοwn=saveDivDisplay;");
saveScrollPosition.Append("</script>");
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
RegisterStartupScript("saveScroll", saveScrollPosition.ToString());
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
if (Page.IsPostBack)
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
setScrollPosition.Append("<script language='javascript'>");
setScrollPosition.Append("function setScrollPosition() {");
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
foreach(string div in divs)
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if ((div != null)||(div != ""))
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
setScrollPosition.Append(" "+div+".style.display = '" + Request["__"+div] + "';");
}
}
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
setScrollPosition.Append(" MyBody.scrollTop = " + Request["__SCROLLPOS"] + ";");
setScrollPosition.Append("}");
setScrollPosition.Append("MyBody.οnlοad=setScrollPosition;");
setScrollPosition.Append("</script>");
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
RegisterStartupScript("setScroll", setScrollPosition.ToString());
}
}
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
#endregion
用隐藏控件来保存值,但是有个问题,再回滚回来之后,页面再处理层的显示的时候会出现跳动.
看了
鸟食轩的
SmartNavigation系列文章,觉得非常的好用,解决了自己一直苦恼的问题,我想如果在控件里面自动循环出所有的层,然后控件呈现的时候把这些状态还原回去.
但是改了之后发现无法正常工作,估计还是自己太菜了.修改后的代码如下:
[DefaultProperty(
"
Text
"
)]
[ToolboxData(
"
<{0}:ClientNavigation runat=server></{0}:ClientNavigation>
"
)]
public
class
ClientNavigation : WebControl, INamingContainer, IPostBackDataHandler
![ExpandedBlockStart.gif](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public ClientNavigation() : base()
{}
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
Properties#region Properties
public int PositionTop
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
object obj = ViewState["PositionTop"];
return obj == null ? 0 : (int)obj;
}
set
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
ViewState["PositionTop"] = value;
}
}
public int PositionLeft
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
object obj = ViewState["PositionLeft"];
return obj == null ? 0 : (int)obj;
}
set
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
ViewState["PositionLeft"] = value;
}
}
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
public string DivDisplay
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
object obj = ViewState["DivDisplay"];
return obj == null ? "''": (string)obj;
}
set
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
ViewState["DivDisplay"] = value;
}
}
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
#endregion
protected override void Render(HtmlTextWriter writer)
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this.RegisterClientScript();
writer.AddAttribute(HtmlTextWriterAttribute.Type, "hidden");
writer.AddAttribute(HtmlTextWriterAttribute.Id, this.ClientID);
writer.AddAttribute(HtmlTextWriterAttribute.Name, this.ClientID);
writer.AddAttribute(HtmlTextWriterAttribute.Value,string.Format("{0}:{1}:{2}", this.PositionTop,this.PositionLeft,this.DivDisplay));
//writer.AddAttribute(HtmlTextWriterAttribute.Value,string.Format("{0}:{1}", this.PositionTop,this.PositionLeft));
writer.RenderBeginTag(HtmlTextWriterTag.Input);
writer.RenderEndTag();
}
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
Client Script#region Client Script
private void RegisterClientScript()
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
const string REGISTER_KEY = "__ClientNavigate586787__";
string strScript = @"
<script language=""javascript"">
window.attachEvent('onload', CLN_ClientNavigation);
function CLN_ClientNavigation()
{{
var scrollTop = {0};
var scrollLeft = {1};
var scrollCount = 0;
var divdisplay = {2};
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
var dis = divdisplay.split('$$$');
do
{{
scrollCount ++;
window.scrollTo(scrollLeft, scrollTop);
}}
while(document.body.scrollTop < scrollTop && scrollCount < 10 );
var divs = document.getElementsByTagName('div');
for(i=0;i<divs.length;i++)
{{
if (dis[i+1] != null)
divs[i].style.cssText = dis[i+1];
}}
}}
document.body.onscroll = function()
{{
var body = document.body;
var dis = ' ';
var divs = document.getElementsByTagName('div');
for(i=0;i<divs.length;i++)
{{
dis = dis + '$$$' + divs[i].style.cssText;
}}
document.all.{3}.value = body.scrollTop + ':' + body.scrollLeft+ ':' + dis;
}}
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
</script>";
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
if ( !this.Page.IsStartupScriptRegistered(REGISTER_KEY) )
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
strScript = String.Format(strScript, this.PositionTop, this.PositionLeft, this.DivDisplay, this.ClientID);
//strScript = String.Format(strScript, this.PositionTop, this.PositionLeft, this.ClientID);
this.Page.RegisterStartupScript(REGISTER_KEY, strScript);
}
}
#endregion
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
IPostBackDataHandler interface#region IPostBackDataHandler interface
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
public void RaisePostDataChangedEvent()
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
// TODO: Add ClientNavigation.RaisePostDataChangedEvent implementation
}
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
public bool LoadPostData(string postDataKey, NameValueCollection postCollection)
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
bool modify = false;
string postData = postCollection[postDataKey];
if ( !StringHelper.IsEmpty(postData) )
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
string [] topleft = postData.Split(new char []
{':'});
int iPositionTop = int.Parse(topleft[0]);
int iPostionLeft = int.Parse(topleft[1]);
string sDiv = topleft[2];
if ( iPositionTop != this.PositionTop )
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this.PositionTop = iPositionTop;
modify |= true;
}
if ( iPostionLeft != this.PositionLeft )
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this.PositionLeft = iPostionLeft;
modify |= true;
}
if ( sDiv != this.DivDisplay)
![ExpandedSubBlockStart.gif](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
this.DivDisplay = sDiv;
modify |= true;
}
}
return modify;
}
![InBlock.gif](/Images/OutliningIndicators/InBlock.gif)
#endregion
}
不知道是否有更好的解决方法.