Como evitar que a função code behind seja ativada com js

Oct 11 2020

O problema:

Eu tenho um formulário com uma função code behind e também faço algumas validações js e não quero que a função code behind funcione se o js retornar falso. Eu tentei usar OnClientClick e retornar falso no final da função, mas não funcionou.

aspx:

<asp:Button ID="Button1" runat="server" 
  CssClass="action-button" 
  OnClientClick="return updateValidation();"  
  OnClick="Button1_Click" Text="Update" />

Código por trás:

public partial class Update : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if(!Page.IsPostBack && Session["user"] != null)
        {

            UserService us = new UserService();
            string id = Session["user"] as string;
            string selectQuery = "SELECT * FROM users WHERE ID = '" + id + "'";
            DataTable table = us.ExecuteDataTable(selectQuery);

            SignUpName.Value = table.Rows[0]["fName"] as string;
            SignUpLastName.Value = table.Rows[0]["lName"] as string;
            email.Value = table.Rows[0]["email"] as string;
            birthDate.Value = table.Rows[0]["birthDate"] as string;
            city.Value = table.Rows[0]["city"] as string;
            address.Value = table.Rows[0]["address"] as string;
            zipCode.Value = table.Rows[0]["zipcode"] as string;
            Password.Value = table.Rows[0]["userPassword"] as string;
        }

    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        
            string id = Session["user"] as string;
            string fName = SignUpName.Value.ToString();
            string lName = SignUpLastName.Value.ToString();
            string UserbirthDate = birthDate.Value.ToString();
            string Usercity = city.Value.ToString();
            string UserAddress = address.Value.ToString();
            string UserZipCode = zipCode.Value.ToString();
            string UserEmail = email.Value.ToString();
            string userPassword = Password.Value.ToString();
            UserService us = new UserService();
            User u = new User(fName, lName, id, UserbirthDate, Usercity, UserAddress, UserZipCode, UserEmail, userPassword);

            us.UpdateUser(u);
        
    }
}

Javascript:

function updateValidation() {        

    window.check = true;
    checkFName();
    checkLName();
    checkEmail();
    checkBrithDate();
    checkCity();
    checkAddress();
    checkZipCode();
    checkPassword();

    return check;

}

Eu já tentei retornar false no final do js em qualquer caso, mas também não funcionou.

Respostas

1 JamshaidK. Oct 12 2020 at 04:14

O código está bem estruturado e sua window.checkvariável tem um booleanvalor, mas em vez disso, você está retornando uma variável chamada checkque não vejo declarada ou sendo modificada em qualquer lugar em seu exemplo de código. O que significa que a checkvariável não tem um booleanvalor, pelo contrário, tem undefinedou está nullnele.

Vejo:

function updateValidation() {
    window.check = true;
    checkFName();
    checkLName();
    checkEmail();
    checkBrithDate();
    checkCity();
    checkAddress();
    checkZipCode();
    checkPassword();
    // Instead of just returning check, return window.check
    return window.check;

}

Se isso também não funcionar, então é certo que o booleané sempre o trueque não impede a postagem de volta.

Além disso, você pode usar jquerypara vincular o evento, que é minha maneira preferida de vincular os eventos:

<asp:Button ID="Button1" runat="server" 
  CssClass="action-button" 
  OnClick="Button1_Click" Text="Update" />

$(document).ready(function(){ $('#<%= Button1.ClientID %>').on('click', function(){
        window.check = true;
        checkFName();
        checkLName();
        checkEmail();
        checkBrithDate();
        checkCity();
        checkAddress();
        checkZipCode();
        checkPassword();
        // Instead of returning check, return window.check
        return window.check;
    });
    // Your Javascript functions go here...
});

Observe, removi o OnClientClickevento da marcação do botão e vinculei o evento diretamente ao elemento, o que é melhor do que retornar o booleanvalor duas vezes, um no próprio método e o segundo na marcação do botão.


ATUALIZAR

Suspeito que seu window.checkobjeto seja indefinido. É por isso que ele está retornando um valor em undefinedvez de um valor booleano. Eu recomendo que você substitua window.checkpor apenas uma variável global checkcomo abaixo:

$(document).ready(function(){ var check; // declare a variable named check in global scope to the click event $('#<%= Button1.ClientID %>').on('click', function(){
        check = true; // set the initial value
        checkFName();
        checkLName();
        checkEmail();
        checkBrithDate();
        checkCity();
        checkAddress();
        checkZipCode();
        checkPassword();
 
        return check; // return the variable check instead of window.check
    });
    // Your Javascript functions go here...
});
TomerLevitski Oct 11 2020 at 23:02

Você deve chamar a função Button1_Click após a função updateValidaton. Você pode fazer isso da seguinte maneira: No elemento de botão, substitua o Button1_Click pela função myFunction (ou qualquer que seja você e ele a ser chamado). Então: function myFunction () {if (updateValidation ()) Button1_Click (); }

Ele chamará a função Button1_Click somente se a validação retornar verdadeiro.