asp.net控件开发(二)-简单属性
一、属性实现交互
我们还是沿用上面的例子来添加属性 PicShow示例:
public class PicShow : Control
{
private string _imgUrl;
//属性
public virtual string ImgUrl
{
get
{
return this._imgUrl;
}
set
{
this._imgUrl = value;
}
}
protected override void Render(HtmlTextWriter writer)
{
writer.AddStyleAttribute(HtmlTextWriterStyle.TextAlign, "center");
writer.AddStyleAttribute(HtmlTextWriterStyle.Height, "100px");
writer.AddStyleAttribute(HtmlTextWriterStyle.Width, "100px");
writer.RenderBeginTag(HtmlTextWriterTag.Div);
//Create Img Tag
writer.AddAttribute(HtmlTextWriterAttribute.Src, this.ImgUrl);
writer.AddStyleAttribute(HtmlTextWriterStyle.Width, "80px");
writer.AddStyleAttribute(HtmlTextWriterStyle.Height, "80px");
writer.RenderBeginTag(HtmlTextWriterTag.Img);
writer.RenderEndTag();
//End Of Div
writer.RenderEndTag();
}
}
二、视图状态
举个例子:
http://www.w3.
org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
http://www.w3.org/1999/xhtml">
ImgUrl="Images/1109508867.jpg">
onclick="btnChange_Click" />
我们通过按钮来改变其属性:
protected void btnChange_Click(object sender, EventArgs e)
{
if (this.psDemo.ImgUrl == "Images/1109508867.jpg")
this.psDemo.ImgUrl = "Images/bg.jpg";
else
this.psDemo.ImgUrl = "Images/1109508867.jpg";
}
运行后我们会发现,我们的图片只能改变一次。原因很简单,客户端发出http请求后,服务器端并没有帮我们去维持上一次的请求信息。
在有的时候我们必须要求其维持状态。状态分为两种:一个是视图状态,一个是控件状态。
视图状态在脚本中的表现为:保存到一个叫"_VIEWSTATE"的隐藏域中去,这样来实现保存上次的用户请求。视图状态是一个集合(ViewState)。
我们来继承一个PicShow
public class viewStatePic : PicShow
{
public override string ImgUrl
{
get
{
string strImgUrl = (string)ViewState["ImgUrl"];
return (strImgUrl == null) ? String.Empty : strImgUrl;
}
set
{
ViewState["ImgUrl"] = value;
}
}
}
这里我们只是把ImgUrl重写了,通过视图的状态来实现的,这下子我们在使用时就可以维持上次用户的请求。
三、控件状态
我们会发现如果用户禁止使用了视图状态的话(在中添加EnableViewState="false"),我们还是维持不了用户的上次请求,这时我们可以通过控件状态来永远地维持。
控件状态的维持一般分为三步:
2、重写SaveControlState()方法来保存控件状态的值。
3、最后再将控件状态的值返回到属性中去。
控件状态示例:
public class ControlStatePic : Albumn
{
protected override void OnInit(EventArgs e)
{
Page.RegisterRequiresControlState(this);
base.OnInit(e);
}
protected override object SaveControlState()
{
return this.ImgUrl;
}
protected override void LoadControlState(object savedState)
{
this.ImgUrl = savedState as string;
}
}