zoukankan      html  css  js  c++  java
  • 对.net中的ViewState的理解

    TRULY Understanding ViewState这篇关于ViewState的文章讲的很好,记录一下我读完后关于ViewState的理解。

    ViewState背后通过StateBag实现,StateBag类似HashTable功能,通过简直对记录控件属性。所不同的是,StateBag有记录属性是否被修改过的功能:被修改的属性被标记为Dirty

    对控件属性的修改,在TrackViewState调用前,不会被标记为Dirty,而在TrackViewState调用后,会被标记。而TrackViewState的调用是在页面的OnInit阶段,从子控件,一直到顶层的Page层层调用的。而这意味着,我们即使在Page的OnInit中初始化了控件的值,该值也会被ViewState Track

    ViewState在前台体现为一个Base编码的字符串,该字符串的内容,来源于被标记为Dirty的控件属性值的序列化结果。

    在PostBack操作中,ViewState被回传,而页面控件被修改的值,是在OnInit后、OnLoad前被加载的,这意味着:

    • 在OnInit中我们设置的值,不会覆盖页面的值
    • 在OnLoad中我们设置的值,会覆盖页面回传的值,因此如果想在OnLoad中初始化控件,而不希望覆盖用户设置的值,需要加上IsPostBack的判断。

    另外,如果不希望控件的值被存入ViewState,可以设置EnableViewState为false,这不会影响PostBack操作中用户设置的值回传。

    文章提到了几个常见的错误和更好的实践方式。

    1. 对于一些易于获取的轻量操作,比如初始化省市这样的下拉框,可以
    • 禁用ViewState节省网络开销
    • 将控件初始化放在OnInit中,这样不会覆盖PostBack值
    • 这会导致服务端初始化操作压力增加,但是会提高网络传输效率
    1. 当开发控件时,默认值不应该在OnLoad中,那样会覆盖预设值;正确的做法是,直接通过StateBag中是否存在Key来判断是否需要使用默认值
    2. 当空间被加入页面时,所有的页面事件也会依次在控件中触发(init, load, render等等),因此控件属性的初始值如果不想被记录在ViewState中,可以在控件加入也面前,设置属性值
  • 相关阅读:
    Binary Tree Maximum Path Sum
    ZigZag Conversion
    Longest Common Prefix
    Reverse Linked List II
    Populating Next Right Pointers in Each Node
    Populating Next Right Pointers in Each Node II
    Rotate List
    Path Sum II
    [Leetcode]-- Gray Code
    Subsets II
  • 原文地址:https://www.cnblogs.com/mosakashaka/p/12608830.html
Copyright © 2011-2022 走看看