Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1143195
  • 博文数量: 141
  • 博客积分: 3161
  • 博客等级: 中校
  • 技术积分: 3011
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-27 14:53
文章存档

2012年(28)

2011年(113)

分类: 系统运维

2011-09-29 12:14:29

                             深入讲解控件的属性持久化(一)

    自从写了控件开发的文章后,收到了不少朋友的来信,提出了不少的问题,感谢大家的关注。今天就把大家说的一些问题来讲解下。

     

    虽然我这个系列是控件开发,但是我的目的还是希望大家通过开发控件更加快速的对ASP.NET有更加深入的了解,所以我们也很有必要把一些基础性的东西将清楚。

     

    为了达到深入讲解属性的目的,我首先来讲讲页面周期和页面解析的一些问题:

     1。页面的解析:

     大家可能听说,页面在提交给服务器的时候,都是被解析成为了一个个的继承与Page的类,最直接的证明就是:

 
  1. <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

    大家看看,就是那个代码隐藏

 
  1. CodeFile="Default.aspx.cs" Inherits="_Default"

 

    大家也许觉得疑惑:一个aspx的页面都是一些标记语言啊,如下面:(注意:是将下面的文本解析为一个类)

 
  1. <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "">

  3. <html xmlns="" >
  4. <head runat="server">
  5.     <title>无标题页</title>
  6. </head>
  7. <body>
  8.     <form id="form1" runat="server">
  9.     <div>
  10.         <asp:Button ID="Button1" runat="server" Text="提交" OnClick="Button1_Click" /></div>
  11.         <asp:LinkButton ID="LinkButton1" runat="server">LinkButton</asp:LinkButton>
  12.     </form>
  13. </body>
  14. </html>

 

    大家也许看见了,上面的源是一个类似与XML的文档。

    当这个页面发送到服务器后,服务器就开发用正则表达模式来解析这个文档,比如,看见""就把他解析为一个LiteralControl,如:LiteralControl head = new LiteralControl("");,看见了

就解析为HtmlForm类,就这样,一个类似与XML的文档就解析为了一个继承于Page的cs类。如下:(伪码,只是演示而已,真正的不是这样的):

 

     

    大家注意:页面解析的时候,把我们为控件设置的值,如Text=“ 提交”都初始化给了控件。

    然后,将解析完的类生成一个类的实例,之后就开始页面的生命周期。

 

    2.HTTP工作模式     

    HTTP是一种无状态的连接模式,也就是说,客户端像服务器发送请求职后,服务器响应后就不再维持客户端的信息。

    3.综合1,2讲解属性持久化

    现在假设,在Button中没有属性持久化这个特点。我们看看下面的流程:

    3.1:再页面中放入一个Button按钮,并且设置Text 属性为“提交”,然后再Button的点击Click事件中写下如下代码: 

  1. protected void Button1_Click(object sender, EventArgs e)
  2.     {
  3.         if (this.Button1.Text == "提交")
  4.             this.Button1.Text = "清空";
  5.         else
  6.             this.Button1.Text = "提交";


  7.     }

 

    3.2:将页面提交给服务器,此时,就开始了页面的解析工作,并且在解析的时候,使得Button的Text属性设置为了“提交”,然后就开始了页面的生命周期。最后页面就呈现在我们面前。

 

    3.3:我们在浏览器的页面中点击Button按钮,页面就再次提交服务器,页面开始解析,然后开始生命周期,在周期的某一个阶段(以后讲解),就会引发按钮的Click事件,将按钮的文本设置为”清空“,最后页面呈现在我们面前。

 

    3.4;当我们再次点击按钮,我们本来是想使得按钮显示”提交“,但是不管我们点击多少次,按钮总是显示”清空“。

    为什么?

     

    因为每次把页面提交的时候,页面解析的结果都是将Button的Text属性设置为”提交“,第二次点击按钮时,按钮的Text属性显示的是”清空“,但是一旦页面提交后,页面还时按照第一次那样解析,并且初始化。按钮的Click事件还是发现Button的Text为”提交“。因为上次提交后,按钮的Text 属性-”清空“,没有保存(基于Http协议)。

 

    所以为了使得我们可以像 WinForm那样开发,为了使得达到我们想要的效果。ASP.NET中就采用了”保存状态“技术.

    4.保存状态技术

 

    其实也很简单,只是每次在页面回传的过程中,把上次的页面的所有设置的状态保存在一个表单字符串"_VIEWSTATE",中,具体是这样的,当页面回到客户端的时候,服务器就把页面中的控件的状态序列化为一个字符串,一同发给客户端,当客户端提交页面后,服务器就对提交的_VIEWSTATE解析,进行反序列化,然后根据反序列化的结果,恢复各个控件的状态,这样就得到到上次页面的状态。

    

    然后在页面的生命周期中,如果在控件的事件中有修改控件状态的代码,就在合适的时候引发,然后,再次更新_VIEWSTATE 的值。

    这样控件属性的持久化就完成了。

    所以我们在开发自定义控件的时候,常常要显示的生命控件属性的持久化。就是用ViewState.

阅读(736) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~