ASP.NET WebForms ページで非常に奇妙な動作を確認しました。1 つまたは複数のバリデータが割り当てられた入力コントロールがあります。
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」のもの) はボックスがチェックされたときにのみ呼び出され、チェックが外されたときには呼び出されません!
この奇妙な動作の原因とその修正方法は?
さらに詳しい情報は次のとおりです。
- .NET 3.5 を使用しています。
- それが重要な場合、ここにあるすべてのものは単一の UpdatePanel 内にあります。
- ポストバックを明示的に呼び出すことができます
Page.Validate();
が、これは私には汚いように見え、チェックボックスがチェックされるとバリデーターが 2 回呼び出されます。