Жизненный цикл контролов ASP.NET
От: polyvox  
Дата: 12.02.08 13:52
Оценка:
У меня есть 2 кнопки, добавленные на страницу динамически. Я хочу, чтобы при нажатии на первую кнопку на страницу добавлялся user control типа A, при нажатии на вторую — user control типа B. Однако, я столкнулся со следующим противоречием:

1. Я не могу добавлять user control в OnLoad страницы, т.к. в этот момент я еще не знаю, на какую кнопку нажал пользователь (обработка событий произойдет после OnLoad).

2. Также я не могу добавлять user control после обработки событий (например, в OnPreRender), т.к. в этом случае у дочерних контролов моего user control не будут срабатывать обработчики событий (потому что этих дочерних контролов на момент обработки событий еще нет — они будут добавлены только в OnPreRender).

Я нашел 2 способа решить эту проблему:

1. Я могу вручную разбирать коллекцию Request.Form (параметры постбэка из http-запроса), чтобы определить, кто инициировал событие (в данном случае — нажатую кнопку) и создать нужный user control.

2. Я могу добавлять user control в OnLoad в соответствии с предыдущим состоянием страницы, а потом, если сработает обработчик клика на кнопку, удалять неправильный user control и добавлять правильный.

Оба способа плохи по разным причинам. Есть ли какие-то другие способы корректно решить проблему? Возможно, я чего-то принципиально не понимаю?
Re: Жизненный цикл контролов ASP.NET
От: Овощ http://www.google.com
Дата: 12.02.08 14:07
Оценка:
Добавьте оба контрола на страницу статически (в aspx-разметке), а в обработчиках кнопок просто выставляйте им свойство Visible в соответствующее значение. Это самый простой вариант.
Re[2]: Жизненный цикл контролов ASP.NET
От: Аноним  
Дата: 12.02.08 14:35
Оценка:
Проблема в том, что в общем случае у меня этих user контролов много, и если сделать так, то получается полная каша. К тому же логика их инициализации довольно тяжелая, и в таком случае, ее придется выносить из стандартных обработчиков контролов, что не очень удобно.
Re: Жизненный цикл контролов ASP.NET
От: mogadanez Чехия  
Дата: 12.02.08 16:08
Оценка:
Здравствуйте, polyvox, Вы писали:

P>Оба способа плохи по разным причинам. Есть ли какие-то другие способы корректно решить проблему? Возможно, я чего-то принципиально не понимаю?


Уйти на MonoRail или ASP.NET MVC
там Жизненый цикл контролов вырожденый и событий у них просто нет, соотвественно не нужно пересоздавать контролы, Actions контроллера вызываются всегда первыми.
Re[2]: Жизненный цикл контролов ASP.NET
От: polyvox  
Дата: 12.02.08 16:40
Оценка:
M>Уйти на MonoRail или ASP.NET MVC
M>там Жизненый цикл контролов вырожденый и событий у них просто нет, соотвественно не нужно пересоздавать контролы, Actions контроллера вызываются всегда первыми.

Почитал про ASP.NET MVC. Интересно. К сожалению, значительная часть проекта уже написана, и сейчас хотелось бы обойтись минимальной кровью. Как-то же эта проблема решалась в рамках методологии asp.net до появления asp.net mvc framework
Re[3]: Жизненный цикл контролов ASP.NET
От: mogadanez Чехия  
Дата: 12.02.08 16:54
Оценка:
Здравствуйте, polyvox, Вы писали:

M>>Уйти на MonoRail или ASP.NET MVC

M>>там Жизненый цикл контролов вырожденый и событий у них просто нет, соотвественно не нужно пересоздавать контролы, Actions контроллера вызываются всегда первыми.

P>Почитал про ASP.NET MVC. Интересно. К сожалению, значительная часть проекта уже написана, и сейчас хотелось бы обойтись минимальной кровью. Как-то же эта проблема решалась в рамках методологии asp.net до появления asp.net mvc framework


более продуманым разбиением на контролки, чтобы такие ситуации даже не возникали. если в кратце опишите вашу ситуацию чуть менее абстрактно — попробуем помочь =)
Re[2]: Жизненный цикл контролов ASP.NET
От: Norex Россия  
Дата: 13.02.08 00:26
Оценка:
Здравствуйте, mogadanez, Вы писали:
M>Уйти на MonoRail или ASP.NET MVC
M>там Жизненый цикл контролов вырожденый и событий у них просто нет, соотвественно не нужно пересоздавать контролы, Actions контроллера вызываются всегда первыми.

Изучаю ASP.NET MVC Framework в том состоянии в котором он сейчас есть. Мнений много разных, особенно касающихся MVC vs. MVP. Но вопрос вот в чём: есть ли какие-то предположения, как на это всё накрутить MS Ajax Library (Atlas, в прошлом)?
Re: Жизненный цикл контролов ASP.NET
От: Norex Россия  
Дата: 13.02.08 00:33
Оценка:
Здравствуйте, polyvox, Вы писали:
P>Оба способа плохи по разным причинам. Есть ли какие-то другие способы корректно решить проблему? Возможно, я чего-то принципиально не понимаю?

Есть лёгкое непонимание Control Life Cyrcle.
Дело в том, что сначало инициализируется состояние (если покопать рефлектором, то заметите функцию InitControlRecurcivity(), и вызов за ним OnLoad. В этот момент как раз и создаётся _старая_ иерархия контролов, далее вызыватся InitViewStateRecurcivity() и вызывается в ней TrackViewState() и раздаются ViewState'ы контролам. А вот теперь занимательный момент, в зависимости от того, как рендерился контрол вызываются OnBubbleEvent или методы интерфейсов IPostBackEventHandler.

Попробуйте оформить это в CompositeControl перегрзив функции CreateChildControls или уже в более продвинутом варианте CompositeDataBoundControl. Если уж совсем сложная логика, но можно и с Web User Control'ом поигратся (это тот, что унаследован от UserControl'a, а не от WebControl'a).
Re[3]: Жизненный цикл контролов ASP.NET
От: mogadanez Чехия  
Дата: 13.02.08 08:50
Оценка:
N>Изучаю ASP.NET MVC Framework в том состоянии в котором он сейчас есть. Мнений много разных, особенно касающихся MVC vs. MVP. Но вопрос вот в чём: есть ли какие-то предположения, как на это всё накрутить MS Ajax Library (Atlas, в прошлом)?

http://www.nikhilk.net/Entry.aspx?id=181
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.