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" в моей отметке устраняет проблему для меня.
Ура!