Como desativar a postagem em um botão asp

135

Eu tenho um botão asp. É do lado do servidor, por isso só posso mostrá-lo para usuários logados, mas quero que ele execute uma função javascript e parece que quando runat = "server" sempre chama o evento de postagem.

Eu também tenho um botão regular ( <input...>) não rodando no servidor e funciona bem ...

Como posso fazer com que este botão execute apenas o javascript e não a postagem?

dkarzon
fonte

Respostas:

263

Faça com que seu javascript retorne falso quando terminar.

<asp:button runat="server".... OnClientClick="myfunction(); return false;" />
womp
fonte
16
Em muitos casos, as pessoas usam um onclick ou OnClientClick com esta sintaxe <asp: Button OnClientClick = "myFunction ()" /> onde myFunction () retorna false e isso não é suficiente - você precisa usar OnClientClick = "return myFunction ()"
Bron Davies
17
Eu tive que adicionar UseSubmitBehavior = "false", bem como; return false
Rob
9
Certifique-se de adicionar 'CausesValidation = "false"', caso contrário, ele adicionará 'WebForm_DoPostBackWithOptions' e um monte de marcação extra.
Carter Medlin
Isso não funcionou para mim no ASP.NET 4+, no entanto, a resposta de Konstantin simplesmente OnClientClick="return false"funcionou.
TylerH 31/05/19
39
YourButton.Attributes.Add("onclick", "return false");

ou

<asp:button runat="server" ... OnClientClick="return false" />
Konstantin Tarkus
fonte
15

Você pode usar a ação jquery click e usar a função preventDefault () para evitar postback

<asp:button ID="btnMyButton" runat="server" Text="MyButton" />


$("#btnMyButton").click(function (e) {
// some actions here
 e.preventDefault();
}
Rameez
fonte
Essa é uma resposta elegante, pois permite testar as condições para desativar.
John Mott
1
Nunca use preventDefault, pois ele interromperá outros eventos que dependem desse evento -1
Piotr Kula
1
@ppumkin: preventDefault é uma ótima maneira de dizer aos ouvintes de outros eventos que você lidou com esse evento para que eles não precisassem fazê-lo. Acho que o que você quis dizer foi stopPropagation, que de fato impede o evento de ser ouvido por outros ouvintes do evento.
Sebbas 9/04/19
Yeaaaaaaaaaa. não. 4 anos depois e eu estou por trás disso ainda mais agora. Só não faça nada disso.
Piotr Kula
8

Considere isto.

<script type="text/javascript">
Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(BeginRequest);
function BeginRequest(sender, e) {
    e.get_postBackElement().disabled = true;

}
     </script>
Ramakrishnankt
fonte
6

Os outros estão certos de que você precisa que seu retorno de chamada retorne falso; no entanto, gostaria de acrescentar que fazer isso configurando o onclick é uma maneira antiga e feia de fazer as coisas. Eu recomendo a leitura sobre javascript discreto . Usar uma biblioteca como o jQuery pode facilitar sua vida e o HTML menos acoplado ao seu javascript (e o jQuery é suportado pela Microsoft agora!)

Neil Williams
fonte
4

O ASP.NET sempre gera asp:Button como um input type=submit.
Se você deseja um botão que não publique, mas precise de algum controle para o elemento no lado do servidor, crie uma entrada HTML simples com os atributos type=buttone runat=server.

Se você desativar as ações de clique OnClientClick=return false, isso não fará nada com o clique, a menos que você crie uma função como:

function btnClick() {
    // do stuff
    return false;
}
Aristides Darlan
fonte
3

Você não diz qual versão do .NET framework você está usando.

Se você estiver usando a versão 2.0 ou superior, poderá usar a propriedade OnClientClick para executar uma função Javascript quando o evento onclick do botão for disparado.

Tudo o que você precisa fazer para impedir a ocorrência de uma postagem do servidor é retornar falseda função chamada JavaScript.

OtisAardvark
fonte
3

adicionalmente para resposta aceita você pode usar UseSubmitBehavior = "false" MSDN

Arbejdsglæde
fonte
Adiciona ASP.NET; __doPostBack(até o final do script de clique do cliente.
IvanH
3

No meu caso, resolvi adicionar retorno no onClientClick:

Código por trás

function verify(){
  if (document.getElementById("idName").checked == "") {
    alert("Fill the field");
    return false;
  }
}

Superfície de design

<asp:Button runat="server" ID="send" Text="Send" onClientClick="return verify()" />
Rafael
fonte
Como executar o OnClickmétodo após isso.
5377037
2

você pode usar o código:

<asp:Button ID="Button2" runat="server"
     Text="Pulsa"
     OnClientClick="this.disabled=true"
     UseSubmitBehavior="False"/>

se nee enviar

...
<form id="form1" runat="server" onsubmit="deshabilita()">
...
<script type="text/javascript">
    function deshabilita()
    {
        var btn = "<%= Button1.ClientID %>";
        if (confirm("Confirme postback"))
        {
            document.getElementById(btn).disabled = true;
            return true;
        }
        return false;
    }
</script>

Elvia Soto
fonte
2

Com validação

Neste exemplo, usei dois controles ddle txtbox, tenho uma codificação feliz

 asp:ScriptManager ID="script1" runat="server" /asp:ScriptManager

    asp:UpdatePanel ID="Panel1" runat="server"
       ContentTemplate

// ASP BUTTON
asp:Button ID="btnSave" runat="server" Text="Save" class="btn btn-success" OnClientClick="return Valid()" OnClick="btnSave_Click"


   /ContentTemplate    
    /asp:UpdatePanel    

  <script type="text/javascript">
        function Valid() {

            if ($("#ctl00_ContentPlaceHolder1_YOUR CONTROL NAME").val() == 0) {
                alert("Please select YOUR TEXT");
                $("#ctl00_ContentPlaceHolder1_YOUR CONTROL NAME").focus();
                return false;
            }

            if ($("#ctl00_ContentPlaceHolder1_YOUR CONTROL NAME").val().length == 0) {
                alert("Please Type YOUR TEXT");
                $("ctl00_ContentPlaceHolder1_YOUR CONTROL NAME").focus();
                return false;
            }
            return true;
        }
</script>
Praneeth
fonte
2

Você pode usar o JQuery para isso

<asp:Button runat="server" ID="btnID" />

do que no JQuery

$("#btnID").click(function(e){e.preventDefault();})
Vikas
fonte