【Salesforce】View StateエラーのInternalについて

【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をすると増えていくようです。

https://salesforce.stackexchange.com/questions/4537/how-to-reduce-a-large-internal-view-state-what-is-in-the-internal-view-state

 

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.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です