自定义控件ViewState出问题了,看看怎么回事

truesight 2004-07-23 03:19:32
问题:
查看页:
http://202.200.225.83/newblog/login.aspx
点击登录按钮,用户名的文本框就会添加“,”号,而且是+=添加

login.aspx的页面实现:
整页只有一个自定义UserFrame控件【代码见下】,UserFrame控件根据SwapStrings属性和SwapControls属性提供的字符串,分析Text属性,将Text属性中SwapStrings的字符加载SwapControls提供的用户控件路径加载控件并Render,最终页面由Javascript呈现

UserFrame控件源码:
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Text;


[assembly:TagPrefix("FrameMaster","SmallCharm")]
namespace FrameMaster
{
/// <summary>
/// WebCustomControl1 的摘要说明。
/// </summary>
[DefaultProperty("Text"),
ToolboxData("<{0}:UserFrame runat=server></{0}:UserFrame>")]
public class UserFrame :System.Web.UI.Control,INamingContainer
{
private string text;
private string swapstrings;
private string swapcontrols;
private string CopyRightInfo="";
private string[] swapstring;
private string[] swapcontrol;

[Bindable(true),
Category("Appearance"),
DefaultValue("")]
public string Text
{
get
{
return text;
}

set
{
text = value;
}
}

[Bindable(true),
Category("Data"),
DefaultValue(""),Description("替换字符串集合,#分割")]
public string SwapStrings
{
get
{
return swapstrings;
}
set
{
swapstrings = value;
}
}

[Bindable(true),
Category("Data"),
DefaultValue(""),Description("控件路径集合,#分割")]
public string SwapControls
{
get
{
return swapcontrols;
}
set
{
swapcontrols = value;
}
}

/// <summary>
/// 将此控件呈现给指定的输出参数。
/// </summary>
/// <param name="output"> 要写出到的 HTML 编写器 </param>
protected override void Render(HtmlTextWriter output)
{
//输出版权信息
output.Write(this.CopyRightInfo);
//输出客户端替换JavaScript
output.Write(this.MyGetJavaScript());
/*if ((this.HasControls())&&(this.Controls[0] is LiteralControl))
{
output.Write(((LiteralControl)Controls[0]).Text);
}*/
output.Write(text);
base.Render(output);
}

protected override void OnInit(EventArgs e)
{
// TODO: 添加 UserFrame.OnInit 实现
this.CopyRightInfo+="\n<!--==========================================================================================================================\n\n";
this.CopyRightInfo+="Asp.NET框架服务器控件(C#)[Asp.NET Frame WebControl]\n本服务器控件由SmallCharm提供[Written by SmallCharm]\n";
this.CopyRightInfo+="\n==========================================================================================================================-->\n";


base.OnInit (e);
}

protected string MyGetJavaScript()
{
StringBuilder js=new StringBuilder(600);
js.Append("\n<script language=\"javascript\">\n<!--\n");
string forarray="";
for(int j=0;j<swapstring.Length;j++)
{
forarray+="\""+swapstring[j].Replace("<","<").Replace(">",">").Replace("$","\\\\$")+"\",";
}
forarray=forarray.Substring(0,forarray.Length-1);
js.Append("var jswapstring=new Array("+forarray+");\n");
js.Append("function SwapC()\n{\nvar bodycontent=document.body.innerHTML;\n");
//js.Append("window.alert(\"gg\");\nwindow.alert(bodycontent);\n");
js.Append("for(var k=0;k<"+swapstring.Length+";k++)\n{\n");
//js.Append("window.alert(jswapstring[k]);\n");
js.Append("var re=new RegExp(jswapstring[k],\"gi\");\n");
js.Append("var obj=eval(\"document.all."+this.UniqueID.ToString()+"\"+k);\n");
js.Append("bodycontent=bodycontent.replace(re,obj.innerHTML);\n");
js.Append("}\n");
js.Append("document.body.innerHTML=bodycontent;\n}\nwindow.onload=SwapC;\n");
js.Append("-->\n</script>\n");

return js.ToString();
}

protected override void CreateChildControls()
{
// TODO: 添加 UserFrame.CreateChildControls 实现
//加载替换控件
swapstring=swapstrings.Split('#');
swapcontrol=swapcontrols.Split('#');
if(swapstring.Length!=swapcontrol.Length)
{
throw new Exception("替换字符串集合和控件集合设置错误,数目不一致!");
}
PlaceHolder ctrlHolder;
UserControl uctrl;
for(int i=0;i<swapstring.Length;i++)
{
ctrlHolder=new PlaceHolder();
ctrlHolder.Controls.Add(new LiteralControl("<div ID=\""+this.UniqueID.ToString()+i.ToString()+"\" style=\"display:none;\">"));
uctrl=(UserControl)Page.LoadControl(swapcontrol[i]);
ctrlHolder.Controls.Add(uctrl);
ctrlHolder.Controls.Add(new LiteralControl("</div>"));
this.Controls.Add(ctrlHolder);
}

}



public override void DataBind()
{
// TODO: 添加 UserFrame.DataBind 实现
//this.OnDataBinding(System.EventArgs.Empty);

base.DataBind ();
}

protected override object SaveViewState()
{
// TODO: 添加 UserFrame.SaveViewState 实现
Object baseState=base.SaveViewState();
Object[] myState=new object[4];
myState[0]=baseState;
myState[1]=this.Text;
myState[2]=this.SwapStrings;
myState[3]=this.SwapControls;
return myState;
}

protected override void LoadViewState(object savedState)
{
// TODO: 添加 UserFrame.LoadViewState 实现
if(savedState!=null)
{
Object[] myState=(Object[])savedState;
if(myState[0]!=null)
base.LoadViewState(myState[0]);
if(myState[1]!=null)
this.Text=(string)myState[1];
if(myState[2]!=null)
this.SwapStrings=(string)myState[2];
if(myState[3]!=null)
this.SwapControls=(string)myState[3];
}
}

protected override void TrackViewState()
{
// TODO: 添加 UserFrame.TrackViewState 实现
if(HasChildViewState)
ClearChildViewState();
base.TrackViewState ();
}
}
}
...全文
159 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧