Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

felipe maricato moura

travar botão para evitar mais de uma solicitação.

Recommended Posts

Olá gente, estou com um problema e dei uma solução para ele porém achei que a solução que dei é ruim, gostaria de expor ele aqui para discutirmos.

 

 

Imaginem que temos uma pagina aspx com um formulário neste formulário temos uma textbox e um button o text box cadastra nome e o bottuon chama o evento.

 

Algo do tipo

 

CODE

<form id="form1" runat="server">

 

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>

<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />

</form>

 

E o botão chamando o seguinte evento.

 

CODE

protected void Button1_Click(object sender, EventArgs e)

{

//ROTINA DE INSERT NO BANCO DE DADOS

 

this.TextBox1.Text = "";

 

}

 

Vamos imagar também que esse insert demore 30 segundo o usuário clica no botão aguarda cerca de 30 segundos para que o texto que ele digitou no TextBox1 ser inserido no banco.

 

O problema é que no periodo entre o postback e a comunicação do server com o browser quando se clica no botão se o usuários impacientes clicam mais de uma vez no botão antes do postback acontecer faz com que seja varias vezes seja executado o evento Button1_Click.

 

Se o usuário clicar 6 vezes no batão mesmo antes de primeiro postback o eventos é executado 6 vezes

 

O meu objetivo é que quando o usuário clicar no botão não seja mais possivel clicar no botão até que o evento Button1_Click tenha rodado até o final. Fazendo o evento ser executado somente uma vez sem perigo de duplicar a execução.

 

 

Para isso eu fiz uma gambiara usando sessão algo como

 

CODE

 

protected void Button1_Click(object sender, EventArgs e)

{

int valor = 0;

 

try

{

int valor = Convert.ToInt16(Session["execucoes"]);

 

}

catch

{

valor += 1;

Session["execucoes"] = valor;

 

if (valor == 1)

{

//ROTINA DE INSERT NO BANCO DE DADOS

 

this.TextBox1.Text = "";

}

}

}

 

 

Isso força mesmo que o evento seja executado várias vezes em um postback apenas uma vez ele passe pelo cadastro.

 

 

Sei que isso é um gambiara mau feita do inferno fiz na preça se alguem tiver uma solução melhor e queria discutir agradeço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Movido Plataforma .NET http://forum.imasters.com.br/public/style_emoticons/default/seta.gif Plataforma .NET » Web Applications

 

Como desabilitar o botão logo após o clique nem sempre funciona, uma solução é após o clique habilitar uma div com um panel em cima do seu formulário com a mensagem processando, bloqueando qualquer ação do usuário.

 

Abraços...

Compartilhar este post


Link para o post
Compartilhar em outros sites

É o seguinte, logo abaixo do form eu tenho um campo hidden:

 

<input id="process" name="process" type="hidden" />

 

Eu nao uso os requiredfield validators eu prefiro meu velho js que tá mais que testado.

 

 

no submit eu coloco:

<asp:Button ID="btnSend" CssClass="btnOk" width="100px"
Text="Enviar" CommandName="Insert" runat="server"
OnClientClick="return checkForm('aspnetForm')" OnClick="SendIt"/>

 

ou seja ele aciona meu js pra checar o form

e la no meu js.

 

 

function checkForm(idForm) {
	var objForm=document.getElementById(idForm);
	var len=objForm.length;

	if (objForm.process.value==true) {
		alert('Aguarde, processo em andamento!');
		return false;
		}

quando ele percorrer todo o form e nao retornar ele seta esse campo pra true.

Dessa forma, caso o usuario tente clicar mais de uma vez, vai receber a mensagem do alert acima.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então boa ideia mas esses divs são super lentos e chatos também para o usuário.

 

 

Tu esta te referendo aqueles divs que preenchem a tela toda deixa meio escuro o fundo certo?

 

 

Alguem tem mais alguma idéia de solução?

Compartilhar este post


Link para o post
Compartilhar em outros sites

nao bastaria apenas adicionar o atributo disableButton no evento onclick ?

 

OBJETO.Attributes.Add("onclick", "DisableButton()")

Compartilhar este post


Link para o post
Compartilhar em outros sites

vou testar esta solucao

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.