Проверка Javascript перезаписывает ASP.NET валидаторы

#javascript #asp.net #validation #overwrite

#javascript #asp.net #проверка #перезапись

Вопрос:

У меня проблема, которая сводит меня с ума. На моей странице у меня есть одна проверка Javascript и две ASP.NET валидаторы. Результат проверки зависит только от результата Javascript. Это означает, что если Javascript возвращает true, ASP.NET валидаторы не проверяются.

Код Javascript является:

 <script type="text/javascript">

    function Validate() {
        var ddlObj = document.getElementById('<%=ddStatus.ClientID%>');
        var txtObj = document.getElementById('<%=txtComment.ClientID%>');
        if (ddlObj.selectedIndex != 0) {
            if (txtObj.value == "") {
                alert("Any change of Status requires a comment!");
                txtObj.focus();
                return false;
            }
        }
    }
</script>
  

Вместо двух ASP.NET валидаторы — это:

 <td><asp:TextBox runat="server" ID="txtSerialNr" ></asp:TextBox>
<asp:RequiredFieldValidator runat="server" ID="RequiredFieldValidator1" ControlToValidate="txtSerialNr" ErrorMessage="***" />
                        </td>

<td><asp:TextBox runat="server" ID="txtProdName" ></asp:TextBox>
<asp:RequiredFieldValidator runat="server" ID="rfv1" ControlToValidate="txtProdName" ErrorMessage="***"></asp:RequiredFieldValidator></td>
  

Кто-нибудь может помочь? Спасибо

Обновить:

Я вызываю Javascript с помощью кнопки:

     <asp:Button runat="server" ID="btnSubmit" Text="Save New Product" 
style="cursor:hand" OnClick="btnSubmit_Click" />
  

Но я регистрирую атрибут из кода:

 protected void Page_Load(object sender, EventArgs e)
{
    btnSubmit.Attributes.Add("OnClientClick", "return Validate()");
}
  

Ответ №1:

Вы можете запустить проверку на стороне клиента из Validate() функции:

 validate = function(){
    bool isValid = Page_ClientValidate(""); //triggers validation
    if (isValid){
        var ddlObj = document.getElementById("<%=ddStatus.ClientID%>"); 
        var txtObj = document.getElementById("<%=txtComment.ClientID%>"); 
        if (ddlObj.selectedIndex != 0) { 
            if (txtObj.value == "") { 
                alert("Any change of Status requires a comment!"); 
                txtObj.focus(); 
                isValid = false; 
            } 
        } 
    }
    return isValid;
}
  

Разметка:

 <asp:Button runat="server" OnClientClick="return validate();" ... />
  

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

1. Ваше решение казалось идеальным, но оно не работает. Я пробовал много разных комбинаций, но безуспешно. Как я могу проверить, возвращает ли Page_ClientValidate значение true, если я действительно заполняю оба текстовых поля, управляемых ASP.NET валидаторы? Спасибо

2. В какой последовательности вы хотите, чтобы проверка выполнялась?

3. Вы уверены, что это не проблема с корпусом. Моя функция вызывается validated , тогда как ваша Validate . JavaScript очень требователен к корпусу.

4. да, я не копировал / вставлял. Я попробовал ваш код, а также свой, написав ‘function Validate ()’. Сходишь с ума

5. Что происходит? Вы превращаете это в функцию? Я бы предложил добавить оповещения по всей функции, чтобы убедиться, что вы выполняете всю логику. Как должна работать проверка? Должен ли он проверять требуемые поля, а затем запускать вашу пользовательскую логику?

Ответ №2:

Хорошо, здесь есть пара ошибок.

Если вы достаточно обеспокоены выполнением проверки, вы всегда должны выполнять проверку на стороне сервера в дополнение к проверке на стороне клиента. Проверка на стороне клиента очень удобна для пользователя и быстро реагирует, но ее можно обойти, просто установив JavaScript в «off»!

Я не вижу, где вы указали своим элементам управления, какую функцию JavaScript вызывать при проверке? Вы используете RequiredFieldValidators , которые не требуют внешней функции, но затем пытаетесь выполнить пользовательскую проверку с помощью вашей Validate() функции.

Если вы в конечном итоге используете a CustomValidator , вам нужно будет изменить «подпись» вашей функции. Он должен иметь вид

    function validateIt(sender, args){
            var testResult = //your validation test here
            args.IsValid = testResu<
        }
  

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

1. спасибо за ваш ответ. Я знаю, что это должно сопровождаться проверкой на стороне сервера, но это намного проще выполнить. Я предпочитаю, чтобы работала проверка на стороне клиента, а не реализовывать проверку на стороне сервера. О вашей другой проблеме см. Мое обновление

2. Что вам нужно делать, так это использовать a CustomValidator и выполнять всю проверку в этом. Нет смысла иметь RequiredFieldValidator и пользовательскую проверку.