Expandindo um painel sanfonado em validação inválida
-
12-12-2019 - |
Pergunta
Eu tenho uma coleção de AccordionPanes contendo vários controles TextBox e DropDownLists, cada um com seus próprios validadores.
Se ocorrerem algumas validações do lado do servidor no envio do formulário, há algo que pode expandir automaticamente um painel minimizado anteriormente que contém a mensagem do validador inválida?Caso contrário, parecerá ao usuário que o formulário não pode ser enviado sem motivo.
Outro cenário:Digamos que eu tenha vários painéis com lado do cliente validadores vinculados às entradas.Se um painel estiver minimizado (e, portanto, você não conseguir ver a ErrorMessage do validador), existe uma maneira de expandir o painel apropriado quando a validação da página AJAX ocorrer no envio?
Eu sei que existe uma maneira de força bruta para essa abordagem, onde acompanho cada validador e seu AccordionPane associado, mas esperava uma solução melhor que pudesse lidar com minha situação para um grande número de entradas/validadores e painéis.
Solução
Que tal algo assim (usando JQuery, mas tenho certeza que pode ser convertido em javascript simples)...
$(document).ready(function(){
if (isPostback()){
$.each(Page_Validators, function(index, validator) {
if (!validator.isvalid) {
// do something here to locate the accordion based on the validator
// $(this) is the currently invalid validator element as a jquery object/wrapped set
// so for example...
$(this).parent().slideDown();
// This assumes that the immediate parent of of the validator is the accordion which is unlikely but if you post your emitted html I can write the appropriate selector for you.
}
});
}
});
Como você não quer que ele dispare no carregamento inicial, você pode usar uma técnica como esta Como detectar/rastrear postback em javascript? e verifique se você está em um postback após o document.ready - presumi que você usou o conselho do link e sua função para detecção de postback é chamada isPostback().
Outras dicas
Há um projeto construído para este problema Tente dar uma olhada nisso ... Você também pode baixar a fonte para análise mais detalhes ou usar a mesma base de código se quiser .... http://www.codeproject.com/articles/43397/validando-Compra-e-radpanelbar-usando-Ajax-A
Rich chegou antes de mim, mas aqui está a versão vanilla js (ie9 +):
Page_Validators
.filter(function(v) { return !v.isvalid; })
.forEach(function (v) { console.log(v.parentNode); });
Lembre-se de colocar o código abaixo da tag </form>.Tive problemas ao usar jQuerys document.ready e window.onload, pois ele pode executar o código antes que todo o JavaScript necessário do asp.net seja carregado.
Atualizar:Uma versão mais compatível com o navegador
for(var i = 0; i < Page_Validators.length; i++) {
var validator = Page_Validators[i];
if (!validator.isvalid) {
console.log(validator.parentNode);
}
}