0

私のxhtmlには、ユーザーが数値またはアルファベットの値を入力できる入力フィールドが含まれています。ajax 呼び出しを使用して、入力値を検証し、検証エラーをスローしています。ただし、無効な文字とエラー メッセージを入力した後でも、ユーザーは [保存] ボタンを押すことがあります。ユーザーが [保存] ボタンをクリックすると、コントローラーでメソッドがトリガーされます。FacesContext.getCurrentInstance() を使用して、コントローラー内の p:messages の検証エラーを確認する方法はありますか。

xhtml コード

    <!-- Messages -->       

    <p:messages id="errorMessages" globalOnly="false" showDetail="true" showSummary="false" closable="true" />  
<!-- Column input field-->
    <p:column>
        <f:facet name="header">
            <h:outputText value="Input Amount" escape="false" />
        </f:facet>
        <p:cellEditor>

            <f:facet name="output">
                <h:outputText value="#{row.amount}" escape="false">
                    <f:convertNumber maxFractionDigits="3" minFractionDigits="3"
                        maxIntegerDigits="5" />
                </h:outputText>
            </f:facet>
            <f:facet name="input">
                <p:inputText id="input" value="#{row.amount}" maxlength="10"
                    size="10">
                    <f:convertNumber maxFractionDigits="3" minFractionDigits="3"
                        maxIntegerDigits="5" />
                    <f:validator validatorId="hourlyValueValidator" for="input" />
                    <p:ajax event="change" partialSubmit="true" process="input"
                        update=":#{p:component('errorMessages')}" />
                </p:inputText>
            </f:facet>
        </p:cellEditor>
    </p:column>


<!-- Save Button -->

    <p:commandButton id="btnSubmit" value="Save"        
    update=":#{p:component('tblScrollPnl')} :#{p:component('errorMessages')}"
    action="#{controller.saveValues()}" ajax="true" />

ViewScope のコントローラ

   public void saveValues() throws Exception {

  FacesContext context = FacesContext.getCurrentInstance();
  List<FacesMessage> errorMsgList = context.getMessageList("globalMessages");
  ......
  ......
  ......
  }
4

1 に答える 1

1

経験したように、検証のために Bean 側からメッセージを取得する必要はありません。ビュー側の検証は行われますが、アクションはブロックされません。

ビューにはいくつかの問題があります。問題を解決するには、のprocess属性を変更する必要がありますp:commandButton。そうしないと、ボタンのみが処理されます (デフォルトprocess="@this"では、検証はスキップされます)。

<p:commandButton id="btnSubmit" value="Save" process="@form" update=":tblScrollPnl :errorMessages" action="#{controller.saveValues()}" />

ajax="true"また、デフォルトであるために削除し、 の主要な問題を修正したことにも注意してくださいupdate=""

また、バリデーターを再配置する必要があります。

<p:inputText id="input" value="#{row.amount}" maxlength="10" size="10" validator="hourlyValueValidator">
    <f:convertNumber maxFractionDigits="3" minFractionDigits="3" maxIntegerDigits="5" />
</p:inputText>
于 2013-06-04T21:01:19.643 に答える