Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отличия EnableViewState и IsTrackingViewState 
:(
    Опции темы
Idsa
Дата 7.7.2007, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Подскажите, чем отличается EnableViewState от IsTrackingViewState.

Вот их описания из MSDN:
Цитата

EnableViewState:
Gets or sets a value indicating whether the server control persists its view state, and the view state of any child controls it contains, to the requesting client. 

IsTrackingViewState:
Gets a value that indicates whether the server control is saving changes to its view state. 



--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Idsa
Дата 7.7.2007, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Вроде бы сам разобрался...

EnableViewState указывает, следует ли сохранять значения данного объекта во ViewState. IsTrackingViewState указывает был ли вызван метод TrackViewState, т. е. была ли записана информация во ViewState на самом деле.
IsTrackingViewState зависит от EnableViewState. Если EnableViewState равен false, то и IsTrackingViewState будет равен false. Если же EnableViewState равен true, то IsTrackingViewState может быть равен и true, и false. Так, например, до вызова smth.Controls.Add(dynamicControl) у объекта dynamicControl IsTrackingViewState будет равен false, после вызова - true.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Mymik
Дата 7.7.2007, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1474
Регистрация: 12.5.2006
Где: Lamer-центер

Репутация: 50
Всего: 78



EnableViewState обеспечивает сохранение и устанавливает IsTrackingViewState  в true. И когда он впоследствии загружает эти данные, то он спросит по IsTrackingViewState загружать/сохранять из или нет.


--------------------
ICQ ::            857-857
E-mail ::         mymik[at]inbox[dot]ru 
HomaPage ::  http://localhost/

:to_become_senile  :this
PM MAIL WWW ICQ   Вверх
Idsa
Дата 7.7.2007, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Mymik, не совсем так.

Цитата(Mymik @  7.7.2007,  16:25 Найти цитируемый пост)
EnableViewState обеспечивает сохранение и устанавливает IsTrackingViewState  в true.

EnableViewState не устанавливает IsTrackingViewState.
Если EnableViewState равен true, то в процессе вызова TrackViewState() устанавливается IsTrackingViewState. Именно поэтому при создании динамических компонентов после этапа десериализации ViewState изменения свойств компонента записываются во ViewState только после добавления его в Controls (т. к. Controls.Add() вызывает Track ViewState).


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
tol05
Дата 7.7.2007, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 34
Всего: 170



Idsa, главное отличие в том, что EnableViewState - это public, а IsTrackingViewState - protected. Для стандартного TextBox-а, например, ты сможешь только EnableViewState использовать. Когда ты страницу разрабатываешь (такой же в принципе контрол, как и другие), то это незаметно, поскольку тебе доступны и public и protected члены. Но когда ты покупной контрол используешь, то только public. Вывод: EnableViewState - для юзания, а IsTrackingViewState - для разработчиков контролов, т.е. для записи в ViewState твоей информации, как разработчика контрола.

Я еще сам не до конца все понял... Но на данный момент, больше согласен с Idsa, чем с Mymik. Нагуглил такой диалог:
Вопрос: "Now I am confused by FpSpread1.ActiveSheetView.IsTrackingViewState and EnableViewState property of SFW control. What's the relation between them? 
I tried to set FpSpread1.ActiveSheetView.IsTrackingViewState as False and EnableViewState as true, paging is not working(basically return an empty sheet when navigating pages)"
Ответ: "Setting IsTrackingViewState to false prevents the current view models being saved.  So even if you had EnableViewState set to true you would get the same behavior as if you had it set to false."

Ну а теперь по тому, что раскопал Idsa:
Цитата(Idsa @  7.7.2007,  16:14 Найти цитируемый пост)
 IsTrackingViewState указывает был ли вызван метод TrackViewState, т. е. была ли записана информация во ViewState на самом деле.
А что тогда делает метод SaveViewState()? Записывает "понарошку"?   smile 

Допустим, говорим только о странице. В процесе инициализации страницы (ProcessRequest->ProcessRequestMain-> this.InitRecursive->) последней операцией идет вызов  this.TrackViewState(). И если внутренняя коллеция состояния _viewstate != null, то для нее вызывается  _viewstate.TrackViewState(), где (весьма хитрым способом, однако!) устанавливается IsTrackingViewState.
А LoadViewState (она вызывается только если запрос - постбек) и SaveViewState (вызывается всегда и проверяет только _viewState) работают сами по себе и независимо ни от чего. Их вызовы в ProcessRequest происходят... 

Для чего вся эта карусель? Да просто чтобы минимизировать размеры ViewState, гоняемого туда-сюда. Состояние элемента в ViewState можно записывать только после определенного момента. Поскольку это состояние может за цикл обработки страницы поменяться несколько раз (при создании элемента, его инициализации после создания), то среда ASP.NET разрешает реально сохранять состояние элемента после окончания всей инициализации(вернее, ее самым последним действием)
Таким образом ты, время от времени опрашивая IsTrackingViewState, узнаешь, включен ли трекинг ViewState в данный момент, или нет. Если ты убедился, что IsTrackingViewState=true, то все, что ты с этого момента будешь ручками писать в ViewState, будет в нем гарантированно сохранено.

вот еще интересный пример


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Idsa
Дата 8.7.2007, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Цитата(tol05 @  7.7.2007,  21:20 Найти цитируемый пост)
А что тогда делает метод SaveViewState()? Записывает "понарошку"?

Я имел в виду, что EnableViewState - лишь отражает намерение сохранять ViewState, а IsTrackingViewState констатирует факт, сохраняется ли ViewState. Это особенно четко прослеживается при создании динамических контролов. Но это все следствия. Причина же ниже.

Есть очень хорошая статья про ViewState. Я приведу интересную цитату оттуда:

Цитата

But you might wonder why StateBag would need this ability in the first place. Why on earth would anyone need to know only changes since TrackViewState() is called? Why wouldn't they just utilize the entire collection of items? This one point seems to be at the core of all the confusion on ViewState. I have interviewed many professionals, sometimes with years and years of ASP.NET experience logged in their resumes, who have failed miserably to prove to me that they understand this point. Actually, I have never interviewed a single candidate who has! First, to truly understand why Tracking is needed, you will need to understand a little bit about how ASP.NET sets up declarative controls. Declarative controls are controls that are defined in your ASPX or ASCX form. Here: 

<asp:Label id="lbl1" runat="server" Text="Hello World" />

I do declare that this label is declared on your form. The next thing we need to make sure you understand is ASP.NET's ability to wire up declared attributes to control properties. When ASP.NET parses the form, and finds a tag with runat=server, it creates an instance of the specified control. The variable name it assigns the instance to is based on the ID you assigned it (by the way, many don't realize that you don't have to give a control an ID at all, ASP.NET will use an automatically generated ID. Not specifying an ID has advantages, but that is a different subject). But that's not all it does. The control's tag may contain a bunch of attributes on it. In our label example up above, we have a "Text" attribute, and it's value is "Hello World". Using reflection, ASP.NET is able to detect whether the control has property by that name, and if so, sets its value to the declared value. Obviously the attribute is declared as a string (hey, its stored in a text file after all), so if the property it maps to isn't of type string, it must figure out how to convert the given string into the correct type, before calling the property setter. How it does that my friend is also an entirely different topic (it involves TypeConverters and static Parse methods). Suffice it to say it figures it out, and calls the property setter with the converted value.

Recall that all-important statement from the first role of the StateBag. Here it is again: Server Controls utilize ViewState as the backing store for most, if not all their properties. That means when you declare an attribute on a server control, that value is usually ultimately stored as an entry in that control's ViewState StateBag. Now recall how tracking works. Remember that if the StateBag is "tracking", then setting a value to it will mark that item as dirty. If it isn't tracking, it won't be marked dirty. So the question is -- when ASP.NET calls the SET on the PROPERTY that corresponds to the ATTRIBUTE that is DECLARED on the control, is the StateBag TRACKING or isn't it? The answer is no it is not tracking, because tracking doesn't begin until someone calls TrackViewState() on the StateBag, and ASP.NET does that during the OnInit phase of the page/control lifecycle. This little trick ASP.NET uses to populate properties allows it to easily detect the difference between a declaratively set value and dynamically set value.


Если кого-то смущает обилие буржуйских буков smile, кратко изложу суть дела. Нагромождение в виде IsTrackingViewState и EnableViewState необходимо для корректной обработки значений по умолчанию для элементов управления во время разработки. Происходит присвоение значений по умолчанию, вызов TrackViewState(), десериализация ViewState и присвоение значений согласно инфомрации из ViewState. Таким образом, значения по умолчанию не "загрязняют" (dirty) ViewState.

Единственное, что меня смущает, так это, каким же образом происходит обращение к ViewState и TrackViewState(), ведь оба они объявлены как protected. Видимо, это происходит скрыто через public свойства и методы... но, честно говоря, в Рефлекторе я этого не отрыл.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
tol05
Дата 8.7.2007, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 34
Всего: 170



М-да, пальцастый чел, этот автор статьи.... 
Цитата

I have interviewed many professionals, sometimes with years and years of ASP.NET experience logged in their resumes, who have failed miserably to prove to me that they understand this point.
 "как чуваки мучались, пока меня не встретили!!! Да, повезло им, несказанно повезло. А вот теперь, счастливчики, и вам повезло, что надыбали где-то мою статью..."  smile Ну ладно...
Цитата(Idsa @  8.7.2007,  17:13 Найти цитируемый пост)
Нагромождение в виде IsTrackingViewState и EnableViewState
Никакого нагромождения нет все ясно, четко и нужно. Все очень стройно и логично. Смотри:
1. Получили самый первый запрос. Проходим инициализацию страницы. В Init страницы она вызывает Init своих контролов, те - своих . Т.е. идет рекурсия. Но в ViewState ничего не сохраняется еще. Да и зачем? Вот работает изначальный базовый конструктор. Он может установить какое-то первичное состояние страницы. Потом анализируется твой конструктор страницы. Вот и изменили состояние. Теперь смотрим что в PreInit страницы написано. Новое состояние. Представь себе, что было бы, если бы каждый раз что-то в ViewState писалось? А есть еще сотни контролов страницы, которые тоже хотят свое состояние писать... И вообще, зачем каждый раз писать в ViewState то, что захардкодано в разметке страницы, в ее CodeBehind? Это и так (при каждом запросе) будет опять отработано вначале инициализации.
Поэтому только после включения треккинга ViewState можно гарантированно писать во ViewState. А IsTrackingViewState как раз и говорит :"да, треккинг включен, теперь писать можно!" Вот и все. С момента включения треккинга все заносимые в ViewState помечаются как Ditry и именно эти, "грязные", данные в итоге и запишутся. Треккинг включается вызовом TrackViewState() перед самым выходом из Init. (рефлектор: Page.ProcessRequest(), ну и дальше - ProcessRequestMain()-> this.InitRecursive()). Для контролов - рекурсивно тоже треккинг включается.
До включения треккинга данные, заносимые в ViewState, получают Ditry=false, при включенном треккинге - Ditry=true; (рефлектор: StateBag.Add()). Все, прошли инициализацию и включили треккинг. Записываем в ViewState что хотим, в любом месте конвейера обработки...

При получении первого запроса ViewState еще нет. Поэтому, если не постбек, то LoadViewState() не вызывается (ProcessRequest. if(!IsPostBack), то LoadAllState() не вызывается). Идем дальше. Перед рендерингом вызываем SaveViewState() записываем все, что у нас накопилось в ViewState, а при следующем запросе (постбеке) уже вызываем LoadViewState().
И все это работает так всегда, одинаково... А смысл в EnableViewState - только в том, что его значение используется в методе SetEnableViewStateInternal(). Устанавливается флаг (flags[4]) и потом он анализируется в SaveViewStateRecursive(). Одним словом, если EnableViewState=false, то мы сразу из SaveViewState() вывалимся, ничего не запишем. А при следующем конвейере - ничего не прочтем (а нету ничего потому что  smile ). Но все функции, все вызовы, все равно будут выполняться в том порядке, что я описал.

"каким же образом происходит обращение к ViewState и TrackViewState(), ведь оба они объявлены как protected"
Обращение к TrackViewState() - только внутри контрола. Ты, разрабатывая свой контрол, или страницу, можешь вызвать TrackViewState(). А для стандартных контролов - нет. Это же естественно. Можешь сделай свой класс, наследник контрола, и вызывать.
EnableViewState - public. Ты с ним работаешь или программно (это свойство) или как атрибут страницы (или контрола).
Тут - никаких препятсвий. Ну, вроде все...  smile 


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Idsa
Дата 8.7.2007, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Цитата(tol05 @  8.7.2007,  22:28 Найти цитируемый пост)
Никакого нагромождения нет все ясно, четко и нужно. Все очень стройно и логично. Смотри: ...

Хм... Ну и зачем ты выложил дословный перевод цитаты, которую я привел выше? smile Нипанятна... :(.

Цитата(tol05 @  8.7.2007,  22:28 Найти цитируемый пост)
Обращение к TrackViewState() - только внутри контрола. Ты, разрабатывая свой контрол, или страницу, можешь вызвать TrackViewState(). А для стандартных контролов - нет. Это же естественно. Можешь сделай свой класс, наследник контрола, и вызывать.

У меня вызвал вопрос не механизм работы с protected методами, а то, где же вызывается метод TrackViewState в коде (т. е. через какой public-метод).




--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
tol05
Дата 8.7.2007, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 34
Всего: 170



Цитата(Idsa @  8.7.2007,  23:00 Найти цитируемый пост)
где же вызывается метод TrackViewState в коде

он вызывается в событии Init внутри класса, а ты его можешь вызвать, обратившись к ViewState или вызвав Controls.Add();
Цитата(Idsa @  7.7.2007,  17:36 Найти цитируемый пост)
(т. к. Controls.Add() вызывает Track ViewState).


Цитата(Idsa @  8.7.2007,  23:00 Найти цитируемый пост)
Хм... Ну и зачем ты выложил дословный перевод цитаты, которую я привел выше? 

???????
Я с головы писал, с рефлектором пол-дня просидел. ТВОЮ СТАТЬЮ Я НЕ ЧИТАЛ (как прочел ту убойную фразу, так и с наслаждением плюнул на нее)!!!!!!!
Если честно, то я счас просто в шоке.... :( 
Одно только радует: значит я разобрался в вопросе... А ты, Idsa,  - нет...


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Idsa
Дата 9.7.2007, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Цитата(tol05 @  8.7.2007,  23:44 Найти цитируемый пост)
(т. к. Controls.Add() вызывает Track ViewState).

Тебя смущает эта фраза? Зря. При добавлении динамического контролла, например, в Load, он заново "проживает" инициализацию, в процессе которой происходит вызов TrackViewState.
Таким образом, динамический контролл будет сохранять свои значения во ViewState только после добавления его в Controls.

Цитата(tol05 @  8.7.2007,  23:44 Найти цитируемый пост)
Хм... Ну и зачем ты выложил дословный перевод цитаты, которую я привел выше? ???????Я с головы писал, с рефлектором пол-дня просидел. ТВОЮ СТАТЬЮ Я НЕ ЧИТАЛ

Да уж... Я привел отрывок из статьи, в котором все объясняется. Ты же отказался его читать, привел свое объяснение, которое совпадается с авторским... и удивлен, моей фразой? Ну чего тут удивляться-то? Ты же ее не прочитал, а я прочитал. Вот и вся разница.

Цитата(tol05 @  8.7.2007,  23:44 Найти цитируемый пост)
Одно только радует: значит я разобрался в вопросе... А ты, Idsa,  - нет...

Ну это еще полбеды. Так тебе хватает наглости (не прочитав цитату) утверждать, что я не понял сути. Аргументы в студию.
А вообще мое отношение к такому подходу (видеть и слышать только самого себя; tol05, не первый раз за тобой такой грешок) можно было бы выразить одним словом... да вот цензура не дремлет.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
tol05
Дата 9.7.2007, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 34
Всего: 170



Мои грешки оставь мне. 

Я действительно считаю, что ты еще не разобрался в теме. После всех постов и статей ты задаешь вопрос  
Цитата(Idsa @  8.7.2007,  17:13 Найти цитируемый пост)
Единственное, что меня смущает, так это, каким же образом происходит обращение к ViewState и TrackViewState(), ведь оба они объявлены как protected. 

Это что означает??? После всех-то постов, после всех-то статей?

P.S. Ну а почему я утверждаю, что сам понял? Да просто потому, что написал, как ты считаешь, слово в слово с тем, что написал автор твоей статьи. По-моему, это Аргументы

 ! 
Mymik
Остынь.

Модератор: Дальнейшее выяснение отношений карается минусом в репу и бананом на неделю

Это сообщение отредактировал(а) Mymik - 9.7.2007, 13:45


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Любитель
Mymik
mr.DUDA

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Любитель, Mymik, mr.DUDA.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка под ASP.NET | Следующая тема »


 




[ Время генерации скрипта: 0.0523 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.