ボタンをクリックしたときにJSFを使用してJSR-303 Bean検証をスキップする方法はありますか?JSF 2.0:JSR-303 Bean検証をスキップするにはどうすればよいですか?
ビット長い質問形式でリストを考えてみましょう...いくつかのアプローチを説明する:
<h:form id="form">
<h:commandButton value="Add row">
<f:ajax execute="foo" listener="#{bean.add()}" render="foo" />
</h:commandButton>
<h:dataTable id="foo" var="foo" value="#{bean.foos}">
<h:column>
Name: <h:inputText id="field" value="#{foo.name}" required="true" />
<h:messages for="field" />
</h:column>
<h:column>
<h:commandButton value="Remove">
<f:ajax execute=":form:foo" listener="#{bean.remove(foo)}" render=":form:foo" />
</h:commandButton>
</h:column>
</h:dataTable>
</h:form>
ユーザーがクリック追加または行を削除すると、アクションは、検証せずに実行する必要があります。問題は、JSFがリスト全体を再レンダリングし、リストを検証しようとすることです。検証を行わないドラフト変更がある場合、検証エラーが発生し、リスナー・メソッドは決して呼び出されません(検証が失敗するとそれが防止されるため)。ただし、immediate="true"
をf:ajaxに追加すると、検証エラーが発生してもメソッドを実行することができます。ただし、引き続き検証エラーが発生し、ここに表示されます。
私は2つのオプションを参照してください。
1)=「true」を即時使用し、検証エラーに非検証ボタンの
を示していない、=「真」と時間即時設定:メッセージが行います。その後
<h:messages rendered="#{param['SHOW_VALIDATION']}" />
は、そのパラメータを送信するために(つまり、実際にフォームを保存しようとする必要があります)保存ボタンを設定します。
<h:commandButton>
<f:param name="SHOW_VALIDATION" value="true" />
</h:commandButton>
これにより検証が行われますが、メッセージはSHOW_VALIDATION
パラメータが存在する場合を除いて表示されません。
2)は条件付きフェイスレットで検証を宣言します。
<h:inputText>
<f:validateRequired disabled="#{!param['VALIDATE']}" />
</h:inputText>
し、保存ボタンを:
<h:commandButton>
<f:param name="VALIDATE" value="true" />
</h:commandButton>
これはVALIDATE
パラメータが存在する場合にのみ、検証するフィールドを起こし(=たら、Saveボタン押されている)。
しかし、これらはハックのように思えます。単純にJSR-303 Bean検証を使用することはできますが、宣言されている場合はスキップしますか?
まあ、私はJSR-303やfaceletsとJSF以外の検証ソリューションを試していません。私はこの問題がJSF関連であり、JSF-303の誤りではないと思います。JSFで検証をスキップすることを「ネイティブに」忘れていたようです。この周りに多くの混乱があるようです... –