怎样把一个参数从 Visualforce Page 传递到 Apex Method

对于刚进入 Salesforce 开发人员来讲,他们会遇到这样一个问题,就是"怎样把一个参数从 Visualforce Page 传递到 Controller 中?"

例如,下面这个代码,在这个页面上根据一个 Account 最多能显示10条 Contact 记录。

<apex:page standardController="Account" extensions="AccountController">  
  <apex:outputPanel id="all">
    <apex:form>
      <apex:pageBlock title="Account Detail">
        <apex:pageBlockSection title="Account">
          <apex:outputField value="{!Account.Name}"/>
          <apex:outputField value="{!Account.Description}"/>
        </apex:pageBlockSection>
        <apex:pageBlockSection title="Contacts" columns="1">
          <apex:pageBlockTable value="{!Conts}" var="cont" rows="10">
          <apex:column value="{!cont.Id}"/>
          <apex:column value="{!cont.Name}"/>
          <apex:column value="{!cont.Email}"/>
          <apex:column value="{!cont.Phone}"/>
        </apex:pageBlockTable>
      </apex:pageBlockSection>
      </apex:pageBlock>
    </apex:form>
  </apex:outputPanel>
</apex:page>  

接下来是上面页面对应的 Controller。

public class AccountController  
{
    private ApexPages.StandardController stdCtrl;

    public AccountController(ApexPages.StandardController std)
    {
        stdCtrl = std;
        setupContacts();
    }

    public List<Contact> Conts {get; set;}

    private void setupContacts()
    {
        conts=[select id, Name, Email, Phone from Contact where AccountId = :stdCtrl.getId()];
    }
}

页面展示如下。

现在,我们需要为 Contacts 列表中的每一条记录在左边添加一个 Del 操作。为了能够区分具体要删掉的是哪一条 Contact, 我们需要把 Contact 的 Id 以参数的形式传递到后台的 delCont 方法中。我猜想很多人第一次为把它写成如下。

<apex:column headerValue="Action">  
   <apex:commandButton value="Del" action="{!delCont(cont.Id)}"/>
</apex:column>  

然而,在保存编译代码的时候,会得到的不知道该方法的错误。哪么,如何将该参数传递过去呢? 是一个标准的组件,允许将参数传递到 Controller 中的一个属性。

<apex:commandButton value="Del" action="{!delCont}" rerender="all">  
   <apex:param name="contIdParam" value="{!cont.id}" assignTo="{!ContIdChosen}"/>
</apex:commandButton>  

添加 ContIdChosen 属性到 Controller 中。

public String ContIdChosen {get; set;}  

当 Del button 被单击后,Cont.id 会先赋值给 ContIdChosen。然后再执行 delCont 方法。

public void delCont()  
{
    Contact toDel = new Contact(id = ContIdChosen);
    delete todel;

    setupContacts();
}

为了在 Del button 单击后能及时的在页面上看到效果,我在 Del button 中加了 rerender 操作,一旦 Del 方法在后台执行完成后,页面上会自动的移除被删除的记录。

结语

更多 Salesforce 学习资料将在后续推出,敬请关注。如果有什么问题可以发送到我的邮箱:samba.gao@meginfo.com。

Samba

Read more posts by this author.