На прошлой неделе я написал статью «Где сохраняется значение свойства элемента управления ViewState?» В ней объясняется, что доступ к Control.ViewState в конечном итоге осуществляется через два метода Control.SaveViewState и Control.LoadViewState. В статье есть предложение, которое может вас смутить: «Когда мы используем this.ViewState[key] для чтения и записи после OnInit, это свойство имеет значение true», где «это свойство» относится к StateItem.IsDirty. Почему свойство IsDirty всегда истинно после OnInit? После обращения к ДЕЙСТВИТЕЛЬНО пониманию ViewState, я наконец понял, что это не всегда так. Пожалуйста, послушайте, как я объясню подробные причины.
Первое, на что вам нужно обратить внимание, — это метод StateBag.TrackViewState. Этот метод будет вызываться при включении элемента управления. Его функция — позволить StateBag начать отслеживать изменения в StateItem. Любые изменения приведут к тому, что свойство IsDirty StateItem станет истинным. . То есть до OnInit свойство IsDirty имеет значение false, и как бы вы ни установили значение свойства Value, свойство IsDirty не будет изменено. После OnInit свойство IsDirty также остается ложным до тех пор, пока вы не измените значение свойства Value в первый раз (имеется в виду изменение с помощью метода this.ViewState[key]). На этапе SaveViewState будут сохранены только StateItems, у которых атрибут IsDirty имеет значение true.
Почему он спроектирован таким образом? Например, свойству Text метки, определенному декларативно, присваивается начальное значение в ASPX, а затем это начальное значение естественным образом сохраняется через ViewState["Text"]. В следующем жизненном цикле страницы сначала свойство Text этой метки загрузит начальное значение, декларативно определенное в ASPX во время OnInit, а затем перезапишет его с помощью ViewState["Text"], прочитанного из ViewState во время LoadViewState. Однако, если вы программно не изменили свойство Text в предыдущем жизненном цикле страницы, ViewState["Text"] по-прежнему является начальным значением, поэтому вы используете ViewState["Text"] для сохранения начального значения, чтобы перезаписать декларативно определенное начальное значение. совершенно бессмысленно перезаписывать одно и то же значение таким образом, а также тратится пространство ViewState. Чтобы решить эту проблему нерационального использования ресурсов, любое значение, которое не было изменено после декларативного определения, не должно сохраняться с помощью ViewState, а детальной реализацией является механизм TrackViewState, упомянутый выше.
Кстати, о Control.ViewState было объяснено. Если вы разработчик элементов управления, вы можете безопасно хранить свойства элемента управления в ViewState следующими способами:
общедоступная строка Текст
{
получить {вернуть this.ViewState["Текст"] как строку;}
установите {this.ViewState["Text"] = значение;}
}
Его внутренний механизм будет знать, как определить, является ли сохраняемое вами значение исходным значением, декларативно определенным в ASPX, а затем решить, следует ли сохранять это значение. В то же время, если вы хотите изменить определение того, является ли значение ViewState постоянным на каком-либо этапе, вы можете изменить его с помощью ViewState.SetItemDirty(key,грязный), что в основном отвечает потребностям всех разработчиков элементов управления.
http://www.cnblogs.com/cathsfz/archive/2006/10/29/543695.html