ASP.net раскрывает динамически стилизацию и затем запоминает стили при прерванной отправке
Итак, у меня есть выпадающий список ASP (это.net 2.0). Я связываю это с данными. По сути, когда страница загружается и это не публикация, мы извлекаем данные записей, связываем все выпадающие списки и устанавливаем для них соответствующие значения (строго говоря, мы: инициализируем страницу базовым набором данных из БД, связываем выпадающие списки). из БД, получить фактические данные записи из БД, установить утопления в соответствующие настройки в это время). То, что я хочу сделать, это выборочно стилизовать параметры списка. Таким образом, база данных возвращает 3 элемента: ID, текст и флаг, указывающий, является ли запись "активной" (и я буду соответствующим образом стилизовать). Это достаточно легко сделать, и я сделал это.
Моя проблема в том, что происходит, когда отправка формы прекращается. Мы немного расширили класс Page и создали метод AddError(), который создаст список ошибок из неудачных проверок бизнес-правил и затем отобразит их в ValidationSummary. Это работает примерно так в событии нажатия кнопки отправки:
CheckBizRules();
if(Page.IsValid)
{
SaveData();
}
Если какая-либо проверка бизнес-правил не пройдена, страница не будет действительной. Проблема в том, что когда страница перерисовывается (видимость включена, но данные не возвращаются), моя прекрасная условная стилизация, к сожалению, исчезла, чтобы жить на земле пропавших носков. Мне нужно сохранить это.
Я надеялся избежать еще одного вызова БД (например, снова получить данные списка из БД, если страница недействительна, просто для того, чтобы перестроить список). Но это не конец света, если это мой курс действий. Я надеялся, что у кого-то может быть альтернативное предложение.
Я не мог придумать, как лучше сформулировать этот вопрос, если у кого-то есть какие-либо предложения или требуется разъяснение, не стесняйтесь его получить, если потребуется, силой.;)
2 ответа
Я не уверен, что полностью понимаю, какой стиль вы применяете к выпадающим элементам, но кажется, что этот стиль не является элементом управления, который сохраняется в постбэках. Обычно такого рода информацию необходимо сохранять в ViewState. Я вижу два варианта (кроме перезагрузки из БД):
Первый способ: создайте свой собственный выпадающий элемент управления, который наследуется от DropDownList. Затем сохраните данные стиля в сумке ViewState элемента управления при стилизации элементов:
public void SetItemActive(ListItem item)
{
ViewState[item.Value] = "active";
}
затем переопределите OnRender
protected override void Render(HtmlTextWriter writer)
{
....
foreach(ListItem item in Items)
{
if ( ViewState[item.Value] == "active")
{
** RenderActiveItem **
}
else
{
** RenderNormalItem **
}
}
Второй метод: сохранить активные идентификаторы в ViewState страницы, а затем заново оформить выпадающий список для каждой обратной передачи, используя данные из ViewState, а не из БД.
Ну, я не мог придумать ничего, кроме как пойти в базу данных, чтобы повторно получить данные моего списка, когда страница была недействительной, и изменить стиль элемента управления.