it-swarm.com.ru

ASP.NET Custom Validator Проверка на стороне клиента и на стороне сервера не выполняется

Этого раньше не было, но по какой-то причине события проверки на стороне клиента и на сервере не запускаются:

<asp:TextBox ID="TextBoxDTownCity" runat="server" CssClass="contactfield" />
<asp:CustomValidator ID="CustomValidator2" runat="server" EnableClientScript="true"
    ErrorMessage="Delivery Town or City required"
    ClientValidationFunction="TextBoxDTownCityClient" 
    ControlToValidate="TextBoxDTownCity"
    OnServerValidate="TextBoxDTownCity_Validate" Display="Dynamic" >
</asp:CustomValidator>

Событие проверки на стороне сервера:

protected void TextBoxDTownCity_Validate(object source, ServerValidateEventArgs args)
{
    args.IsValid = false;
}

Событие проверки на стороне клиента:

function TextBoxDCountyClient(sender, args) {
    args.IsValid = false;
    alert("test");
}

Я думал, что по крайней мере проверка на стороне сервера сработает, но нет. это никогда не случалось со мной раньше. Это действительно поставило меня в тупик.

Я посмотрел на вывод, и ASP.NET распознает функцию на стороне клиента:

ASP.NET JavaScript вывод:

var ctl00_ctl00_content_content_CustomValidator2 = document.all ? document.all["ctl00_ctl00_content_content_CustomValidator2"] : document.getElementById("ctl00_ctl00_content_content_CustomValidator2");

ctl00_ctl00_content_content_CustomValidator2.controltovalidate = "ctl00_ctl00_content_content_TextBoxDTownCity";

ctl00_ctl00_content_content_CustomValidator2.errormessage = "Delivery Town or City required";

ctl00_ctl00_content_content_CustomValidator2.display = "Dynamic";

ctl00_ctl00_content_content_CustomValidator2.evaluationfunction = "CustomValidatorEvaluateIsValid";

ctl00_ctl00_content_content_CustomValidator2.clientvalidationfunction = "TextBoxDTownCityClient";

Предоставленный пользовательский валидатор:

<span id="ctl00_ctl00_content_content_CustomValidator2" style="color:Red;display:none;">Delivery Town or City required</span> 

Может ли кто-нибудь пролить свет на то, почему проверка на стороне клиента и сервера не будет запускаться?.

Правка: опечатка я вставил не в ту функцию, проблема все та же

Еще одно обновление последнего комментария: где TextBox не может быть пустым. Я проверил это, и это не так. На пустой странице CustomValidator включил мою функцию проверки на стороне клиента без значения:

<asp:TextBox ID="TextBox1" runat="server" />
<asp:CustomValidator ID="CustomValidator1" runat="server" 
ErrorMessage="CustomValidator" ClientValidationFunction="TextBoxDAddress1Client"></asp:CustomValidator>
<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
67
REA_ANDREW

Ваша CustomValidator сработает только тогда, когда TextBox не пуст.

Если вам нужно убедиться, что он не пустой, вам понадобится также RequiredFieldValidator .

Примечание: Если элемент управления вводом пуст, никакие функции проверки не вызываются и проверка прошла успешно. Использовать Требуется элемент управления FieldValidator для потребовать от пользователя ввода данных в входной контроль.

Правка:

Если в вашем CustomValidator указан атрибут ControlToValidate (а в вашем первоначальном примере), то ваши функции проверки будут вызываться только тогда, когда элемент управления не пуст.

Если вы не укажете ControlToValidate, ваши функции проверки будут вызываться каждый раз.

Это открывает второе возможное решение проблемы. Вместо использования отдельной RequiredFieldValidator, вы можете опустить атрибут ControlToValidate из CustomValidator и настроить свои функции проверки на что-то вроде этого:

Код на стороне клиента (Javascript):

function TextBoxDCountyClient(sender, args) {
    var v = document.getElementById('<%=TextBoxDTownCity.ClientID%>').value;
    if (v == '') {
        args.IsValid = false;  // field is empty
    }
    else {
        // do your other validation tests here...
    }
}

Код на стороне сервера (C #):

protected void TextBoxDTownCity_Validate(
    object source, ServerValidateEventArgs args)
{
    string v = TextBoxDTownCity.Text;
    if (v == string.Empty)
    {
        args.IsValid = false;  // field is empty
    }
    else
    {
        // do your other validation tests here...
    }
}
109
LukeH

Использовать этот:

<asp:CustomValidator runat="server" id="vld" ValidateEmptyText="true"/>

Для проверки пустого поля.

Вам не нужно добавлять 2 валидатора!

121
Carl Nielsen

Проверка подлинности на стороне клиента вообще не выполнялась в моей веб-форме, и я понятия не имел, почему. Оказывается, проблема в том, что имя функции javascript совпадает с идентификатором элемента управления сервера. 

Так что вы не можете сделать это ...

<script>
  function vld(sender, args) { args.IsValid = true; }
</script>
<asp:CustomValidator runat="server" id="vld" ClientValidationFunction="vld" />

Но это работает:

<script>
  function validate_vld(sender, args) { args.IsValid = true; }
</script>
<asp:CustomValidator runat="server" id="vld" ClientValidationFunction="validate_vld" />

Я предполагаю, что это противоречит внутреннему .NET Javascript?

4
Bill Gates

Вы проверили, что для элемента управления, вызывающего обратную запись, установлено CausesValidation, равное true, и что ему не назначена группа проверки?

Я не уверен, что еще может вызвать такое поведение.

3
Daniel

Также убедитесь, что вы не используете группы валидации, так как эта валидация не сработает, если свойство validationgroup было установлено и явно не вызывается через

 Page.Validate({Insert validation group name here});
2
ori

Спасибо за эту информацию о ControlToValidate LukeH!

То, что я пытался сделать в своем коде, состояло в том, чтобы гарантировать, что у некоторого текстового поля A есть некоторый текст в поле, когда у текстового поля B есть определенное значение. В противном случае A может быть пустым или как угодно. Избавление от ControlToValidate = "A" в моей разметке исправило проблему для меня.

Ура!

0
doddy

Проверка на стороне сервера не сработает, если проверка на стороне клиента недопустима, обратная передача не отправляется.

У вас нет другой проверки, которая не проходит?

Проверка на стороне клиента не выполняется, поскольку вы указали ClientValidationFunction="TextBoxDTownCityClient", и в качестве функции проверки будет найдена функция с именем TextBoxDTownCityClient, но имя функции должно быть TextBoxDAddress1Client

(как вы написали)

0
Davide Vosti