Динамично созданные средства управления и жизненный цикл страницы ASP.NET

Я работаю над проектом ASP.NET, в котором подавляющее большинство форм сгенерированы динамично во время выполнения (определения формы хранятся в DB для настраиваемости). Поэтому я должен динамично создать и добавить свои средства управления к Странице каждый раз пожары в OnLoad, независимо от IsPostBack. Это работало просто великолепно, и.NET заботится об управлении ViewState для этих средств управления.

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);
    RenderDynamicControls()
}

private void RenderDynamicControls()
{
    //1. call service layer to retrieve form definition
    //2. create and add controls to page container
}

У меня есть новое требование, в, котором если пользователь нажимает на данную кнопку (эта кнопка создается во время проектирования), страница должна быть повторно представлена немного отличающимся способом. Таким образом в дополнение к коду, который выполняется в OnLoad (т.е. RenderDynamicControls ()), у меня есть этот код:

protected void MyButton_Click(object sender, EventArgs e)
{
    RenderDynamicControlsALittleDifferently() 
}

private void RenderDynamicControlsALittleDifferently()
{
    //1. clear all controls from the page container added in RenderDynamicControls()

    //2. call service layer to retrieve form definition

    //3. create and add controls to page container
}

Мой вопрос, это - действительно единственный способ выполнить то, что я после? Это, кажется, вне hacky эффективно представляет форму дважды просто для ответа на нажатие кнопки. Я заключаю от своего исследования, что это просто, как жизненный цикл страницы работает в ASP.NET: А именно, тот OnLoad должен стрелять в каждую Обратную передачу, прежде чем дочерние события будут вызваны. Однако, стоит свериться ТАКИМ ОБРАЗОМ сообщество прежде, чем иметь необходимость выпить kool-помощь.

На связанной ноте, после того как я завершил эту функцию, я - планирование броска UpdatePanel на странице для выполнения обновлений страницы через Ajax. Любой код/совет, которые делают тот переход легче, очень ценился бы.

1
задан abatishchev 23 December 2012 в 07:29
поделиться

1 ответ

От Дирка к Дирку :-)

Что вы имеете в виду под RenderDynamicControls? Создание и настройка элементов управления? Если это ваше намерение не ASP.NET управляете своим ViewState, но вы это делаете. Если вы заполняете элементы управления при каждой загрузке, вы всегда перезаписываете существующую ViewState!

Если вы хотите использовать ViewState, создайте элементы управления в событии init страниц и заполните их в событии загрузки, но только если запрос не является обратной связью. Это необходимо, поскольку ASP.NET воссоздает ViewState между init и load. И это также является причиной двух «циклов рендеринга», которые вы описываете. Вам нужен первый цикл создания элемента управления, потому что ASP.NET не можете восстановить ViewState без правильного набора элементов управления, и ASP.NET не можете правильно реагировать на ваш ответ без него.

Вернуться к коду:Как правило, RenderDynamicControlsALittleDifferent не будет работать, поскольку элементы управления создаются слишком поздно в жизненном цикле страниц и повреждение ViewState путем вставки новых объектов в коллекцию элементов управления может привести к повреждению. В аналогичной ситуации я решил эту проблему, перенаправив страницу на себя (Response.Redirect). В этом случае RenderDynamicControls выполнит эту работу, основываясь на «немного другой ситуации» после изменения внутреннего состояния.

2
ответ дан 3 September 2019 в 00:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: