Na semana passada escrevi um artigo "Onde é salvo o valor da propriedade ViewState do controle?" Ele explicou que Control.ViewState é acessado por meio dos dois métodos Control.SaveViewState e Control.LoadViewState. Há uma frase no artigo que pode deixá-lo confuso: "Quando usamos this.ViewState[key] para ler e escrever após OnInit, esta propriedade é verdadeira", onde "esta propriedade" se refere a StateItem.IsDirty. Por que a propriedade IsDirty é sempre verdadeira após OnInit? Depois de me referir a VERDADEIRAMENTE Entendendo o ViewState, finalmente entendi que nem sempre é verdade. Por favor, ouça-me explicar os motivos detalhados.
A primeira coisa que você precisa observar é o método StateBag.TrackViewState. Este método será chamado quando o controle OnInit. Sua função é permitir que StateBag comece a rastrear alterações em StateItem. . Ou seja, antes de OnInit, a propriedade IsDirty é falsa e não importa como você defina o valor da propriedade Value, a propriedade IsDirty não será alterada. Após OnInit, a propriedade IsDirty também permanece falsa até que você altere o valor da propriedade Value pela primeira vez (referente à alteração através do método this.ViewState[key]). No estágio SaveViewState, apenas StateItems cujo atributo IsDirty for verdadeiro serão salvos.
Por que foi projetado dessa maneira? Por exemplo, à propriedade Text de um rótulo definida declarativamente é atribuído um valor inicial em ASPX e, em seguida, o valor inicial é naturalmente persistido por meio de ViewState["Text"]. No próximo ciclo de vida da página, primeiro a propriedade Text deste Label carregará o valor inicial definido declarativamente em ASPX durante OnInit e, em seguida, sobrescrevê-lo-á com ViewState["Text"] lido de ViewState durante LoadViewState. No entanto, a menos que você altere programaticamente a propriedade Text no ciclo de vida da página anterior, ViewState["Text"] ainda é o valor inicial, então você usa ViewState["Text"] para salvar o valor inicial para substituir o valor inicial definido declarativamente. não faz sentido substituir o mesmo valor dessa maneira e também desperdiça espaço do ViewState. Para resolver este problema de desperdício de recursos, qualquer valor que não tenha sido alterado após a definição declarativa não deve ser persistido usando ViewState, e a implementação detalhada é o mecanismo TrackViewState mencionado acima.
Falando nisso, Control.ViewState foi explicado. Se você é um designer de controle, pode armazenar com segurança propriedades de controle em ViewState das seguintes maneiras:
string pública Texto
{
obtenha {return this.ViewState["Texto"] como string;}
definir {this.ViewState["Texto"] = valor;}
}
Seu mecanismo interno saberá distinguir se o valor que você salva é o valor inicial definido declarativamente no ASPX e então decidirá se deseja persistir o valor. Ao mesmo tempo, se você quiser alterar a determinação se um valor ViewState é persistente em qualquer estágio, poderá alterá-lo por meio de ViewState.SetItemDirty(key, dirty), que basicamente atende às necessidades de todos os desenvolvedores de controle.
http://www.cnblogs.com/cathsfz/archive/2006/10/29/543695.html