Включить/отключить asp: валидаторы с помощью jquery
Я работаю с мастером, где пользователь может зарегистрироваться. Существует asp: RadioButtonList с двумя параметрами, и некоторые из полей ввода в мастере меняются при изменении радиоблока. В каждом поле есть некоторые asp: Validators (asp: RequiredFieldValidator, например). Проблема в том, что когда пользователь отправляет страницу, валидатор для скрытого текстового поля все еще появляется.
Во-первых, вот теги div, которые меняют показанные текстовые поля и RadioButtonList
<div id="divTxt1">
<asp:TextBox runat="server" CssClass="text" ID="txtNumber"
type="number"/>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1"
runat="server" ControlToValidate="txtNumber" EnableClientScript="true" ErrorMessage="Error" ToolTip="Error">*
</asp:RequiredFieldValidator>
</div>
<div id="divTxt2">
<asp:TextBox runat="server" CssClass="text" ID="txtNumber2"
type="number"/>
<asp:RequiredFieldValidator ID="RequiredFieldValidator2"
runat="server" ControlToValidate="txtNumber2" EnableClientScript="true" ErrorMessage="Error2" ToolTip="Error2">*
</asp:RequiredFieldValidator>
</div>
<div id="radio">
<asp:RadioButtonList ID="RadioButtonList1" runat="server" RepeatDirection="Horizontal">
<asp:ListItem Value="1" Selected="True">Privat</asp:ListItem>
<asp:ListItem Value="2">Offentlig</asp:ListItem>
</asp:RadioButtonList>
</div>
Я попытался его решить, используя JQuery, как показано ниже, который я прочитал, чтобы сделать трюк, но, к сожалению, это не так:
$(document).ready(function () {
$('#<%= WizardStep1.ContentTemplateContainer.FindControl("RadioButtonList1").ClientID %> input').change(function () {
if ($(this).val() == "1") {
$('#txtNumber').toggle('fast');
$('#txtNumber2').toggle('fast');
ValidatorEnable($('#<%=WizardStep1.ContentTemplateContainer.FindControl("RequiredFieldValidator1").ClientID %>')[0], false);
ValidatorEnable($('#<%=WizardStep1.ContentTemplateContainer.FindControl("RequiredFieldValidator2").ClientID %>')[0], true);
}
if ($(this).val() == "2") {
$('#txtNumber').toggle('fast');
$('#txtNumber2').toggle('fast');
ValidatorEnable($('#<%=WizardStep1.ContentTemplateContainer.FindControl("RequiredFieldValidator2").ClientID %>')[0], false);
ValidatorEnable($('#<%=WizardStep1.ContentTemplateContainer.FindControl("RequiredFieldValidator1").ClientID %>')[0], true);
}
});
});
Итак, какие-то идеи, что неправильно?
Ответы
Ответ 1
API-интерфейс клиентской стороны для валидаторов здесь.
Что-то, что вы сможете адаптировать к вашим потребностям (это отключит все валидаторы с помощью клиента script):
if (Page_Validators) {
PageValidators.forEach(function(pageValidator) {
if (pageValidator == null) {return;}
vldGrp = pageValidator.validationGroup;
ValidatorEnable(pageValidator, false);
});
};
Итак, вы можете добавить блок if
, чтобы проверить имя валидатора, или, более того, .controlToValidate
, который возвращает целевой идентификатор проверяющего, а затем отключить его:
if (Page_Validators) {
PageValidators.forEach(function(pageValidator) {
if (pageValidator == null) {return;}
if (pageValidator.controltovaliddate != "<%= txtNumber2.ClientID %>") {
return;
}
ValidatorEnable(pageValidator, false);
});
};
Вероятно, вы также должны добавить разрыв в цикле, если он правильный, если вам не нужно проверять какие-либо дополнительные валидаторы. Вы можете использовать .some
вместо .forEach
для раннего выхода:
if (Page_Validators) {
PageValidators.some(function(pageValidator) {
if (pageValidator == null) {return false;}
if (pageValidator.controltovaliddate != "<%= txtNumber2.ClientID %>") {
return false;
}
ValidatorEnable(pageValidator, false);
return true;
});
};
Вы можете инкапсулировать это в функцию:
var validatorState = function(element, isEnabled) {
if (Page_Validators) {
PageValidators.some(function(pageValidator) {
if (pageValidator == null) {return false;}
if (pageValidator.controltovaliddate != "<%= txtNumber2.ClientID %>") {
return false;
}
ValidatorEnable(pageValidator, false);
return true;
});
};
};
и используйте:
validatorState('txtCancellationReson', true);
или
validatorState($('#txtCancellationReson').attr('id'), true);
Ответ 2
Я нашел лучший вариант - просто:
document.getElementById("<%=myValidator.ClientID %>").enabled = true;
Параметр ValidatorEnabled, как было предложено выше, автоматически вызывает проверку связанного элемента управления, и в моем случае отображается сообщение об ошибке "Пожалуйста, введите значение для имени продавца", которое не было необходимым или желательным.
Использование опции ".enabled = true" не работает.
Ответ 3
используйте элемент управления CustomValidator для "RadioButtonList1" и отдельные элементы управления видимой логикой для другой функции javascript.
<div id="divTxt1">
<asp:TextBox runat="server" CssClass="text" ID="txtNumber" type="number"/>
</div>
<div id="divTxt2">
<asp:TextBox runat="server" CssClass="text" ID="txtNumber2"
type="number"/>
</div>
<div id="radio">
<asp:RadioButtonList ID="RadioButtonList1" runat="server" RepeatDirection="Horizontal" onchange:"javascript:toogleTexxBoxesVisibility(this);">
<asp:ListItem Value="1" Selected="True">Privat</asp:ListItem>
<asp:ListItem Value="2">Offentlig</asp:ListItem>
</asp:RadioButtonList>
<asp:CustomValidator ID="CustomValidator1" runat="server" ClientValidationFunction="clientSideValidationFunction" ControlToValidate="RadioButtonList1" OnServerValidate="CustomValidator1_ServerValidate" Text="Validation Error Message">asp:CustomValidator>
<script type="text/javascript">
function clientSideValidationFunction(source,arguments)
var inputvalue = arguments.Value; //RadioButtonList1 value
if (inputvalue == "1" && $('#txtNumber').val() == '') {
arguments.IsValid = false;
}
else if (inputvalue == "2" && $('#txtNumber2').val() == '') {
arguments.IsValid = false;
}
else {
arguments.IsValid = true;
}
};
function toogleTexxBoxesVisibility(radiobutton)
{
if(radiobutton.val =='1')
{
$('#txtNumber').show('fast');
$('#txtNumber2').hide('fast');
}
else if(radiobutton.val =='2')
{
$('#txtNumber').hide('fast');
$('#txtNumber2').show('fast');
}
}
</script>
</div>
Ответ 4
Вы можете отключить валидатор, как описано в этих сообщениях:
http://www.aspdev.org/articles/asp.net-server-controls-disable-validation/
http://www.willasrari.com/blog/use-client-side-javascript-to-disable-aspnet-validators/000289.aspx
С наилучшими пожеланиями