Пользовательский расширитель вкладок Ajax Control Toolkit для закрытия вкладок на стороне клиента
-
18-09-2020 - |
Вопрос
Я пытаюсь написать расширитель элемента управления AJAX, который может изменить набор инструментов управления AJAX. TabPanel
таким образом TabPanel
заголовок имеет изображение после текста, которое при нажатии скрывает заголовок вкладки с помощью клиентского скрипта (без обратной передачи).Я также хотел бы иметь возможность указать функцию onClientClose, которая также вызывается при закрытии вкладки.
Я новичок в расширениях управления ASP и до сих пор следовал [учебнику](http://www.asp.net/ajax/tutorials/creating-a-custom-ajax-control-toolkit-control-extender-cs«Создание пользовательского расширителя элемента управления AJAX Control Toolkit») на сайте ASP.NET для создания пользовательского расширителя.Я позвонил своему повторителю ClosableTabPanelExtender
, и мой проект расширителя строится.Я настроил тестовую веб-страницу следующим образом:
<asp:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server" />
<asp:TabContainer ID="TabContainer1" runat="server">
<asp:TabPanel ID="TabPanel0" runat="server">
<HeaderTemplate>Tab 0</HeaderTemplate>
<ContentTemplate>Hello!</ContentTemplate>
</asp:TabPanel>
<asp:TabPanel ID="TabPanel1" runat="server">
<HeaderTemplate>Tab 1</HeaderTemplate>
<ContentTemplate>Goodbye!</ContentTemplate>
</asp:TabPanel>
</asp:TabContainer>
<cc1:ClosableTabPanelExtender ID="ClosableTabPanelExtender1" runat="server"
TargetControlID="TabPanel1" />
До сих пор при запуске веб-сайта я получаю следующую ошибку:
The TargetControlID of 'ClosableTabPanelExtender1' is not valid. A control with ID 'TabPanel1' could not be found.
Ошибка заставляет меня думать, что TabPanel
не может быть продлен, поэтому мне придется продлить TabContainer
вместо?
Помимо ошибки, я мог бы использовать некоторые указания, особенно со сценарием поведения.Для меня это самая неуловимая часть, хотя я знаю, что она, скорее всего, будет содержать большую часть функциональности, которую я пытаюсь добавить.Я также не уверен, как с ним работают другие части расширителя.
У меня есть исходный код Ajax Toolkit, и я просмотрел исходный код элементов управления Tab, который мне частично понятен.Я также просмотрел несколько примеров расширителей элементов управления, в первую очередь Удлинители Мэтта Берсета и один от Дэна Уолина.
Решение
Наконец я понял, что мне нужно делать.Кому интересно решение:
Чтобы расширить элемент управления TabPanel, мне пришлось обойти опубликованную мной ошибку, переопределив
OnResolveControlID
метод в коде сервера моего расширителя (ClosableTabPanelExtender.cs
).protected override void OnResolveControlID(ResolveControlEventArgs e) { // Get a reference to the outermost TabContainer that contains the TabPanel being extended. TabContainer tabContainer = (TabContainer)base.FindControl(OuterTabPanelID); if (tabContainer != null) { // Check to see if any of the tabs are the control we are looking form. foreach (TabPanel tab in tabContainer.Tabs) { if (tab.ID == e.ControlID) { e.Control = tab; return; } } // If none of the tabs are what we are looking for, search the contents of each tab. foreach (TabPanel tab in tabContainer.Tabs) { Control ctrl = tab.FindControl(e.ControlID); if (ctrl != null) return; } } }
Что касается клиентского сценария поведения расширителя (и взаимодействия между серверным и клиентским кодом, то статьи, перечисленные на эта страница MSDN полезны и избавят вас от многих проблем.