ASP.NET Button não dispara postback

Outros nomes possíveis para este post seriam “ASP.NET Button não funciona” ou “Que m**** que está acontecendo com meu formulário?”. De qualquer forma, este post será bem rápido. O objetivo é listar algumas causas comuns que fazem com que botões parem de funcionar com ASP.NET Webforms. Não há nenhuma mágica ou bug conhecido, apenas falta de atenção ou prática com a construção de formulário com este padrão de desenvolvimento web da plataforma .NET. Acredito que este post será vivo, ou seja, irei colocando mais conteúdo conforme for descobrindo mais causas para este problema.

O Problema

O problema é simples e objetivo: você tem um formulário ASP.NET com um botão. Você clica no botão e o que deveria acontecer não acontece. Claro, tem algumas variações, que podemos chamar de sintomas. Para cada sintoma, há um remédio diferente.

A tela apresenta um erro

Se a tela apresenta um erro em ASP.NET, considere-se com sorte pois geralmente os erros são muito bons em dizer onde está o problema. Alguns erros comuns incluem você estar com sua tag ASP.NET mal formada, como falta de runat=”server” ou similar. Dê uma revisada nas linhas do seu ou .cs conforme mencionado no erro e acredito que não terá problemas.

Um erro comum de funcionamento de botão é quando utilizamos eles dentro de algum controle de repetição, como Repeater. Em geral os programadores esquecem que colocando o comportamento de carregar o repeater dentro do Page_Load, o mesmo será chamado toda vez acontecer algum postback, inclusive quando um botão é clicado. Por isso, é uma boa prática colocar uma verificação no Page_Load para somente carregar se não for um postback. Mas o que isso tem a ver com problemas de botão? Quando a página carrega a primeira vez e o botão é renderizado, ele possui um identificador único no ViewState, que, caso seja recarregada a tela, será alterado. Com isso, o botão que originalmente chamou o postback não existe mais e a chamada fica como se fosse anônima ou “injetada”, o que é uma violação de segurança do ASP.NET que causará um erro.

A tela não apresenta erro

Aqui que mora o problema, quando estamos às cegas com um botão não funcionando. Uma dica é, usando o Google Chrome, abrir as ferramentas (F12) e ver no Console se não tem algum erro de Javascript. Isso é bem comum quando usamos UpdatePanel, que por padrão suprime os erros da página. Em geral os erros de Ajax não são muito esclarecedores, mas basta executar tudo novamente com F5, para depurar, que se acontecer o erro novamente o depurador do Visual Studio vai te levar até a linha do erro.

Às vezes o ASP.NET não apresenta erro pois de fato não existe erro. Ou seja, é algum problema de lógica ou algo Javascript seu que está bloqueando a execução do botão. Veja se seu botão não possui um OnClientClick definido, pois se caso possuir, tenha certeza de que o método Javascript associado retorna true para garantir a continuidade da execução do botão. Ainda no assunto Javascript, revise se na sua página não existe alguma tag script mal formada, lembrando que a tag script sempre deve ser fechada com o padrão “>” e jamais com a versão enxuta “/>”, caso contrário lhe trará problemas. Sim isso é muito idiota, mas acontece, então se liga!

Um último adendo cabe aos ASP.NET Validators. Por padrão os Validators, como o RequiredFieldValidator, fazem a validação via Javascript antes de qualquer postback, e caso tenha qualquer problema em sua página impedirá que o postback aconteça. Se você usa validadores em qualquer ponto de seu formulário, pode ser uma boa verificar se não são eles que estão impedindo seu botão de funcionar. Esse ponto se torna ainda mais importante caso você esteja usando WebUserControls na sua página, pois às vezes eles estão escondidos, como em modais, mas mesmo assim com seus Validators ativos, impedindo o postback da página. Uma ideia pode ser dizer que seu botão não causa validação, definindo a propriedade CausesValidation para false. Isso claro, se o click do seu botão não for interferir com os demais dados do seu formulário.

Espero ter ajudado.

Tem mais algum caso em que seu botão não funciona e que deseja compartilhar? Outro detalhe que deixei passar? Escreva nos comentários!

Publicado por

Luiz Duarte

Pós-graduado em computação, professor, empreendedor, autor, Agile Coach e programador nas horas vagas.