ASP.NET Пользовательский валидатор Клиентская сторона и проверка на стороне сервера не срабатывают

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

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

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

Редактировать: Typo Я вставил в неправильную функцию, проблема все еще такая же

Еще одно обновление последнего комментария: где 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" />

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

Чтобы проверить пустое поле.

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

Проверка на стороне сервера не срабатывает, если проверка на стороне клиента недействительна, postback не отправляется.

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

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

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

Ответ 7

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

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

Ура!