对于刚进入 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>
然而,在保存编译代码的时候,会得到的不知道该方法的错误。哪么,如何将该参数传递过去呢?
<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。