【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.