Как предотвратить активацию кода за функцией с помощью js

#javascript #c# #asp.net

#javascript #c# #asp.net

Вопрос:

Проблема:

У меня есть форма с кодом за функцией, и я также делаю некоторые проверки js, и я не хочу, чтобы код за функцией работал, если js возвращает false. Я пытался использовать OnClientClick и возвращать false в конце функции, но у меня не получилось.

aspx:

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

Код за:

 public partial class Update : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if(!Page.IsPostBack amp;amp; 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;

}
  

Я уже пробовал возвращать false в конце js в любом случае, но это тоже не сработало.

Комментарии:

1. ваш код правильный, но на самом деле вы не возвращаете windows.check ! вы возвращаете только check то, что не является false или true. Кроме того, если у вас есть какие-либо ошибки javascript, проверка возврата также не работает.

Ответ №1:

Код хорошо структурирован, и ваша window.check переменная имеет boolean значение, но вместо этого вы возвращаете переменную с именем check , которую я не вижу объявленной или изменяемой где-либо в вашем примере кода. Это означает, check что переменная не имеет boolean значения, скорее она имеет undefined или null в нем.

См.:

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

}
  

Если это тоже не сработает, то несомненно, что boolean is всегда true , что не останавливает отправку обратно.

Кроме того, вы можете использовать jquery для привязки события, что является моим предпочтительным способом привязки событий:

 <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...
});
  

Обратите внимание, я удалил OnClientClick событие из разметки кнопки и привязал событие непосредственно к элементу, что лучше, чем возвращать boolean значение дважды, одно в самом методе, а второе в разметке кнопки.


Обновить

Я подозреваю, что ваш window.check объект не определен. Именно поэтому он возвращает undefined вместо логического значения. Я бы рекомендовал вам window.check заменить только глобальную переменную check , как показано ниже:

 $(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...
});
  

Комментарии:

1. Я пробовал это и даже возвращал false в конце js в любом случае, но это все равно не сработало. Код за функцией все еще активируется

2. Пожалуйста, попробуйте проверить значение window.check . Я подозреваю undefined , что именно поэтому CodeBehind запускается.

Ответ №2:

Вы должны вызвать функцию button1_Click после функции updateValidaton . Вы можете сделать это следующим образом: в элементе button замените button1_Click на функцию myFunction (или как угодно, и чтобы она вызывалась). Затем: функция myFunction(){ if (updateValidation()) button1_Click(); }

Он вызовет функцию button1_Click только в том случае, если проверка вернет true .

Комментарии:

1. js. Я не думаю, что вы можете вызвать функцию js из-за

2. но onClick также работает с функциями js ..? не только onclientclick ?

3. он возвращает ошибку о том, что на моей странице нет определения для myFunction

Ответ №3:

Измените ASPX на следующий (обратите внимание на event переданный в функцию JS и удаленный return ):

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

Если window.check это глобальный параметр bool, проверьте его в функции JS и предотвратите событие отправки (обратите внимание на event ):

 function updateValidation(event) {        

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

    if (window.check == false) {
        event.preventDefault();
    }

    return check;
}
  

Как правило, для достижения этой цели вы должны использовать встроенные средства проверки веб-форм, вы можете прочитать об этом здесь: https://www.codemag.com/Article/0307101/Validating-Data-On-Web-Forms

Комментарии:

1. Я скопировал ваш код, но код за функцией все еще активируется в любом случае.

2. @nettqbbrq убедитесь, что значение window.check переменной равно false, иначе оно не войдет в if инструкцию.

3. Я даже пытался выполнить event.preventDefault(); если это не false и это не сработало

4. @nettqbbrq если все, что вы хотите, это запретить отправку кнопки во всех случаях, то переместите event.preventDefault() внешнюю часть if инструкции или даже в качестве первого оператора в функции JS, убедитесь, что вы скопировали код ASPX

5. но как я могу сделать это вне оператора if, если я хочу, чтобы это происходило только в определенных ситуациях ..?