Динамическое изменение пользовательского контроля в ASP.Net

StackOverflow https://stackoverflow.com/questions/987680

  •  13-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь создать веб-страницу, на которой будет отображаться соответствующий пользовательский элемент управления на основе выбранного значения раскрывающегося списка.

В основном макет страницы такой:

Выпадающий выбор
< Пользовательский элемент управления создан на основе раскрывающегося списка. >

У меня наполовину работает...элементы управления изменяются при изменении выбора.В OnInit() я динамически создаю последний выбранный элемент управления (значение которого сохраняется в состоянии сеанса, поскольку ViewState недоступно в OnInit).

Когда происходит изменение выбора в раскрывающемся списке, я удаляю старый пользовательский элемент управления и добавляю новый. Проблема в:поскольку новый элемент управления добавляется из события изменения выбора, я не могу сохранить изменения от пользователя при первой обратной передаче.После первого обратного сообщения выбранный элемент управления создается из OnInit вместо события Change, и с этого момента состояние сохраняется до следующего изменения выбора.

Вот метод SelectionChanged:

protected void SelectionChanged(object sender, EventArgs e)
{
    SelectedValue = int.Parse(DropDownList.SelectedValue);  //Store in Session
    Control userControl = GetSpecificUserControl(SelectedValue);
    PlaceHolder1.Controls.Clear();   // Remove old user control
    PlaceHolder1.Controls.Add(userControl);
}

Любые изменения, внесенные пользователем в новый элемент управления после того, как происходит SelectionChanged, не сохраняются в следующем сообщении.Однако последующие обратные передачи сохраняются.В этот момент элемент управления создается в OnInit().

Есть ли способ вернуть правильный пост и ViewState при изменении элемента управления?Можно ли принудительно выполнить повторную инициализацию страницы после изменения элемента управления?

Это было полезно?

Решение

Это классическая проблема, связанная с веб-формами ASP.Net.У вас есть несколько вариантов:

1) Это своего рода хак, поскольку он немного выходит за рамки предполагаемого жизненного цикла страницы, но, по моему опыту, это самый прямой способ решения проблемы.Когда страница публикует ответ из события выбора раскрывающегося списка, просто опросите Request["MyDropDownID"] для выбранного значения раскрывающегося списка во время Init() - не жди OnMyDropDownChanged() событие для настройки вашей страницы.

2) Реализуйте собственную обработку ViewState для пользовательских элементов управления.Для этого необходимо изучить документацию ViewState и переопределить ряд методов.

3) Решение Джоэла.Он опередил меня, но я пытался получить первый пост :p

Другие варианты включают публикацию значений с использованием javascript и тому подобного, но они становятся очень запутанными.

Другие советы

Что вам нужно сделать, так это сохранить последнее известное значение DropDownList в сеансе.Затем:

При инициализации:

  • Создайте любой элемент управления, указанный сохраненным значением в сеансе.

Событие SelectionChanged

  • Удалите все, что вы создали во время OnInit.
  • Создайте и добавьте новый элемент управления на основе нового выбора DropDownList.
  • Сохранить новый выбор DropDownList в сеансе

Таким образом, при следующей обратной передаче после изменения вы заново создаете элемент управления, который ViewState ожидал найти, и поэтому его состояние будет восстановлено.

Динамическое управление может быть очень привередливым.Зачастую проще создать все элементы управления, которые могут вам понадобиться, и установить для их свойств Visible значение false.Таким образом, они вообще не отображаются в браузере.Затем установите для Visible значение true только для тех элементов управления, которые вам нужны, когда они вам нужны.

Если список опций не слишком велик, вы можете просто отобразить все пользовательские элементы управления статически и использовать JavaScript/jQuery, чтобы показать/скрыть соответствующие элементы управления на основе значения раскрывающегося списка (событие onchange js).Вы можете использовать раскрывающееся значение, чтобы извлечь соответствующие значения из пользовательских элементов управления при сохранении.

Вы избегаете необходимости иметь дело с динамическими элементами управления, обеспечиваете более отзывчивый пользовательский интерфейс при выборе из раскрывающегося списка (без обратной передачи) и т. д.

Не добавляйте элемент управления в обработчике SelectedIndexChanged, добавьте его во время Page_Load.Вам просто нужно будет проверять значение раскрывающегося списка каждый раз при загрузке страницы и загружать правильный элемент управления для этого значения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top