【Salesforce】View StateエラーのInternalについて
Visualforceでの画面開発でよく見るエラーに、ビューステートのエラーがありますね。
サーバー側に保持するデータ量が多くなると発生するエラーで、保持するデータ量には気を付けて作っているつもりでした。
しかし、久しぶりに見ることになってしまいました。
ビューステートの最大表示サイズの制限 (135 KB) を超えています。このページのビューステートのサイズは、136.312 KB でした
気を付けて作っていたのになーっなんて考えながら、開発モードで画面のビューステートを確認しました。
エラーが発生するとビューステートの確認は出来ないため、データの量をギリギリまで削って確認することになりました。
Controllerのビューステートは35KB程度であり、Internalが200KBを超えていました。
データの量を減らすだけでは解決しないわけですね。
しかし、Internalって何でしょうね。
開発モードの使い方を確認すると、内部データで制御できないと書いてありました。
https://developer.salesforce.com/docs/atlas.ja-jp.pages.meta/pages/pages_tools_edit_toolbar.htm
もう少し調べてみると、海外の方が同じことで悩んでいるようでした。
repeatの中でrepeatをすると増えていくようです。
repeatの中でrepeatが原因ということで、心当たりがありました。
エラーが発せいしていたVisualforceのコードはこんな雰囲気です。
<!-- レコードリストを取得するMapのindexリストでループ --> <apex:pageBlockTable value="{!RecordListIndex}" var="recListIndex" > <!-- indexで取得したレコードでループ --> <apex:repeat value="{!IndexRecordMap[recListIndex]}" var="record" > <!-- 表示順indexリストでループ --> <apex:repeat value="{!DisplayIndexList}" var="dispIndex" > <!-- 項目1 --> <apex:column rendered="{!DisplaMap[dispIndex]}" > <apex:facet name="header" > <apex:outputText value="項目名" /> </apex:facet> <apex:inputField value="record.Name" /> </apex:column> <!-- 項目1 --> <!-- 項目2 --> <!-- 項目3 --> <!-- 項目4 --> <!-- 項目いっぱい --> </apex:repeat> </apex:repeat> </apex:pageBlockTable>
データテーブルの中でリピートしてさらにリピートして。。。って感じですね。
レコードによって項目を表示したりしなかったり、順番を変えたりする動きでした。
これらをコントローラ側で制御していたのですが、少しのデータで落ちてしまうようでした。
横着をせず、もっと簡単なMapを定義することで解決することが出来ました。
今はrepeatは2回だけしか呼んでいません。
ビューステートのエラーはサーバー側で保持するレコードの量で落ちるとばかり思っていましたが、そういうわけでもないのですね。
Visualforceの画面を開発する際に考慮する事項が1つ増えました。
No comments.