zoukankan      html  css  js  c++  java
  • 在页面生命周期执行时 Page 对象在 SaveState 阶段都发生了什么事?

    先看下 SaveViewState 的源码:

     1 // Answer any state this control or its descendants want to save on freeze.
     2         // The format for saving is Triplet(myState, ArrayList childIDs, ArrayList childStates),
     3         // where myState or childStates and childIDs may be null.
     4         internal object SaveViewStateRecursive() { 
     5            if (flags[disableViewState])
     6                 return null; 
     7  
     8           object adapterState = null;
     9            if (_adapter != null) { 
    10                 adapterState = _adapter.SaveAdapterViewState();
    11             }
    12 
    13             object controlSavedState = SaveViewState(); 
    14 
    15            ArrayList childStates = null; 
    16             if (HasControls()) { 
    17               ControlCollection occasionalFieldControls = _occasionalFields.Controls;
    18                int occasionalFieldControlCount = occasionalFieldControls.Count; 
    19 
    20               bool useId = LoadViewStateByID;
    21                for (int i = 0; i < occasionalFieldControlCount; i++) {
    22                     Control child = occasionalFieldControls[i]; 
    23                     object childState = child.SaveViewStateRecursive();
    24                     if (childState != null) { 
    25                       if (childStates == null) { 
    26                            childStates = new ArrayList(occasionalFieldControlCount);
    27                         } 
    28 
    29                        if (useId) {
    30                           child.EnsureID();
    31                             childStates.Add(child.ID); 
    32                        }
    33                        else { 
    34                             childStates.Add(i); 
    35                       }
    36                         childStates.Add(childState); 
    37                    }
    38                 }
    39            }
    40  
    41             if (_adapter != null) {
    42                 if ((controlSavedState != null) || (adapterState != null) || (childStates != null)) { 
    43                    return new Triplet(controlSavedState, adapterState, childStates); 
    44                 }
    45             } 
    46            else {
    47                 if ((controlSavedState != null) || (childStates != null)) {
    48                    return new Pair(controlSavedState, childStates);
    49                } 
    50           }
    51  
    52             return null; 
    53        }
    SaveViewState

    从上面的源码可以看出当页面运行至 SaveState 阶段时,将调用其自身 SaveAllState() 方法,在这个方法内部,做了两件事,第一件事就是保存控件状态,即ControlState,第二件事就是保存控件视图状态,即ViewState。ControlState我们放到以后再说,今天说说ViewState,在SaveAllState()这个方法内部,调用控件的SaveViewStateRecursive()方法,在这个方法的内部,调用控件的SaveViewState方法

    页面到 SaveState 阶段时,会调用自身 SaveAllState() 方法并且在这个方法内部执行两个动作:保存控件状态 (ControlState) 和保存控件视图状态 (ViewState) 。 ControlState 等后面有时间再跟大家分享下,今天主要聊下 ViewState ,在 SaveAllState() 这个方法内部调用控件的 SaveViewStateRecursive() 方法,并且在这个方法内部再去调用 SaveViewState 方法。

    Line 5:比较值得注意,平常在设置 ASP.NET 前台页面会经常去接触 EnableViewState 属性,而 flags[disableViewState] 是与 EnableViewState  相对应的。从这里是不是已经 get 到什么了呢?

    if (flags[disableViewState])

    最后简单写个示例,来看看页面是如何递归保存其内部控件的视图状态:

    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>Xudaxia.ViewState.Test</title>
    </head>
    <body>
        <form id="form1" runat="server">
            <div>
                <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
            </div>
        </form>
    </body>
    </html>

    上面这个结构就不多说了,来看看这个页面对应的控件树:

  • 相关阅读:
    【软件测试】3.深入了解软件测试基础day3
    【软件测试】3.深入了解软件测试基础day2
    【软件测试】3.深入了解软件测试基础day1
    【软件测试】3.Linux介绍、命令
    【软件测试】1.软件测试前置基础知识
    玩转数据结构:第8章 优先队列和堆
    一、VIP课程:互联网工程专题 05-快速掌握Jenkins原理与核心功能
    Sublime 一些常用快捷键
    前端01 HTML5
    ios 故事版
  • 原文地址:https://www.cnblogs.com/byvar/p/5962886.html
Copyright © 2011-2022 走看看