Сложная проблема Viewstate на динамических элементах управления - PullRequest
2 голосов
/ 02 марта 2012

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

Элемент управления используется для проверки адреса.

Процесс:

  1. дисплеи управления.
  2. Пользователь вводит адресную информацию.
  3. страница отправляет сообщения назад, и элемент управления проверяет информацию адреса относительно веб-службы.
  4. Если адрес не равен 100%, отображается список возможных совпадений. <- это происходит в повторителе. Другими словами, это связано с данными в коде. </li>
  5. Пользователь устанавливает флажок рядом с тем, который он хочет принять.
  6. страница сообщений назад

Пока что 1 - 6 работ. Проблема в том, что когда страница отправляется обратно, элементы репитера отсутствуют.

Как я могу заставить повторитель загружать свои элементы без необходимости запуска другой операции databind ()?

В противном случае, как я могу эффективно запустить databind ()? Другими словами, у меня нет элементов управления улицей / городом / регионом / почтовым индексом во время oninit. Итак, как я могу применить изменения состояния просмотра?

Ответы [ 2 ]

2 голосов
/ 02 марта 2012

Большинство элементов управления отображаются в виде элементов HTML-формы, таких как <input type="text" name="myId" id="myId/>.

Часть веб-форм - это просто оболочка для всего этого.

Всякий раз, когда вам нужно получить необработанные значения, вы можете просто посмотреть в коллекции Request.Forms любые значения элемента управления, которые отправлены обратно с именем искомого элемента управления (который обычно состоит из уникальный идентификатор, который генерирует asp.net для уникальности элементов управления и вашего имени).

Это именно то, что вы сделали - вы просмотрели коллекцию форм, просматривая необработанные значения форм, которые были отправлены на сервер. Это также то, что вы часто делаете, когда внедряете интерфейс IPostBackDataHandler при создании своих собственных элементов управления - вы извлекаете значение из Request.Forms.

Немного раздражает наличие флажков в том, что со "стандартным" HTML они отправляются, только если отмечены галочкой.

1 голос
/ 15 июля 2012

Два важных факта:

  1. Элементы управления в элементе повторителя должны быть созданы в OnItemCreated и , а не OnItemDataBound .
  2. OnItemCreated выполняется во время обратной передачи без необходимости вызова DataBind () .

Я загружаюсьпользовательские элементы управления в элементах повторителя, и тип пользовательского элемента управления основан на элементе данных, привязанном к повторителю.Поэтому я добавил тип пользовательского элемента управления в состояние представления элемента повторителя, чтобы во время OnItemCreated, работающего при обратной передаче (без элемента данных для привязки, так как DataBind () не был вызван), он знал, какой тип пользовательского элемента управления следует загрузить.Затем будет применяться представление состояния.

protected void rpTransactions_OnItemCreated(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            var dataItem = e.Item.DataItem;

            string typeName;

            string viewStateKey = string.Concat("typeName", e.Item.ItemIndex);

            if (dataItem == null)
            {
                typeName = ViewState[viewStateKey].ToString();
            }
            else
            {
                typeName = dataItem.GetType().ToString();

                ViewState[viewStateKey] = typeName;
            }

            Control template = TransactionTemplateFactory(typeName);

            template.ID = "trans";

            e.Item.FindControl("phTransSpecific").Controls.Add(template);
        }
    }

Если код в OnItemDataBound выполняется, он вылавливает этот пользовательский элемент управления и привязывает к нему свои данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...