tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:必須項目と『apex:actionRegion』

登録画面などで未入力状態での登録処理を防止するために、『required="true"』を宣言して必須項目にするようなケースはよくあると思います。

f:id:tyoshikawa1106:20150124000532p:plain


必須項目にするとエラーメッセージが表示されたり未入力の項目が強調されたりするのですごく便利です。しかし、画面に必須判定の必要がない別の機能があった場合にも強制的にエラー判定が実行されてしまいます。

f:id:tyoshikawa1106:20150124001040p:plain


必須項目部分をreRenderの対象から外すことでエラーメッセージは表示されなくなりますが、処理はエラー扱いとなり実行できません。


この問題を回避する方法としていくつかの方法があります。ひとつは『required="true"』を使わずに自分でApexクラスにエラー判定を用意する方法、もうひとつは『immediate="true"』を宣言する方法です。


『immediate="true"』を宣言するとすべての検証ルールをスキップすることができ、これにより必須判定をスキップできます。ただし、この方法では値をApexクラス側に渡すことができないのと、reRenderなどによる画面再描画時に入力した値が戻ってしまうなどの問題があります。(JavaScriptで自分で渡す必要があります。)


自分で用意したキャンセルボタンなど、上記問題に影響がない場合には便利ですが、それ以外の場合は少し使いづらい感じです。


こんなときに便利なのが、『apex:actionRegion』です。これをつかうと部分的にサーバ側に値を送ることができます。

f:id:tyoshikawa1106:20150124002407p:plain


これで『immediate="true"』のような制限もなく必須判定を気にせずに処理を行うことが可能です。

f:id:tyoshikawa1106:20150124002506p:plain


『apex:actionRegion』タグの外でreRenderが実行されたりするときちんと必須判定は実行されます。登録機能とは別の機能が存在する画面ではすごく役に立つタグです。


検証につくったサンプルコードはこちらです。