Как поддержать состояние в (asp.net) пользовательское управление сервером?

Я пытаюсь сделать пользовательское управление сервером, которое наследовалось DropDownList. Я даю контроль, вход XML, содержащий некоторые пары ключ/значение и мое управление, показывает их DropDownList. Я делаю элементы списка в Методе рендеринга переопределения как это:

foreach (XElement child in root.Elements("Choice"))
{
    string title = child.Element("Title").Value;
    string score = child.Element("Score").Value;
    item = new ListItem();
    item.Text = title;
    item.Value = score;

    this.Items.Add(item);
}

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

У кого-либо есть какая-либо идея, как сохранить выбранный пункт, т.е. поддержать состояние?

Вот полный источник:

public class MultipleChoiceQuestionView2 : DropDownList

{общедоступный MultipleChoiceQuestionView2 (): основа () {}

защищенное переопределение пустой Рендеринг (устройство записи HtmlTextWriter) {устройство записи. RenderBeginTag (HtmlTextWriterTag. Таблица); устройство записи. RenderBeginTag (HtmlTextWriterTag. TR);

устройство записи. RenderBeginTag (HtmlTextWriterTag. Td); Синтаксический анализ #region Contets, если (! Строка. IsNullOrEmpty (это. Содержание)) {XElement базируются = XElement. Синтаксический анализ (это. Содержание);

если (корень. HasAttributes) {это. NoOfChoices = Int32. Синтаксический анализ (корень. Атрибут ("ItemCount").Value);}

это. Объекты. Ясный (); это. Стиль. Добавьте ("ширина", "100 пкс"); это. Стиль. Добавьте ("семейство шрифтов", "Tahoma"); это. Объекты. Ясный (); объект ListItem = новый ListItem (); объект. Текст =""; объект. Значение = "0"; это. Объекты. Добавьте (объект);

foreach (ребенок XElement в корне. Элементы ("Выбор")) {представляют заголовок в виде строки = ребенок. Элемент ("Заголовок").Value; представьте счет в виде строки = ребенок. Элемент ("Счет").Value; объект = новый ListItem (); объект. Текст = заголовок; объект. Значение = счет;

this.Items.Add(item);

}} #endregion основа. Рендеринг (устройство записи); устройство записи. RenderEndTag ();

если (это. Требуемый) {RequiredFieldValidator rfv = новый RequiredFieldValidator (); rfv. ControlToValidate = это. Идентификатор; rfv. InitialValue = "0"; rfv. Текст = "*"; если (! Строка. IsNullOrEmpty (это. ValidationGroup)) {rfv. ValidationGroup = это. ValidationGroup;} устройство записи. RenderBeginTag (HtmlTextWriterTag. Td); rfv. RenderControl (устройство записи); устройство записи. RenderEndTag ();}

устройство записи. RenderEndTag (); устройство записи. RenderEndTag ();} #region общественность Свойств представляют Содержание в виде строки {добираются {возвращают ViewState ["Содержание"] == пустой указатель? "": ViewState ["Содержание"].ToString ();} набор {ViewState ["Содержание"] = значение; }}

частный интервал mNoOfChoices; общедоступные международные NoOfChoices {добираются {возвращают mNoOfChoices;} набор {mNoOfChoices = значение; }}

частная строка mValidationGroup; общедоступная строка, которую ValidationGroup {получают {возвращает mValidationGroup;} набор {mValidationGroup = значение; }}

общедоступная строка SelectedChoice {получает {возврат""; }}

частный bool mRequired = ложь; общественность bool Необходимый {добирается {возвращают mRequired;} набор {mRequired = значение; }}

#endregion}

Заранее спасибо.

1
задан Omid Kamangar 10 August 2010 в 08:51
поделиться

1 ответ

У вас есть два варианта: ViewState или ControlState .

Разницу в ViewState можно преодолеть, установив EnableViewState = "false" в директиве страницы, в то время как ControlState не может.

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

Здесь есть достойный пример , где настраиваемый элемент управления является производным от класса Button и поддерживает состояние между запросами страницы - должен хорошо соответствовать вашему сценарию.

Надеюсь, с этого вы начнете.

2
ответ дан 2 September 2019 в 22:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: