4

私が念頭に置いている特定のケースは次のとおりです。 AjaxFormComponentUpdatingBehavior("onchange") がフォームの TextField に追加されます。このビヘイビアーは、メッセージを表示する(または既に表示されている場合は非表示にする) ことに基づいて、特定の条件(モデル オブジェクトまたはフォーム コンポーネント モデルのいずれかは関係ありません) についてテキストを検証します。

問題は、TextField にバリデーターが追加されていることです。可能性のある (そして可能性の高い) シナリオの 1 つは、ユーザーが最初にAJAX 要求によってメッセージを表示させる値を入力することです。その後、検証に合格しない値を入力すると、メッセージは消えるはずですが、そうではありません。

どうやら、AJAX 動作の onUpdate() メソッドがまったく呼び出されていないか、検証されていないエントリのチェックを挿入しようとして失敗しています(null 値と空の文字列の両方をテストしようとしましたが、データが無効な場合に、Wicket のバリデーターがモデルに対して正確に何を行うかはわかりません)。

バリデーター(または実際にはAJAX)を実際に理解している人が、問題がどこにあるのかについて何か考えがあるかどうか疑問に思っています。

これはバリデーターと AJAX を結びつける一般的な問題ではなく、プログラミングのミスである可能性が高いと誰かが私に言った場合、私は編集とコードを投稿できます。私はまだ前者を信じているので、API/理論的なフレームでの議論を維持するために、コード セクションの投稿は控えます。

ありがとう。

4

1 に答える 1

8

を使用するAjaxFormComponentUpdatingBehavior場合、 のいずれかがIValidator検証に失敗すると、 のonError()代わりに が呼び出されますonUpdate()。Wicket は、無効なユーザー入力がコンポーネントの s に到達するのを効果的に防止するIModelため、コンポーネントの ModelObject はまったく変更されません。無効な入力は、おそらくgetInput()/によって引き続き利用可能ですgetConvertedInput()(AJAX シナリオで有効かどうかは不明ですが、従来のフォーム送信では確実です)。

ただし、IFormValidatorこのメカニズムを使用する場合は s が実行されないことに注意してください。無効なユーザー入力を s に持ち込まないgetUpdateModel()ようにオーバーライドし、ユーザー入力が有効であると確信している場合はモデルオブジェクトを手動で設定することに興味があるかもしれません。AjaxFormComponentUpdatingBehaviorIModel

特定のケースに関しては、必要なすべてのロジックを で実行しonError()(または、別の場所からデータを取得する s に依存してModel)、更新が必要なコンポーネントをAjaxRequestTarget. これはおそらく、シナリオに欠けているものです。

于 2012-06-12T08:35:28.640 に答える