ASP.NET控件开发学习笔记--第6回 ViewState

 

6 ViewState

4回中讲到了给控件添加属性,现在我们在客户端使用代码访问这些属性看看效果如何。把虚拟目录下的所有文件清空,新建一个App_Code文件夹,并在里面新建一个“SimpleControl.cs”文件,并输入如下代码:

6-1代码1SimpleControl.cs代码


using System;
using System.Web.UI;
namespace MyControl
{
    
public class LinksControl : Control
    {
        
protected int _num=0;
        
public virtual int Num
        {
            
get { return _num; }
            
set { _num=value; }
        }
        
protected override void Render(HtmlTextWriter writer)
        {
            writer.Write(Num.ToString());
        }
    }
}

 

这里我们建立了一个很简单的控件,它有一个整型属性Num,只是在Render中简单地输出了这个属性的值。下面我们在aspx文件中访问这个属性值。在虚拟目录下新建一个Simple.aspx文件,并输入如下代码:

6-1代码2Simple.aspx代码

 

 

<script runat="server" language="C#">
  
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代码1SimpleControl.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,多次点击按钮,看看数字是否已经随着点击次数增长?

posted @ 2008-02-28 21:27 abatei 阅读(496) 评论(5)  编辑 收藏 网摘 所属分类: ASP.NET控件开发

  回复  引用  查看    
#1楼 2008-02-29 11:36 | HeroBeast      
在aspx中禁用ViewState=false,你这种方法就不行了。你也可以考虑使用控件的viewstate,这样就不会受ViewState=false的限制了。
  回复  引用  查看    
#2楼 2008-02-29 12:09 | 汉广      
ViewState是一个helper class
:-)

-------------------------
汉广同学正在找工作,你可以点击这里 ,浏览他的简历。简历仍在修改中,我会心怀感激的阅读你的任何评论:-)

  回复  引用  查看    
#3楼 2008-02-29 12:58 | 汉广      
如果Page的enableViewState属性设置为false后,Init事件后就不会递归的加载所有的ViewState了。
这种情况下控件要持久化状态,只能在Init事件以前调用
RegisterRequiresControlState(Control control)
方法,将我们的控件添加到Page类的一个controlSet中,这样即使页面编辑人员禁用ViewState以后,我们的控件依然可以持久化状态。

以上信息非常可靠,是参考源码刚刚学习到的,呵呵。

-------------------------
汉广同学正在找工作,你可以点击这里 ,浏览他的简历。简历仍在修改中,我会心怀感激的阅读你的任何评论:-)



  回复  引用  查看    
#4楼 [楼主]2008-02-29 14:47 | abatei      
呵呵!谢谢各位发表意见
现阶段还是蜻蜓点水更容易让人接受
以后等我水平有了进一步的提高会综合各位意见展开来写

  回复  引用    
#5楼 2008-02-29 15:04 | eeeeee [未注册用户]
lz一定要坚持呀,我可跟着你学习呢,别写几天,不写了,西西,那我的事业就完了,哈

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-02-28 21:36 编辑过
Google站内搜索


China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!

相关文章:


相关搜索:
ASP.NET控件开发

相关链接: