ASP.NET Custom Validator Проверка на стороне клиента и на стороне сервера не выполняется - PullRequest
68 голосов
/ 31 марта 2009

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

<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" />

Ответы [ 7 ]

122 голосов
/ 25 августа 2010

Используйте это:

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

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

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

109 голосов
/ 31 марта 2009

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

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

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

EDIT:

Если в вашем 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...
    }
}
4 голосов
/ 16 апреля 2009

Проверка на стороне клиента вообще не выполнялась в моей веб-форме, и я понятия не имел, почему. Оказывается, проблема в том, что имя функции 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?

3 голосов
/ 31 марта 2009

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

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

2 голосов
/ 18 мая 2009

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

 Page.Validate({Insert validation group name here});
0 голосов
/ 19 января 2012

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

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

Ура! * * 1005

0 голосов
/ 31 марта 2009

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

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

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

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

...