我在ASP.NET WebForms页面上发现了一个非常奇怪的行为。我有一些输入控件,分配了一个或多个验证器。
TextBox
输入控件的简化示例:
<asp:TextBox ID="TextBoxX" runat="server"
CausesValidation="True"></asp:TextBox>
<asp:RequiredFieldValidator ID="V1" runat="server"
ControlToValidate="TextBoxX"
ErrorMessage="blah blah"
EnableViewState="False" />
<asp:RangeValidator ID="V2" Type="Integer" runat="server"
ControlToValidate="TextBoxX"
ErrorMessage="blah blah"
MinimumValue="0" MaximumValue="9999"
EnableViewState="False" />
<asp:CustomValidator ID="V3" runat="server"
ErrorMessage="blah blah"
OnServerValidate="MyCustomValidateMethod"
EnableViewState="False"
EnableClientScript="False" />
有意将EnableViewState设置为false以保持网络负载较低。 V3是感兴趣的。在服务器上,我的自定义方法将根据值的合理性进行验证。
protected void MyCustomValidateMethod(object source, ServerValidateEventArgs args)
{//...}
到此为止,一切都按预期工作。但是我还有一个复选框,允许用户在显示警告后明确覆盖合理性检查。
<asp:CheckBox ID="CheckBoxOverride" runat="server" Text="You can override here!"
AutoPostBack="True"
CausesValidation="True" />
选中/取消选中CheckBox
会导致回发按预期方式,但验证器(尤其是“V3”)仅在选中该复选框时调用,而不是在未选中时调用!< /强>
导致这种奇怪行为的原因是什么以及如何解决?
以下是一些更多信息:
Page.Validate();
,但这对我来说似乎很脏,然后在检查复选框时调用验证器两次。答案 0 :(得分:1)
由于似乎没有解决方案,我帮助自己解决了一个问题:CheckBox将不再导致验证,但会触发对更改的回发:
<asp:CheckBox ID="CheckBoxOverride" runat="server" Text="You can override here!"
AutoPostBack="True"
oncheckedchanged="Override_CheckedChanged" />
然后,在更改处理程序中,调用验证:
protected void Override_CheckedChanged(object sender, EventArgs e) {
Page.Validate();
}
现在按预期工作。
答案 1 :(得分:0)
您需要将ValidateEmptyText
设置为true
。
您是否遗漏了ControlToValidate
上的CustomValidator
?
答案 2 :(得分:0)
您是否尝试将控件组合在一起?将ValidationGroup放在它们上面。