Полагаю, вы уже поняли это (4 месяца?).Но я посчитал это забавным испытанием, и раньше я имел дело с валидаторами.
Решение состоит в том, чтобы подключить событие SelectedIndexChanged для элемента управления аккордеоном и отключить все валидаторы для скрытых панелей.
Сначала мы должны добавить хук к элементу управления аккордеоном.Это использует jQuery (я не знаю другого способа сделать это).Переменная содержит идентификатор клиента для функции аккорда.
var accordianId = 'MyAccordion';
function pageLoad()
{
var accCtrl = $find(accordianId + '_AccordionExtender');
accCtrl.add_selectedIndexChanged(onAccordionPaneChanged);
}
Это, конечно, все стороны клиента (javascript).
После этого нам нужно создать метод onAccordionPaneChanged для циклического прохождения всех DIV на панели аккордов и отключения всех валидаторов, связанных со скрытыми DIV (и включения всех валидаторов для вновь открытого DIV):
function onAccordionPaneChanged(sender, eventArgs)
{
var indexSelectedPane = sender.get_SelectedIndex();
// There are two divs per "pane": 1 Header, 1 Content
// That would make the DIV odd, but there's an additional
// hidden element at the front, so it's the Even item.
var indexContentDiv = (indexSelectedPane * 2) + 2;
var accordianControl = document.getElementById(accordianId);
var i, boolEnable;
for(i = 0; i < accordianControl.children.length; i++)
{
//Odd number, this must be a Content section
boolEnable = false;
if (i == indexContentDiv)
{
boolEnable = true;
}
EnableDisableValidators(accordianControl.children[i], boolEnable);
}
}
Обратите внимание, что в приведенном выше описании упоминаются два DIV на панель.Что происходит, так это то, что аккордовый элемент управления создает два DIV для каждой панели: один для верхнего и второго для нижнего колонтитула.Если вы перебираете все дочерние элементы, то все остальные DIV содержат содержимое.Итак, чтобы отключить все валидаторы только в разделах контента, я проверил выше (i% 2 == 1), который говорит, что это «нечетный» div, который является divами контента.
Наконец, функция EnableDisableValidatorsберет данный DIV и проверяет все валидаторы страницы, чтобы увидеть, являются ли они элементами управления в этом DIV.Если они находятся внутри этого DIV, он будет либо включать, либо отключать валидатор на основе переданного значения (которое определяется тем, был ли выбран этот DIV тот, который был выбран).
К сожалению, DIV, которые являютсясгенерированный элементом управления Accordion не имеет идентификатора, поэтому вам нужно выполнить поиск по всем элементам управления в div, а именно:
function EnableDisableValidators(divParent, setEnabled)
{
var childValidator;
var j;
var k;
if (divParent.children == null || divParent.children.length == 0)
{
return;
}
// Check all the validators to see if they're one of the children
for (j = 0; j < Page_Validators.length; j++)
{
// Check all the children of the DIV for the given validator
for (k = 0; k < divParent.children.length; k++)
{
if (FindControlRecursive(divParent, Page_Validators[j].id) != null)
{
ValidatorEnable(Page_Validators[j], setEnabled);
}
}
}
}
Еще одним недостатком является то, что мы должны найти всех детей в DIV иДля этого мы должны использовать рекурсию.Итак, вот «простая» функция для этого (названная выше):
function FindControlRecursive(parentNode, childID)
{
var l;
var retChild;
for (l = 0; l < parentNode.children.length; l++)
{
if(parentNode.children[l].id != null &&
parentNode.children[l].id == childID)
{
return parentNode.children[l];
}
else
{
retChild = FindControlRecursive(parentNode.children[l], childID);
if (retChild != null)
{
return retChild;
}
}
}
return null;
}
Есть несколько проблем с этим подходом.Во-первых, когда вы отправляете форму, только те валидаторы, которые видны в текущей панели, сообщат об ошибке.Все скрытые валидаторы не будут показаны.Чтобы решить эту проблему, вы можете добавить функцию «onclick» кнопки отправки, которая будет циклически проходить по всем Page_Validators и включать их все перед отправкой.Возможно, вам (в этот момент) также придется проверить валидаторы.Но это совершенно другой вопрос.;)
Другая проблема заключается в том, что расширители, кажется, показывают себя, когда вы нажимаете на элемент управления, к которому они подключены.Вы можете использовать эту же функциональность для вызова функциональности валидаторов, когда они включены, чтобы показать, какие поля являются обязательными.(Просто возможное решение.) Но опять же, это отдельный вопрос!
Надеюсь, это поможет.