Publicado por: blogdoneilor em: julho 9, 2009
Olá!
Para apresentar uma caixa de confirmação no cliente antes de um formulário ser processado pelo servidor, no caso de um postback (submit para o mesmo script), estamos acostumados a usar um javascript no evento OnClientClick do botão:
<asp:Button ID="Button1" runat="server" Text="Button" OnClientClick="return confirm('Enviar formulário?')" PostBackUrl="default.aspx"/>
Acontece que, quando o formulário tem que ser processado por outro script (cross-page postback), esta instrução não funciona pois, quando você confirma o envio é feito um postback comum, e não acontece o redirecionamento ao script desejado. À primeira vista é uma situação estranha e você pode passar alguns minutos tentando descobrir se há algo errado no javascript, mas não vai encontrar.
Isso acontece porque, nos casos de cross-page postback, o asp.net implementa scripts de cliente para o redirecionamento do formulário, gerando o seguinte código html:
<input type="submit" name="Button1" value="Button" onclick="return confirm('Enviar formulário?');WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("Button1", "", false, "", "default.aspx", false, false))" id="Button1" />
Neste código, podemos perceber que a primeira instrução só faz um return do resultado do confirm para o documento e cancela a instrução seguinte.
A solução é implementar o confirm dessa forma:
<asp:Button ID="Button1" runat="server" Text="Button" OnClientClick="if(!confirm('OK?'))return false;" PostBackUrl="default.aspx"/>
Dessa forma, só há o return se o visitante clicar em “cancel”, do contrário, o post do formulário é executado normalmente.
Uma coisa estranha que acontece quando o confirm é inserido num script que tenha validação do asp.net, é pedir a confirmação de envio do form e depois a validação exigir preenchimento de alguns campos.
*Eu vi aqui, no Joteke’s Blog
Abraços!