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.

Foi útil?

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);
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top