La semana pasada escribí un artículo "¿Dónde se guarda el valor de la propiedad ViewState del control?" Explicaba que, en última instancia, se accede a Control.ViewState a través de los dos métodos Control.SaveViewState y Control.LoadViewState. Hay una oración en el artículo que puede confundirlo: "Cuando usamos this.ViewState [clave] para leer y escribir después de OnInit, esta propiedad es verdadera", donde "esta propiedad" se refiere a StateItem.IsDirty. ¿Por qué la propiedad IsDirty siempre es verdadera después de OnInit? Después de consultar TRULY Understanding ViewState, finalmente entendí que no siempre es cierto. Escúchame explicar las razones detalladas.
Lo primero que debe mirar es el método StateBag.TrackViewState. Este método se llamará cuando el control OnInit. Su función es permitir que StateBag comience a rastrear los cambios en StateItem. Cualquier cambio hará que la propiedad IsDirty de StateItem se vuelva verdadera. . Es decir, antes de OnInit, la propiedad IsDirty es falsa y no importa cómo establezca el valor de la propiedad Value, la propiedad IsDirty no se cambiará. Después de OnInit, la propiedad IsDirty también permanece falsa hasta que cambia el valor de la propiedad Value por primera vez (refiriéndose al cambio a través del método this.ViewState[key]). En la etapa SaveViewState, solo se guardarán los StateItems cuyo atributo IsDirty sea verdadero.
¿Por qué está diseñado de esta manera? Por ejemplo, a la propiedad Texto de una etiqueta definida de forma declarativa se le asigna un valor inicial en ASPX, y luego el valor inicial persiste naturalmente a través de ViewState["Texto"]. En el siguiente ciclo de vida de la página, primero la propiedad Texto de esta Etiqueta cargará el valor inicial definido declarativamente en ASPX durante OnInit y luego lo sobrescribirá con ViewState["Text"] leído desde ViewState durante LoadViewState. Sin embargo, a menos que haya cambiado mediante programación la propiedad Texto en el ciclo de vida de la página anterior, ViewState["Text"] sigue siendo el valor inicial, por lo que usa ViewState["Text"] para guardar el valor inicial y sobrescribir el valor inicial definido declarativamente. No tiene ningún sentido sobrescribir el mismo valor de esta manera y también desperdicia espacio de ViewState. Para resolver este problema de desperdicio de recursos, cualquier valor que no se haya cambiado después de la definición declarativa no debe persistir usando ViewState, y la implementación detallada es el mecanismo TrackViewState mencionado anteriormente.
Hablando de eso, se ha explicado Control.ViewState. Si es diseñador de controles, puede almacenar de forma segura las propiedades de control en ViewState de las siguientes maneras:
Texto de cadena pública
{
obtener {return this.ViewState["Text"] como cadena;}
establecer {this.ViewState["Texto"] = valor;}
}
Su mecanismo interno sabrá cómo distinguir si el valor que guarda es el valor inicial definido declarativamente en ASPX y luego decidirá si persiste el valor. Al mismo tiempo, si desea cambiar la determinación de si un valor de ViewState es persistente en cualquier etapa, puede cambiarlo a través de ViewState.SetItemDirty (clave, sucio), que básicamente satisface las necesidades de todos los desarrolladores de controles.
http://www.cnblogs.com/cathsfz/archive/2006/10/29/543695.html