void Button1_Click(object sender, EventArgs e)
{
LC.Num++;
}
</script>
<%@Register TagPrefix="CG" Namespace="MyControl" %>
<html>
<body>
<form runat="server">
<CG:LinksControl ID="LC" runat="server" />
<asp:Button ID="Button1" runat="server" onclick="Button1_Click"
Text="Button" />
</form>
</body>
</html>
在aspx文件中,添加了一个Button控件,并在它的单击事件中给我们刚才所定制的控件的Num属性加1。下面在浏览器中运行Simple.aspx文件。这时,只出现一个数字0和一个按钮。我们多次单击按钮,但数字始终为1,并没有如我们所预期的那个不断增加。这是为什么呢?
其实大家应该都知道,客户端向服务器发出请求,服务器做出响应后就不再维持此次请求客户端的信息。也就是说,我们在浏览器中输入一个网址向服务器发出请求,服务器做出响应并实例化LinksControl类,在把响应信息返回给客户端后,控件就被释放了。这时我们在网页上单击了按钮,再次向服务器发出请求,服务器会再次实例化LinksControl类以做出响应。也就是说每次单击按钮,所操作的都是LinksControl类的不同实例,属性值并没有得到保存就很正常了。Web编程和WinForm编程模型真是天壤之别,真是让人头痛。
如何解决这个问题呢?ASP.NET中,把信息回传给服务器时,提交了一个隐藏的ViewState控件,这个控件里存放着页面上的控件的状态。也就是说在点按钮时,把当前LinksControl对象的Num属性回传给服务器,服务器再根据这个值生成新的页面。
如何获得这个回传值呢?Control类晨有一个ViewState属性,它是一个集合,使用ViewState[“Num”]就可以得到Num的回传值。好,打开SimpleControl.cs文件,并对属性的代码稍做修改如下:
例6-2代码1:SimpleControl.cs代码
using System;
using System.Web.UI;
namespace MyControl
{
public class LinksControl : Control
{
public virtual int Num
{
get
{
return ViewState["Num"]!=null ?
(int)ViewState["Num"] : 0;
}
set
{
ViewState["Num"]=value;
}
}
protected override void Render(HtmlTextWriter writer)
{
writer.Write(Num.ToString());
}
}
}
现在再运行Simple.aspx,多次点击按钮,看看数字是否已经随着点击次数增长?
最新相关文章
发表评论