こんにちは、管理人の@Salesforce.Zです。
SalesforceのVisualforcePageを使い、エラーや警告メッセージを表示させる場合がでしょう
今回、System ValidationとCommandbuttonのActionどっちが先に動作するかを共有します
さらに、inputFieldタグのエラー表示挙動も
お楽しみにみてください。
★ システムチェックとコマンドボタンのアクション処理順番
目次
システムチェックとコマンドボタンのアクション処理順番
VisualforcePage側で <apex:inputField/>タグと<apex:pageMessages id="msgId"/>タグ を同時に使う場合挙動をしっかりしたほうがいい
なぜなら、エラーがあるのに、ボタンの動きが怪しい時ある
処理順番
結論は
1:System Validation
2:システムチェックでエラーがなければ、ボタンのアクションが動作する
では、System Validationはどのようなものかですね
System Validationの例
イメージをつくため、いくつかの例を列挙させていただきます。
存在しないルックアップ値でボタン操作
前提:フォームにルックアップ項目とボタンがあるとする
StepA.ルックアップ項目にデータベースに存在しない値を入力する
StepB.ボタンを押下する
期待結果:ボタンのアクションに埋めたメソッドは動作しない
原因:ページ側のinputfieldタグによって、ルックアップのSystem Validationが先にに動作する
エラーがあると、ボタンのアクションメソッドは動作しません
//サンプルページ
<apex:form > <apex:inputField id="Field" value="{!acc.Name}"/> <apex:message for="Field"/> <apex:commandButton value="ボタン操作" action="{!doAction}"/> </apex:form>
//サンプルクラス
public class TestStudy { public Account acc {get; set;} public PageReference doAction() { try { insert acc; } catch (Exception ex) { acc.Name.addError(ex); } return null; } }
inputFieldのエラー表示が2重?
オブジェクト設定側の項目名とフォーム上にinputFiedlタグでのラベルと異なる場合に
System Validationによって、下記のようなエラーが発生する オブジェクト設定側の設定で項目名は「顧客名」 フォーム上でラベルを変更し「お客様名」
前提:フォームにルックアップ項目とボタンがあるとする
テストオブジェクトの参照項目A(ラベル:顧客名)があるとする
StepA.ルックアップ項目にデータベースに存在しない値を入力する
StepB.ボタンを押下する
期待値が下記のような感じ
解決方法
オブジェクト設定側で、項目のラベルをページ上でそのまま使う
こんな2重エラーが発生するには、異常系しかないはず