Viewstate Disabled - выпадающий список не возвращает значения - PullRequest
2 голосов
/ 11 апреля 2011

В попытке ускорить мой сайт, я пытаюсь отключить состояние просмотра, так как не думаю, что использую его везде.У меня есть настройка главной страницы с пользовательскими элементами управления, загруженными (используя LoadControl) в default.aspx.Моя типичная настройка страницы:

Main.master -> Default.aspx -> ControlWrapper.ascx -> MyControl.ascx

Я добавил EnableViewState = "false" на мою страницу Default.aspx.Теперь, когда я пытаюсь прочитать значение из DropDownList in MyControl.ascx, оно возвращается пустым, когда форма публикуется.Прежде всего, почему это?Я думал, что все еще смогу прочитать значение из выпадающего списка?

Затем я попытался включить ViewState для этого элемента управления, и он не работал.

Я также попытался включитьсостояние взгляда на Page_Init событие MyControl.ascx с использованием Page.EnableViewState = True;, но это тоже не помогло.

Я полагаю, что я несколько неправильно понимаю состояние представления, может кто-нибудь указать мне правильное направление, пожалуйста?*

ps Не знаю, актуальна ли эта информация, но я динамически добавляю содержимое DropDownList в событие Page_Load.(Думая об этом, могут ли это быть проблемы - сейчас это проверю).

Спасибо.

Ответы [ 4 ]

2 голосов
/ 22 октября 2012

Когда вы установили ViewState в false, выпадающий список должен быть заполнен до загрузки страницы - что означает, что вы, вероятно, должны сделать это при инициализации страницы. Примерно так:

protected void Page_Init(object sender, System.EventArgs e)
{
    ddlItems.Items.Add(new ListItem("test1", "test1"));
    ddlItems.Items.Add(new ListItem("test2", "test2"));
    ddlItems.Items.Add(new ListItem("test3", "test3"));
}

Тогда вы сможете прочитать значение при загрузке:

protected void Page_Load(object sender, System.EventArgs e)
{
    someTextBox = ddlItems.SelectedValue;
}

Немного фона :

На этой странице: Цикл страниц Microsoft

На изображении с циклом страницы есть методы «ProcessPostData» и «LoadPostData», запускающие между Init и Load. Данные публикации для раскрывающегося списка содержат выбранное значение, но не возможные значения, поэтому при загрузке данных публикации важно, чтобы возможные значения уже были (или не удастся установить выбранное значение). Также до загрузки данных публикации не было установлено выбранное значение.

Если viewstate включен, он сохраняет и извлекает возможные значения между постбэками.

2 голосов
/ 11 апреля 2011

Когда viewstate отключено, значения, которые вы загружаете в Page_Load, больше не отображаются в списке, когда вы отправляете обратно (пока вы не перезагрузите их, очевидно).Если вы хотите работать без viewstate, вам нужно будет установить выбранный элемент из значения в Request.Form.

protected void Page_Load(object sender, System.EventArgs e)
{
    ddlItems.Items.Add(new ListItem("test1", "test1"));
    ddlItems.Items.Add(new ListItem("test2", "test2"));
    ddlItems.Items.Add(new ListItem("test3", "test3"));

    if (Page.IsPostBack)
        ddlItems.SelectedValue = Request.Form["ddlItems"];
}
1 голос
/ 11 апреля 2011

Я предполагаю, что вы используете .NET 4. View State - это метод, который платформа ASP.NET использует для сохранения значений страницы и контроля между циклами.

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

Причина, по которой это не сработало для вас, когда View State была отключена для страницы, но включена для элемента управления, заключается в том, что для того, чтобы это работало, должны выполняться следующие условия :

  • Для свойства EnableViewState страницы установлено значение true.
  • Свойство EnableViewState для элемента управления установлено в значение true.
  • Свойство ViewStateMode для элемента управления установлено на «Включено» или наследует параметр «Включено».

Обзор состояния просмотра ASP .NET

0 голосов
/ 11 апреля 2011

Когда вы сделали EnableViewState = false; на странице, вы не должны ожидать DropdownList.SelectedValue после обратной передачи.

Будет хорошо, если вы включите / отключите ViewState для определенных элементов управления, а не отключите все состояние просмотра, указав его в директиве страницы.

...