Обмен данными между usercontrols - PullRequest
6 голосов
/ 27 марта 2010

На моей странице у меня есть n-userControls (тот же элемент управления), мне нужно общаться между ними (чтобы быть более точным, мне нужно передать одно значение).

Я не хочу привлекать страницу хостинга для этого.

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

Я не могу использовать VieState, потому что viewstate для каждого элемента управления и так же как и для controlstate.

Могу ли я использовать сессию для этого? (сеанс является общим, и мне нужно сохранить только одно значение)

Или, может, есть что-то лучшее, что я могу использовать? (без QueryString)

Ответы [ 3 ]

2 голосов
/ 27 марта 2010

Лично нет «простого» способа сделать это, не пройдя через контрольную страницу или событие.

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

Содержащая страница подписывается на событие «PageSelectionChanged» в обоих элементах управления, в ответ на это событие обновляет данные, которые у вас уже есть, И перечисляет все элементы управления пейджером, устанавливая значение «Текущая страница».

У вас уже есть канализация событий для связи со страницы управления -> страница, используйте то, что вы уже создали.

Почему не сессия?

Меня спросили в комментариях, будет ли это лучше, чем сессия, и ответ - да, по ряду причин.

  1. Информация о сеансе, если явная очистка не существует в течение сеанса пользователя (обычно 20 минут)
  2. Поскольку номер 1, вам нужно будет добавить элементы на страницу, чтобы (! Ispostback) "очистить" переменные сеанса, чтобы пользователь не запускался на другой странице.
  3. В будущем рост числа приложений, информация о сеансе должна быть перенесена из процесса в SQL Server или иным образом для работы в среде веб-фермы, для этого я также стараюсь избегать этого.
  4. При использовании сеанса эта информация хранится в памяти на веб-сервере, хотя она небольшая (4 байта, если целое число), может сложиться и не нужна
  5. В зависимости от характера ваших обновлений, вы не можете обеспечить порядок элементов управления с помощью одного сеанса, чтобы гарантировать, что 1 элемент управления принудительно обновляет все элементы управления.

Существуют и другие решения, решение, подобное опубликованному выше, которое рекурсивно просматривает страницу, но вы должны быть осторожны с этим, чтобы не попасть в ситуацию циклической / бесконечной рекурсии. , если у вас много элементов управления на странице, это может добавить много накладных расходов, чтобы постоянно перебирать все.

0 голосов
/ 27 марта 2010

Вы можете создать быструю модифицированную версию шаблона наблюдателя. Я бы посоветовал установить на страницах управление кормушкой. Но если вы не хотите изменять страницу, вот быстрое решение.

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

protected void control_event(object sender, EventArgs e)
{
    UpdateAllControls(page);
}


public static void UpdateAllControls(Control parent /* can be Page */)
        {
            foreach (Control c in parent.Controls)
            {
                if (c.GetType() == this.GetType())
                    ((MyType)).Update()
                if (c.HasControls())
                    controls = GetAllControls(controls, t, c);
            }
        }
0 голосов
/ 27 марта 2010

Страница контейнера имеет свойство в viewstate, которое хранит состояние. Когда пользователь нажимает на один из пейджеров, он вызывает событие, которое обрабатывается страницей контейнера. Затем он перебирает n пользовательских элементов управления и вызывает открытый метод для этих элементов управления.

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