Редактирование разметки элемента управления ASP.NET с последующим сохранением в PostBack - PullRequest
0 голосов
/ 10 июля 2009

Я использую jquery для добавления или удаления (отображается как

) из (отображается как <выберите несколько = "несколько">).

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

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

Я пытался: Response.Cache.SetCacheability (HttpCacheability.NoCache);
Cache.Remove ( "Add_Product.aspx");

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

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

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

1 Ответ

2 голосов
/ 10 июля 2009

Если вы не хотите перенаправлять на ту же страницу после обратной передачи (следуя шаблону 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 или нет?)

...