48

複数のフォームがあり、必須フィールドとオプション フィールドがあります。

このようなフォームを送信するには、required-attribute の検証を実行する必要がありますが、これは正常に機能します。このようなフォームをキャンセルimmediate="true"するには、 の属性を使用します。これにより、リクエスト値の適用- フェーズp:commandbutton中にアクションが実行されます (特定のボタンがクリックされたときに検証をスキップする方法は?)。

ただし、大きなフォームの場合、ユーザーに保存ボタンを提供して、後で続行できるようにしたいと考えています。

現在の状態を保存するだけで、必要な属性の検証も無視したいと思います。ただし、immediate="true"JSFライフサイクルが「UpdateModelValues」フェーズに到達しないため、単純な保存方法では何も保存されないため、使用は機能しません。( http://www.javacodegeeks.com/2012/01/jsf-and-immediate-attribute-command.htmlによると)

では、ライフサイクルの半分をスキップせずに、必要なチェックをバイパスするにはどうすればよいでしょうか?

4

6 に答える 6

74

各ボタンは、フォームのメンバーである限り、Param-List 内にエントリを作成します。そのため、「必須」パラメーターにそのエントリが存在するかどうかのチェックを簡単に適用しました。

<h:form id="form" prependId="true">
...
<p:inputText id="someId"
    required="#{param['form:save']==null}" ... />
...
<p:commandButton id="save" value="Save" />
<p:commandButton id="submit" value="Submit" />
<p:commandButton id="cancel" value="Cancel" immediate="true" />
</h:form>

「送信」をクリックするparam['form:save']と isNULLになり、式が に変わり、true検証が実行されます。

「保存」をクリックするparam['form:save']と、 NOT NULL(しかし空です!) に解決されるfalseため、検証は無視されます。(または、式が評価されるため、JSF が必須フィールドではないと判断したとしましょうfalse)

于 2013-01-15T10:43:04.533 に答える
5

ボタンをクリックしたときに検証をスキップする場合は、スキップするボタンにパラメーターを簡単に追加します。例:

<p:commandButton value="button1" action="#{bean.action()}" >
   <f:param name="skipValidator" value="true"/>
</p:commandButton>

次に、バリデーターでこのパラメーターを読み取ることができ、true の場合はスキップします。

@FacesValidator("com.validators.MyValidator")
public class MyValidator implements Validator{

  public void validate(FacesContext ct, UIComponent co, Object obj) throws ValidatorException { 
    if(!continueValidation()){
      return;
    }
    // validation process
  }

protected boolean continueValidation() {
    String skipValidator= FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("skipValidator");
    if (skipValidator != null && skipValidator.equalsIgnoreCase("true")) {
      return false;
    }
    return true;
  } 
}
于 2015-02-12T08:41:56.740 に答える
5

これは素晴らしい質問であり、非常に役立つ回答です。このアプローチにより、 の手間が大幅に軽減されimmediate="true"ます。

この情報を追加したいと思います (ただし、まだコメントすることはできません)。あなたのコード例はJSF 2.0以上を必要とするようです(私を修正してください)。私のように JSF 1.1/1.2 を使用するのが嫌な場合は、次の変更/追加を検討してください。

<h:form id="form">
...
<p:inputText id="someId" required="#{!empty param['save']}" ... />
...
<p:commandButton id="save" value="Save" />
</h:form>
  • JSF 1.1 には属性 prependId はありません
  • したがって、param[...] では、ボタン ID のみを指定する必要があります
  • ="{true and ...}"間違っている可能性のある構文を使用していますか (いいえ#)?
  • あなた自身の編集履歴からわかるように、「null か null でないか」のロジックはあまり直感的ではありません :) そのため、この!empty ...バージョンを見つけたときにすぐに気に入りました。
于 2014-01-29T16:48:37.527 に答える
0

私の場合、params でボタンの clientId が見つかりませんでしたが param['javax.faces.source'] = buttonClientId、requestmap でこれを見つけました。値は、クリックされたボタンの clientId になります。

于 2014-12-22T15:29:04.747 に答える