Редактирование разметки элемента управления ASP.NET с последующим сохранением в PostBack

Я использую jquery для добавления или удаления ‹ListItem› (отображаемого как ‹option›) из ‹ListBox› (отображаемого как ‹selectmultiple="multiple"›).

Проблема возникает, когда я пытаюсь сохранить на PostBack. Правильная информация сохраняется в базе данных. Однако, когда страница загружается в PostBack вместо загрузки новых данных из базы данных, старые данные из исходного ‹ListBox› остаются.

Когда я устанавливаю Response.Expires = 0 и обновляю страницу, которая загружается после PostBack, все находится там, где оно должно быть.

Я пробовал: Response.Cache.SetCacheability(HttpCacheability.NoCache);
Cache.Remove("Add_Product.aspx");

Также, чтобы обойти проблемы с EventValidation, я устанавливаю EnableEventValidation="false".

Итак, мой вопрос: как мне подойти к этой проблеме? Есть ли быстрый и простой способ заставить PostBack загрузить новую страницу?

Я бы предпочел не перенаправлять на ту же страницу после PostBack.


person Community    schedule 10.07.2009    source источник


Ответы (1)


Если вы не хотите перенаправлять на ту же страницу после обратной передачи (после Post- Шаблон Redirect-Get, который действительно может значительно очистить страницы ASP.NET!), вам лучше всего:

1) После того, как вы сохраните элемент в базе данных, извлеките DataSource вашего ListBox и снова вызовите ListBox.DataBind() при обратной передаче. (Кроме того, необходимость добавления всего этого дополнительного кода для извлечения данных и связывания является одной из нескольких причин, по которым люди переходят на шаблон PRG при работе с ASP.NET.)

2) Измените класс отделенного кода, чтобы он добавлял элемент списка в соответствующий 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 в комментариях).

Однако не выбранные элементы option не передаются веб-серверам во время почтовых запросов.

Тогда возникает вопрос, как ASP.NET может восстановить правильное содержимое ListBox после почтового запроса? Во-первых, он делает все, что говорит ему программный код (ListBox.DataBind, ListBox.Items.Add и т. д.). Во-вторых, если состояние просмотра включено, оно добавляет все значения параметров, которые были сохранены в состояние просмотра.

ASP.NET, вероятно, мог бы добавить третье правило: «если отправленное значение для списка выбора еще не находится в ListBox, добавьте это значение в ListBox». Но поскольку размещение произвольных значений на странице представляет собой угрозу безопасности (по крайней мере, когда вы установили набор ожидаемых значений, как в случае с ListBox), Microsoft отказалась от этого. (Кроме того, подумайте, что бы вы сделали с динамически добавленными значениями ListBox, которые не прошли проверку — должны ли они быть добавлены при перестроении ListBox или нет?)

person Community    schedule 10.07.2009
comment
Вам также следует избегать отключения EventValidation — это мера безопасности для предотвращения внедрения на ваши страницы. - person womp; 10.07.2009
comment
Спасибо за отзыв. Я использую ваше первое предложение. Тем не менее, я чувствую, что должно быть лучшее решение. - person ; 10.07.2009
comment
Рад помочь, хотя мне жаль, что я не смог дать вам более приемлемое решение - я обновил ответ попыткой объяснить, почему такого не существует. - person Jeff Sternal; 10.07.2009