[SalesForce] How to use StandardSetController in extension class

I want to create extension class with StandardSetController.

public with sharing class AccountExtCtrl {

  private ApexPages.StandardSetController ctrl {get;set;}
  public AccountExtCtrl(ApexPages.StandardSetController controller)        
  {
    ctrl = controller;
  } 

  //todo

}

but when i use this extension to visualforce page

<apex:page standardController="Account" extensions="AccountExtCtrl">
  <!-- todo -->
</apex:page>

always print this:

common.apex.runtime.bytecode.BytecodeApexObjectType cannot be cast to
common.apex.runtime.impl.ApexType

Best Answer

You get this error because you are trying to cast a StandardController to a StandardSetController. Note that you can define both constructors on one extension, in which case the extension can be used for either markup approach. Note that using a StandardSetController allows you to use the page in a List Button, whereas using a StandardController allows you to use it in a Detail Button.

Works

<apex:page standardController="..." extensions="MyExtension">
public MyExtension(ApexPages.StandardController controller)
{
    // constructor logic
}

(or)

<apex:page standardController="..." recordSetVar="records" extensions="MyExtension">
public MyExtension(ApexPages.StandardSetController controller)
{
    // constructor logic
}

(or)

<apex:page standardController="..." recordSetVar="records" extensions="MyExtension">
public MyExtension(ApexPages.StandardController controller)
{
    // overloaded constructor logic
}
public MyExtension(ApexPages.StandardSetController controller)
{
    // overloaded constructor logic
}

Fails

<apex:page standardController="..." extensions="MyExtension">
public MyExtension(ApexPages.StandardSetController controller)
{
    // constructor logic
}

(or)

<apex:page standardController="..." recordSetVar="records" extensions="MyExtension">
public MyExtension(ApexPages.StandardController controller)
{
    // constructor logic
}
Related Topic