пользовательский шаблонный элемент управления asp.net/ajax, показывающий / скрывающий элементы с помощью заполнителя

У меня есть настраиваемый шаблонный элемент управления (панель инструментов), который содержит настраиваемый элемент управления (кнопка). Кнопка использует jquery для стилизации и управления состояниями / обратными передачами / не = обратными передачами и т. Д.

Некоторые кнопки скрыты с помощью заполнителя и отображаются при нажатии одной из кнопок.

Все кнопки, относящиеся к jquery, похоже, инициируются при обратной передаче (стиль ajax в UpdatePanel с использованием PageRequestManager), однако состояние просмотра теряется на кнопках, невидимых заполнителем.

Похоже, проблема связана с состоянием просмотра и кнопками на заполнителе в шаблонном элементе управления. Обычно это работает в среде, отличной от ajax, я подозреваю, что мне что-то не хватает.

Любые комментарии, которые заставляют меня задуматься, приветствуются.

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


person Mark Redman    schedule 10.11.2009    source источник
comment
Я пробовал использовать display: none в div (с тем же идентификатором, что и заполнитель и runat = server). Это работает, однако я не могу заставить это работать, если изначально установлен div Visible = false, он работает, если UserControls видны а затем скрытый. Кажется, уловка 22.   -  person Mark Redman    schedule 10.11.2009


Ответы (2)


Если я правильно помню, элементы управления ASP.NET не завершают свой жизненный цикл, если для них установлено значение false. Это означает, что такие вещи, как Render (), не вызываются, и ViewState должен быть одной из этих вещей (что имеет смысл). Использование панелей обновлений вместе с AJAX / Javascript также является действительно сложной задачей и работает не очень хорошо. Именно так работают элементы управления ASP.NET и панель обновлений.

Я предлагаю либо использовать панели обновлений, либо использовать javascript, но не то и другое вместе.

Вы можете легко имитировать, что делают панели обновления, используя jquery $ .post / get и заменяя часть кода HTML, возвращаемым из вызова веб-службы.

function myButtonClick(event){
    $.post("path/to/webservice", {data1: "data1"}, function(data, status){
        $("#myPanel").replaceWith(data);
    });
}

В конечном итоге вы столкнетесь и с другими проблемами, если у вас есть JS, прикрепленный к коду, который обновляется через панель обновлений. Пример: если у вас есть список элементов, к каждому из которых прикреплен JS, например, один из элементов управления ASP.NET AJAX Control Toolkit, и вы удаляете один из них со страницы с помощью панели обновления, JS используется для подключения элементы управления будут не синхронизированы.

person Josh Close    schedule 10.11.2009
comment
Привет, я думаю, что вы правы в рендеринге, если для параметра Visible установлено значение false в UserControl. У меня UpdatePanels хорошо работает с jQuery, это просто проблема с отображением / скрытием, которая вызывает некоторое горе. Я могу решить эту проблему, используя javascript / jquery, чтобы скрыть div, и в этом случае элементы, которые должны быть видимыми / скрытыми, не нуждаются в такой большой защите, поэтому решение css будет в порядке. По-прежнему не идеален для более безопасных частей страницы, которые нужно скрыть. - person Mark Redman; 10.11.2009

Я чувствую, что должен ответить на свой вопрос здесь:

Вместо использования PlaceHolders или div с css, UpdatePanels визуализируются либо в div, либо в диапазоне, в зависимости от параметра рендеринга. В этом случае просто скройте div или span, которые создает UpdatePanel, а не пытайтесь скрыть / показать новый внешний контейнер.

person Mark Redman    schedule 27.11.2009