我正在使用向导,用户可以在其中注册。有一个asp:RadioButtonList有两个选项,当radiobutton改变时,向导中的一些输入字段会改变。在每个字段上都有一些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);
}
});
});
那么,任何想法都有什么不对?
答案 0 :(得分:15)
我发现更好的选择是简单地使用:
document.getElementById("<%=myValidator.ClientID %>").enabled = true;
上面建议的ValidatorEnabled选项会自动调用链接控件的验证,在我的情况下会显示错误消息“请输入卖家名称的值”,这是不必要或不需要的。
使用“.enabled = true”选项不会。
答案 1 :(得分:11)
验证程序的客户端API为here。
您可能能够适应您的需求(这将通过客户端脚本禁用所有验证器):
if (Page_Validators) {
PageValidators.forEach(function(pageValidator) {
if (pageValidator == null) {return;}
vldGrp = pageValidator.validationGroup;
ValidatorEnable(pageValidator, false);
});
};
因此,您可以添加if
块来检查验证器名称,或者更多,以便.controlToValidate
返回验证器的目标ID - 然后禁用它:
if (Page_Validators) {
PageValidators.forEach(function(pageValidator) {
if (pageValidator == null) {return;}
if (pageValidator.controltovaliddate != "<%= txtNumber2.ClientID %>") {
return;
}
ValidatorEnable(pageValidator, false);
});
};
如果你不需要检查任何进一步的验证器,你也应该在循环中添加一个中断。您可以使用.some
instead of .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 :(得分:2)
对“RadioButtonList1”使用CustomValidator控件,并将控件可见性逻辑与另一个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's 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>
答案 3 :(得分:0)