Если вы не хотите перенаправлять на ту же страницу после обратной передачи (следуя шаблону Post-Redirect-Get , который на самом деле может очистить страницы ASP.NET!), Ваши лучшие варианты должны:
1) После того, как вы сохраните элемент в базе данных, получите ваши ListBox
DataSource
и снова вызовите ListBox.DataBind()
при обратной передаче. (Как примечание, необходимость добавления всего этого дополнительного кода для поиска и привязки данных является одной из нескольких причин, по которым люди переходят к шаблону PRG при работе с ASP.NET.)
2) Измените свой класс codebehind так, чтобы он добавлял элемент списка в соответствующий WebControl при повторной публикации на странице.
То есть, когда вы сохраняете новое значение в базе данных, добавьте новое ListItem
в свой элемент управления ListBox
:
protected void Save_Click(object sender, EventArgs e) {
// ... Code to save the new value to your database ...
ListItem newItem = new ListItem(text, value);
ListBox.Items.Add(listItem);
}
Теперь значение будет там, когда ASP.NET отображает ваш HTML.
Редактировать: добавлено больше подробностей, чтобы попытаться объяснить, почему нет лучшего решения.
Когда вы добавляете <option>
элементы к элементу управления <select>
на клиенте, эти новые option
элементы не передаются на сервер - для него просто нет никакого механизма.
Это может сбивать с толку, потому что, как вы видели, вы все еще можете публиковать динамически добавленные значения option
на сервере (хотя только если вы отключите EnableEventValidation
, что рискованно, как указано в комментариях womp) .
Однако невыбранные элементы опции не передаются на веб-серверы во время отправки запросов.
Тогда возникает вопрос: как ASP.NET может восстановить правильное содержимое ListBox после запроса на публикацию? Во-первых, он делает все, что ему говорит код (ListBox.DataBind, ListBox.Items.Add и т.д.). Во-вторых, если viewstate включен, он добавляет все значения параметров, которые были сохранены в viewstate.
ASP.NET, возможно, мог бы добавить третье правило: «если объявленное значение для списка выбора еще не находится в ListBox, добавьте это значение в ListBox». Но поскольку существует риск безопасности, позволяющий публиковать произвольные значения на странице (по крайней мере, если вы установили набор ожидаемых значений, как в случае ListBox), Microsoft решила отказаться от этого. (Кроме того, подумайте, что вы будете делать с динамически добавленными значениями ListBox, которые не прошли проверку - должны ли они быть добавлены при перестроении ListBox или нет?)