В момента имам статичен падащ списък, чиито елементи се свързват от база данни при зареждане на страница. Въз основа на избора в този падащ списък динамично генерирам набор от контроли в таблица с идентификатори „CustomControl1“, „CustomControl2“ и т.н. Това, което трябва да направя, е с всеки избор в падащия списък да има уникален набор от контроли от различни типове контроли, но всички те имат един и същ идентификатор (въз основа на реда, в който са генерирани). Така че, когато се опитам да генерирам нов набор от контроли, получавам тази грешка:
Неуспешно зареждане на viewstate. Контролното дърво, в което се зарежда viewstate, трябва да съответства на контролното дърво, което е използвано за запазване на viewstate по време на предишната заявка. Например, когато добавяте контроли динамично, контролите, добавени по време на обратна публикация, трябва да съответстват на типа и позицията на контролите, добавени по време на първоначалната заявка.
Така че при зареждането на страницата имам два метода, единият генерира контрола въз основа на xml и друг, който създава контроли за валидиране по следния начин:
if (xml != "" && externalProperties.Rows.Count == 0)
{
LoadExternalProperties(xml);
ValidateExternalProperties(xml);
}
Когато направя първоначалния си избор, мога да генерирам контролите правилно, когато направя вторичен избор, контролите не могат да бъдат генерирани, тъй като състоянията на изглед не съвпадат за различните типове контроли.
Така че предполагам, че това, което трябва да направя, е да изчистя състоянието на изглед. Опитах следното:
Задаване на viewstate на null (опит извън Page_Init и In):
ViewState["CustomControl1"] = null;
Изчистване на таблицата от редовете:
externalProperties.Rows.Clear();
Изчистване на таблицата с контролите:
externalProperties.Controls.Clear();
Превключване на EnableViewState преди и след зареждане на контролите:
externalProperties.EnableViewState = false;
LoadExternalProperties(xml);
externalProperties.EnableViewState = true;
- Трябва да изчистя състоянието на изгледи само когато избраният индекс на падащия списък се промени. Това е така, защото в следващата стъпка (с помощта на съветник) извличам стойностите и ги използвам за други цели.
В момента проследявам предишния избран индекс, за да разбера кога трябва да изчистя състоянието на изглед.