1

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 回呼び出されます。
4

3 に答える 3

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();
}

これで期待どおりに動作するようになりました。

于 2013-02-13T11:33:01.180 に答える
0

コントロールをグループ化してみましたか?それらにValidationGroupを配置します。

于 2013-02-13T08:59:04.037 に答える
0

ValidateEmptyTextに設定する必要がありますtrue

にがありませんControlToValidateCustomValidator?

于 2013-02-13T08:51:30.817 に答える