zoukankan      html  css  js  c++  java
  • [转摘CSDN_alexjames_83(ID)]ViewState的理解

    如果不注意ViewState会对应用带来很多不利的影响:
    - 泄漏重要的数据
    - ViewState攻击
    - 性能受影响
    - 应用程序不能扩展:如果用户会在每一次Postback的时候都加少50K的ViewState数据。。。
    - 影响整体设计

    ViewState干些啥:
    - 存值
    - 跟踪变化

    1. 保存键-值对,和Hash表一样用。
    ViewState是定义在System.Web.UI.Control上的一个protected property。服务器控件使用ViewState来保存大部分的属性。
    一个普通的Property可以如下实现,

    但对于ASP.net控件的属性,它们则使用ViewState的StateBag

    Default Value
    控件通常采用如下的方法来设定初始值

    2. 跟踪变化:
    可以通过调用System.Web.UI.Control.TrackViewState()来跟踪ViewState的变化。
    StateBag类提供了一些可以用来判读ViewState状态的方法
    IsItemDirty(string key); SetItemDirty(string key, bool value);
    注意:
    只有在TrackViewState开启之后的赋值才会被跟踪。
    每一次赋值会被跟踪,即使赋和原来一样的值。

    ?为什么要Track?而不是直接取ViewState值来比较?

    3 序列化和反序列化
    ViewState被存在一个名叫“_VIEWSTATE”的HiddenField中(地球人都知道)。base64编码的字符串。
    ASP.net的页面的空间层次结构(the hierarchy of controls)System.Web.UI.Control.SaveViewState。其实就是Call每个Control的ViewState的SaveViewState方法。对控件树中每个控件递归的调用这个方法就可以生成另一颗数据树。当这个方法返回的时候,ViewState就被序列化了。但是只有那些脏的ViewState才会被序列化。这就是为什么要有TrackViewState的原因。ASP.net页面在OnInit中调用TrackViewState,也就是在控件赋初始值之后。所以在页面中为控件赋值,无论赋什么值,ViewState的长度都不会变。

    4 自动恢复(Restores Data)数据
    LoadViewState返回一个object对象。这个LoadViewState也是调用StateBag类的方法。最终都是搞这个StateBag类。StateBag就用新的数据来重建键-值表。通过LoadViewState赋值的新的数据类型为System.Web.UI.Pair。Pair有两个值:First和Second。First是一个包含Keys的ArrayList,Second是包含Values的ArrayList。只有被表示为Dirty的那些数据才会通过LoadViewState被传入。

    让我们再回过头来看看整个页面的载入过程:
    页面Load时,首先将属性值赋为初始值。
    而后,在OnInit中,.net调用所有StateBags的TrackViewState方法
    接下来,LoadViewState()重载前一次调用的所有脏数据。StateBag.Add(key, Value)。因为此时已经开始TrackViewState(),所以这里载入的数据都被标记为脏,并将在下一次PostBack中被载入。ViewState就是这么回事儿。
  • 相关阅读:
    python Database Poll for SQL SERVER
    SQLAlchemy表操作和增删改查
    flask动态url规则
    flask配置管理
    一个Flask运行分析
    Function Set in OPEN CASCADE
    Happy New Year 2016
    Apply Newton Method to Find Extrema in OPEN CASCADE
    OPEN CASCADE Multiple Variable Function
    OPEN CASCADE Gauss Least Square
  • 原文地址:https://www.cnblogs.com/mishy/p/1458166.html
Copyright © 2011-2022 走看看