ASP.NETバリデーターを使用してチェックボックスとテキストボックスを比較するエレガントな方法はありますか?
-
01-07-2019 - |
質問
テキストボックスとチェックボックスを含む Asp.Net リピーターがあります。チェックボックスがチェックされている場合、テキストボックスがゼロまたは空白の値のみを受け入れることができることを検証するクライアント側検証を追加する必要があります。
これを達成するために、Asp.Net のバリデーター コントロールを 1 つ以上使用して、クライアント側のエラーを一貫して表示したいと考えています (サーバー側のエラーは別のサブシステムによって処理されます)。
Asp:CompareValidator は、この種の複雑な比較を実行できるほど柔軟性がないようです。そのため、Asp:CustomValidator を検討することになります。
私が直面している問題は、カスタム情報を検証関数に渡す方法がないように見えることです。これは、チェックボックスとテキストボックスの ClientId が実行時に不明であるため、問題になります (これらはリピーターの一部であるため)。
それで...私のオプションは次のようです:
- テキストボックスとチェックボックスを何らかの方法で CustomValidator に渡します(それは不可能のようです)。
- CustomValidator によって渡された引数に基づいて、JavaScript を通じて TextBox を検索します。ClientId があいまいな場合、これは可能でしょうか?
- 検証を完全に忘れて、カスタム JavaScript を発行します (両方の ClientId をカスタム関数に渡すことができます)。
これを実装するより良い方法について何かアイデアはありますか?
解決
最良の方法は、新しいクラスで BaseValidator を継承し、それらの ID を属性としてコントロールに渡すことだと思います。実行時に生成される完全なクライアント側 ID を知らなくても、バリデーター内で ID を解決できるはずです。最初にサーバーで検証するデータを取得し、次にクライアントで検証する必要があります。
他のヒント
CustomValidatorをリピーター内に入れることはできないのでしょうか?そうでない場合は、リピーターがバインドされ、FindControl() が使用されるときに動的に作成できます。
protected MyDataBound(object sender, RepeaterItemEventArgs e) {
(CheckBox)cb = (CheckBox)e.Item.FindControl("myCheckboxName");
(TextBox)tb = (TextBox)e.Item.FindControl("myTextBox");
}
……とか、そういうこと。私は頭からコードを書きました。