Como evitar que a função code behind seja ativada com js
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
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...
});
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.