こんにちは、管理人の@Salesforce.Zです。
なんだか原因不明ですが、クラスのプロパティ変数は commandButtonやcommandLinkのアクションによって
値がコントローラクラスに渡していない、画面上の入力フォームに値があるのにかかわらず。
こんな時に、actionfunctionとかで渡すことによって解消できる、しかし、もっと簡単な方法もあります。
よくあるケース
登録画面などで未入力状態での登録処理を防止するために、『required="true"』を宣言して必須項目にするようなケースはよくあると思います。
今回、解消できる方法をいくつか紹介します。
読んだら得ること
★ VFの入力フォームの値をAPEXに渡せない時の対策
目次
渡せない事例およびその解消方法
渡せない事例
VF画面には必須項目を設定した
<apex:inputField value="{!Account.custom__c}" id="fieldid" required="true"/>
こんな時にcommandButtonのアクションを操作すると、フォームにある必須項目の原因でエラーになる
解消方法
- immediate属性
『immediate="true"』を宣言するとすべての検証ルールをスキップすることができ、これにより必須判定をスキップできます。ただし、この方法では値をApexクラス側に渡すことができないのと、reRenderなどによる画面再描画時に入力した値が戻ってしまうなどの問題があります。(JavaScriptで自分で渡す必要があります。)
めんどくさいかと思うが、一応解消できる
- apex:actionRegionタグ このタグでサーバーに通信したい部分を囲んで、部分的にサーバー通信になり、Apex側にも値を渡せる これで『immediate="true"』のような制限もなく必須判定を気にせずに処理を行うことが可能です。
<apex:outputPanel id="opid"> <apex:inputField value="{!Account.customField2__c}" id="customField2id" required="true"/> <apex:actionRegion> <apex:inputField value="{!Account.customField__c}" id="customFieldid"/> <apex:commandButton value="確認" action="{!confirmHalfOrFull}" id="btnid" reRender="id1,id2,id3"/> </apex:actionRegion> </apex:outputPanel>
終わりに
サンプルまで必要がないかと思いますが、ほしい場合、連絡してください. あえて挙げてない、今回の記事主旨はapex:actionRegionタグで部分的なところのみを囲んで、よって、その値のみをサーバーに通信を行い、APEX側が受け取れるになる