Press ESC to close + K to search
Passing Parameters with a CommandButton

This post is a slight tweak of yesterday's post, Passing Parameters with a CommandLink. In theory you should just be able to switch out the CommandLink component with a CommandButton component and be golden. However, not so fast. There seem to still be a bug with the CommandButton component.

Here is the Visualforce page with the CommandButton instead of the CommandLink:

```html

<apex:commandButton value=“Process Nickname” action=”{!processButtonClick}”> <apex:param name=“nickName” value=”{!contact.firstname}” assignTo=”{!nickName}”/> </apex:commandButton>

</apex:form> </apex:page>


<p style="clear: both">As with the CommandLink, when the user clicks the button the setters should fire and then call the processButtonClick() method to allow further publishing. <strong>However, the setter for </strong><em><strong>nickName</strong></em><strong> is never called!</strong>
<p style="clear: both">
```apex
public with sharing class CommandButtonParamController {

  // an instance varaible for the standard controller
  private ApexPages.StandardController controller {get; set;}
 // the object being referenced via url
  private Contact contact {get;set;}
  // the variable being set from the commandbutton
  public String nickName {
   get;
   // *** setter is NOT being called ***
   set {
    nickName = value;
    System.debug('value: '+value);
   }
  }

  // initialize the controller
  public CommandButtonParamController(ApexPages.StandardController controller) {

  //initialize the stanrdard controller
  this.controller = controller;
  // load the current record
  this.contact = (Contact)controller.getRecord();

  }

  // handle the action of the commandButton
  public PageReference processButtonClick() {
   System.debug('nickName: '+nickName);
   // now process the variable by doing something...
   return null;
  }

}

Wes Nolte has done a great job on his blog and the Salesforce.com message boards pointing out the problem and workarounds. A popular option is using the CommandLink but styling it to look like a CommandButton.

You can make the CommandButton function as advertised if you use a rerender attribute and hidden pageBlock component. If you run the Visualforce page below with these modifications the setter will actually fire and set the value of nickName correctly.

```html

<apex:commandButton value=“Process Nickname” action=”{!processButtonClick}” rerender=“hiddenBlock”> <apex:param name=“nickName” value=”{!contact.firstname}” assignTo=”{!nickName}”/> </apex:commandButton>

<apex:pageBlock id=“hiddenBlock” rendered=“false”></apex:pageBlock>

</apex:form> </apex:page>