zoukankan      html  css  js  c++  java
  • 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,多次点击按钮,看看数字是否已经随着点击次数增长?

  • 相关阅读:
    Jquery基于ActiveX的批量上传
    枚举类型在as3中的实现
    delphi操作word基类,插入表格,分页符,日期,页码,替换,图片
    消除文本锯齿
    As3显示对象scrollRect滚动问题
    Bitmap序列化
    加载图片的方法
    球体旋转坐标推导
    AS3基于TextField实现图文并排更新于2015.08.05
    Flash与外部程序之间的通信
  • 原文地址:https://www.cnblogs.com/abatei/p/1085406.html
Copyright © 2011-2022 走看看