SelectedValue
полагается на ViewState
потому что на PostBack восстанавливая свой ListItems
от ViewState
, а затем устанавливает выбранное значение на DropDownList
от Request
объекта.
Не принимается значение Request
как SelectedValue
. Это, в свою очередь, связано с тем, что ASP.Net может проверить, не был ли изменен опубликованный DropDownList
на клиенте. Он делает это, сначала де-сериализуя исходные элементы из ViewState
. Затем он находит значение Request
в пунктах и устанавливает его Selected
как true
. Только сейчас доступно свойство SelectedValue
. (или SelectedIndex
в этом отношении). Теперь он должен иметь возможность запустить событие SelectedIndexChanged
.
Это также является причиной того, что вам не нужно снова связывать DropDownList
в PageLoad
. Элементы списка автоматически удаляются из ViewState
.
Если ViewState
отключен, то в ViewState
не будет элементов исходного списка и будет пустым. Следовательно, он не сможет отмечать какой-либо элемент как выбранный. Следовательно, SelectedValue
будет 0, или SelectedItem
будет пустым. Я думаю, что событие SelectedIndexChanged
также не срабатывает. Для работы в этом случае необходимо выполнить привязку данных, предпочтительно на init
.
Однако есть обходные пути.
Complete Reference: http://msdn.microsoft.com/en-us/library/ms972976.aspx
Редактировать: (после комментариев Op в)
После жизненного цикла страницы, чтобы увидеть, где SelectedValue
полагается на ViewState
:
Этап 1 Init: контроль построена иерархия. Если DropDownList связан здесь или ListItems были добавлены декларативно, список будет заполнен здесь.
Этап 2 Загрузить ViewState: В PostBack ViewState проверяется здесь и загружается в DropDownList. Существует нетSelectedValue
здесь.
Этап 3 Загрузка данных PostBack: Здесь Request
Значение (из запроса формы) берется, а затем применяется к элементу управления. В этом случае DropDownList
теперь множестваSelectedValue
из принятого Request
стоимости объекта, внутренняя реализация что-то вроде этого:
string selectedValue = HttpContext.Current.Request.Form[DropDownList_Id];
Items.FindByValue(selectedValue).Selected = true;
Что важно здесь то, что, если ViewState не существует и DropDownList не данных- , то коллекция ListItem будет пустой и, следовательно, свойство SelectedValue
равно 0. Это не имеет ничего общего с внутренней реализацией свойства.
Если ViewState не существует (отключено), а DropDownList привязан к данным, тогда коллекция ListItem будет существовать, и соответствующий элемент будет отмечен как выбранный, и, следовательно, свойство SelectedValue
вернет правильное значение.
Если коллекция детали новая (через повторное связывание с другим набором данных или ViewState аннулируются), то значение Request
формы не будет найдены в коллекции элементов и снова SelectedValue
будет недействительно.
Этап 4 Загрузка страницы: к этому времени уже были загружены данные ViewState (или привязки данных) и PostBack Data.
Этап 5 Raise PostBack Событие: На этом этапе OnSelectedIndexChanged
событие DropDownList увольняют, если индекс был изменен на этапе 3.
Следовательно, SelectedValue
опирается на ViewState на стадии 3. Конечно, если элемент управления соответствующим образом привязан к данным, то он не будет полагаться на ViewState в качестве следствия.
SelectedValue
полагается на ViewState, чтобы убедиться, что коллекция предметов была заполнена до ее установки. Связывание данных/повторное связывание - это еще один способ убедиться, что коллекция элементов заполнена.
Надеюсь, что уточняется.
Ну текстовое поле не полагается на viewstate, вы можете отключить viewstate, и вы все равно получите текстовое значение, его значение исходит от IPostBackDataHandler. Request.Form [""] Работает только при отправке ваших данных с использованием метода POST. Учитывайте, что пользователь не может отправить форму из-за ошибок проверки или любой ошибки, по которой ваша форма не может быть отправлена на этом мероприятии. получите свои значения из Request.Form [""]. –
@surajsingh Я уже знаю это. все еще мой вопрос остается. –
Надеюсь, что я сейчас на правильном пути, я просто создал раскрывающийся список с использованием listitems, и он сохраняет состояние даже после отключения ViewState. Я все еще должен проверять выпадающее меню, которое ограничено через таблицы базы данных. Посмотрим, сохраняют ли они свое состояние и могут ли я получить ответ. –