<cc1:Txt ]=string.Empty;
}
//使用viewstate来实现属性
public string Text
{
get { return (string)ViewState["text"]; }
set { ViewState["text"]=value; }
}
#region render
protected override void Render(HtmlTextWriter writer)
{
writer.AddAttribute(HtmlTextWriterAttribute.Name,this.UniqueID);
writer.RenderBeginTag(HtmlTextWriterTag.Span);
//判断是否含有子控件
if(this.HasControls())
{
//获得LiteralControl
LiteralControl lc=(LiteralControl)this.Controls[0];
//这里得到内部内容的值
writer.Write(lc.Text);
}
else
//如果没有内部内容,那就是直接用属性指定了
writer.Write(this.Text);
writer.RenderEndTag();
}
#endregion
}
上面这个控件的状态保持通过viewstate来完成,以前我们定义属性,都是用一个private变量来完成,但是那样做就没有办法保存控件的状态,现在用viewstate,可以很容易的完成这个。状态的保持还可以通过实现IPostBackDataHandler接口实现,在那里的LoadPostData方法就传递了一个System.Collections.Specialized.NameValueCollection,可以用来获得控件的状态。
但并不是说所有控件只要实现了IPostBackDataHandler,就可以使用它来控制自身的值,只有内容是做为post请求的一部分发送的控件才可以(比如文本框),像上面的这个<span>,即使实现了IPostBackDataHandler,也完全没有作用,不仅需要的值不可能得到传递,用来实现IPostBackDataHandler的那两个方法也根本不会被调用!
public bool LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection)
{
this.msg=postCollection[postDataKey];
return true;
}
对于该方法,可以直接使用postDataKey做为索引从postCollection得到值。关于更详细的内容,可以去看上一篇笔记。
因此,对于内容不是post请求一部分的控件,可以使用viewstate来保持状态,而剩下的控件,内是ost请求一部分的控件,可以用实现IPostBackDataHandler+viewstate的混合方法来保持状态。