LoadControl & ViewState чегото я не до понимаю
От: max314 Россия  
Дата: 28.04.05 06:06
Оценка:
hi, All!!!!

Предыстория:
Начал я писать простенькую реализацию MVC.
Контроллер должен грузить UserControl в главную страницу которая являеться шаблоном.
На методе Page_Load UserControl-а попытался считать/записать даные из модели наступил на грабли .
Результатом шишки на лбу стал тесторый проект.

Описание тестового проекта:
Есть UserControl1 сосотоящий из одного TextBox.
метод Page_Load ниже
        private void Page_Load(object sender, System.EventArgs e)
        {
            Response.Write(TextBox1.Text);
        }

Главная страница приложения содержит одну кнопку для поста,
UserControl1 вставленный в страницу в дизайн тайме и PlaceHolder для того
чтобы поместить туда Еще один экземпляр UserControla1 в рантайме.
Помещение контрола в рантайме происхрлдит в методе Page_Load главной страницы.
Вобщем то что прописал дохтур MSDN.
            Control c = LoadControl("WebUserControl1.ascx");
            c.ID = "Test";
            PlaceHolder1.Controls.Add(c);

Запускаемся. Первый постбак:
в результате на главной странице отображаеться только информация TextBox от юзер контрола
который был добавлен в среде в режиме дзайн тайма.
При повторном постбеке стало понятно что информация от созданного в рунтайм контрола запазывает на один постбак.
Покурил я немнога и сделал следующий финт ушами:
в юзер контроле навесил обработчик TextBox на изменение:
        private void TextCh(object sender, System.EventArgs e)
        {
            Response.Write("Event" + TextBox1.Text);
        }

При обработке этого сообщения для обоих юзер контролов textbox имеет "правильные"
с моей точки значения тоесть те что были введены (в не зависимости от повторности постбака).
методом научного тыка я выяснил то, что если код создания юзер контрола перенести из метода
страницы Page_Load в метод OnInit все начинает работать корректно .
начал я курить поиск на rsdn
надыбал http://www.rsdn.ru/Forum/?mid=551791
Автор: hellraiser
Дата: 26.02.04

долго читал многа думал .
покурил еще некоторое время http://www.15seconds.com/issue/020102.htm

отключил я в тестовом примере и для страницы и для юзерконтролов ViewState.
В HTML коде страницы поле VIEWSATE заметно сократилось но не исчезло совсем.
на функционировании примера практически ничего не изменилось.

Итак собственно вопросы (помогите утрясти информацию в систему):
1. Для чего нужен ViewStat.
2. Если я правильно понимаю и использую модель как хранилище данных
(на первой загрузке контрола считываю данные из модели на постбеке сохраняю в модель) мне ViewStat не нужен?
3. Почему если я отключил ViewState на странице и на контроле почему не исчезло поле name="__VIEWSTATE" из HTML кода страницы.
4. Почему если я загружаю в рантайме пользовательский контрол в методе Page_Load то у меня в пользовательском контроле на Page_Load-е свойства textbox-а не инициализированы, а если грузить пользовательский контрол в методе страницы OnInit — все нормально.
Кстати почему MSDN рекомендует грузить в Page_Load?
5. Почему вне зависимости от того где загружать пользовательский контрол при обработке сообщения TextBox TextBox1.TextChanged в обработчике уже находяться корректные данные. тоесть получаеться то что при pageLoad одно а в обработчике другое.

заранее спасибо за ответы
Re: LoadControl & ViewState чегото я не до понимаю
От: Козьма Прутков Россия  
Дата: 28.04.05 08:46
Оценка:
> Итак собственно вопросы (помогите утрясти информацию в систему):
> 1. Для чего нужен ViewStat.
для того, чтобы хранить состояние страницы между постбеками.
> 4. Почему если я загружаю в рантайме пользовательский контрол в методе Page_Load то у меня в пользовательском контроле на Page_Load-е свойства textbox-а не инициализированы, а если грузить пользовательский контрол в методе страницы OnInit — все нормально.
> 5. Почему вне зависимости от того где загружать пользовательский контрол при обработке сообщения TextBox TextBox1.TextChanged в обработчике уже находяться корректные данные. тоесть получаеться то что при pageLoad одно а в обработчике другое.
а вот тут давайте обсудим. Вот код из класса Page (покоцаный):
private void ProcessRequestMain()
{
      try
      {
            this._requestValueCollection = this.DeterminePostBackMode();
            HttpContext context1 = this.Context;
            base.InitRecursive(null); //тут возникает событие Init
            if (this.IsPostBack)
            {
                  this.LoadPageViewState();
                  this.ProcessPostData(this._requestValueCollection, true); // тут обрабатываются данные, пришедшие в запросе
            }
            base.LoadRecursive(); // тут событие Load
            if (this.IsPostBack)
            {
                  this.ProcessPostData(this._leftoverPostData, false); // тут обрабатываются данные, пришедшие в запросе
                  this.RaiseChangedEvents(); // тут возникают события об изменившихся данных
                  this.RaisePostBackEvent(this._requestValueCollection);
            }
            base.PreRenderRecursiveInternal();
            this.SavePageViewState();
            base.RenderControl(this.CreateHtmlTextWriter(this.Response.Output));
      }
      catch ...
}

Итого имеем, что данные пришедшего запроса грузятся дважды: между Init и Load, а оставшиеся между Load и RaiseChangedEvents.
Теперь твоя ситуация. Ты в Load создаешь и добавляешь контрол, и сразу же требуешь от него данные. В нем пока данные из его ViewState'а (это происходит при добавлении контрола в коллекцию Controls). А пришедшие в запросе в него будут засунуты только после Load. Аналогично, если ты добавил контрол в Init'е, то они к Load'у в нем уже появятся. Вот собсно и все.
Posted via RSDN NNTP Server 1.9
Да хранит вас господь в сухом прохладном месте...
LoadControl & ViewState чегото я не до понимаю
От: Аноним  
Дата: 28.04.05 08:47
Оценка:
Вообще-то было бы неплохо понимать модель выполнения и жизненный цикл страницы. Тогда и вопросов никаких небыло

http://blogs.gotdotnet.ru/personal/ceo/PermaLink.aspx?guid=761324d0-69b5-4717-af85-becccfb4c8dc

http://www.uneta.org/Default.aspx?mnuid=B76FB6BE-2CBA-45D8-85D8-6FD850A1FA5D&artID=0309B614-9525-4716-BAC2-1A8B00F8A21B

http://www.uneta.org/Default.aspx?mnuid=781AC47F-3663-4001-B91A-560AD52508E0
-------------------------------------------------------
I can only show you the door.
You have to walk through it.
(c) Morpheus
-------------------------------------------------------
Ukraine .Net Alliance
Украинское сообщество .Net разработчиков
Заметки


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: LoadControl & ViewState чегото я не до понимаю
От: mogadanez Чехия  
Дата: 28.04.05 08:51
Оценка:
M>Итак собственно вопросы (помогите утрясти информацию в систему):
M>1. Для чего нужен ViewStat.
для хранения состояния

M>2. Если я правильно понимаю и использую модель как хранилище данных

M>(на первой загрузке контрола считываю данные из модели на постбеке сохраняю в модель) мне ViewStat не нужен?

в некоторых контролах, например Гриде, не работают события при отключеном стейте

M>3. Почему если я отключил ViewState на странице и на контроле почему не исчезло поле name="__VIEWSTATE" из HTML кода страницы.

By Design... к микрософту. там миниму один триплет хранится всегда.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.