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 одно а в обработчике другое.
заранее спасибо за ответы
> Итак собственно вопросы (помогите утрясти информацию в систему):
> 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
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>>