Visualforce控制器

Visualforce框架是遵循MVC结构的。Visualforce页面代表了“视图”部分,Salesforce的各种对象代表了“模型”部分,而Apex则代表了“控制器”部分。

Visualforce页面绑定控制器

在Visualforce页面中的“apex:page”标签里可以绑定控制器。

控制器是一个Apex类,可以是标准的控制器类,也可以是用户自己开发的Apex类。

标准控制器类

Salesforce中为标准对象预定义了标准的控制器类,不需要用户配置即可直接使用。

比如要在Visualforce页面中绑定Account对象,可以这样写:

<apex:page standardController="Account">

输入URL参数

每一个Visualforce页面都可以通过一个预定义的URL来进入。在基本的Salesforce根地址后面加入“/apex/页面名”即可进入Visualforce页面。在URL的最后还可以加入“?id=”参数来传入页面中要显示的对象的ID。

示例:建立Visualforce页面并显示Account对象的内容

在系统中,有一个Account对象,其ID是“0010Y00000H3TiV”。

  1. 在Developer Console中,建立Visualforce页面,命名为“CustomAccountView”。
  2. 在Visualforce页面的编辑区域输入以下代码:
<apex:page standardController="Account">
    <apex:pageBlock title="Account Info">
        <apex:pageBlockSection>
            Name: {! Account.Name }
            <br/>
            Phone: {! Account.Phone }
            <br/>
            Owner: {! Account.Owner.FirstName & ' ' & Account.Owner.LastName }
        </apex:pageBlockSection>
    </apex:pageBlock>
</apex:page>
  1. 将浏览器中的Salesforce主界面下的URL地址修改一下,保留根地址,在后面加入“/apex/CustomAccountView?id=0010Y00000H3TiV”
  2. 页面将显示传入的Account对象的信息。

显示Account信息

代码解释

  1. 在代码的“apex:page”标签中,使用了“standardController”属性,将其定义为“Account”。这就是告诉Salesforce该页面在载入时,需要在URL中接收一个Account对象的ID值,并在数据库中查询得到该对象的信息,存入“Account”变量供页面使用。
  2. 在代码中,使用“{! Account.XXX }”来调用得到的Account对象的字段值。当Account对象有相关联的对象时,也可以显示相关联对象的字段值,比如“Owner”就是和Account对象相关联的一个User对象,用“ {! Account.Owner.FirstName }”即可调用“Owner”的“FirstName”字段值。

使用标准组件显示对象内容

在示例代码中,Account对象的内容是通过“{! Account.XXX }”来手动显示的。

Visualforce中提供了一系列标准组件,可以直接格式化输出对象的各种内容。

比如将以上代码修改为:

<apex:page standardController="Account">
    <apex:pageBlock title="Account Info">
        <apex:pageBlockSection>
            <apex:detail />
        </apex:pageBlockSection>
    </apex:pageBlock>
</apex:page>

当该页面显示Account对象时,其外观和Salesforce标准的Account详细信息页面一样,包括了各个字段的值和相关列表。

代码中的“apex:detail”就是预定义的显示详细信息的组件。

显示Account标准详细信息

在控制器中绑定列表变量

使用标准控制器类,不光可以绑定一个对象变量,也可以绑定一个列表变量。

在“apex:page”标签中,设置“recordSetVar”属性,即可让标准控制器返回一个包含此对象数据的列表。

比如:

<apex:page standardController="Account" recordSetVar="accounts">
    <apex:pageBlock title="Account Info">
        <apex:pageBlockTable value="{! accounts }" var="acc">
            <apex:column value="{! acc.Name }"/>
        </apex:pageBlockTable>            
    </apex:pageBlock>
</apex:page>

在上面的代码中,使用了“recordSetVar="accounts"”来接收标准控制器返回的包含Account对象的列表。一般情况下,列表变量的名字是对象名字的复数形式。

在页面内容中,使用“apex:pageBlockTable”组件来循环显示对象列表中的每个元素的内容。“value”属性可以决定在组件里循环显示哪个对象列表,代码中是“accounts”列表变量。“var”属性可以决定在每个循环中,代表单个对象变量的名称,代码中是“acc”,所以在循环中,用“{! acc.Name }”来显示每个对象变量的Name字段值。

控制器扩展

在标准的控制器类中,开发者可以很方便的使用系统自定义的各种功能。而控制器扩展则可以对标准控制器类的功能进行扩展。

在“apex:page”标签中,在已经有“standardController”变量后,设置“extensions”变量,即可设定扩展类。

一个扩展类的构造函数必须使用ApexPages.StandardController类型的参数。

代码示例:

public class ExampleControllerExtension {
    private final Account acc;

    public ExampleControllerExtension(ApexPages.StandardController stdController) {
        // 使用标准控制器变量的getRecord()方法来得到相应SObject对象的值
        this.acc = (Account)stdController.getRecord();
    }

    public void getExampleCustomMessage() {
        return 'Hello world!';
    }

    // 其他自定义方法
    ...
}
<apex:page standardController="Account" extensions="ExampleControllerExtension">
    {!exampleCustomMessage}
</apex:page>

在上面的代码中,建立的Visualforce页面会显示“Hello world!”字样,就是从控制器扩展的自定义方法中实现的。

在标准控制器扩展中载入特定字段

标准控制器默认使用SOQL载入对象的一些字段。如果需要让其载入更多的字段,在扩展标准控制器的时候,可以使用addFields()方法来声明。

比如以下代码:

public class ExampleControllerExtension {
    private final Account acc;

    public ExampleControllerExtension(ApexPages.StandardController stdController) {
        // 使用addFields()方法让控制器载入更多的字段
        controller.addFields(new List<String>{'ExampleField1__c', 'ExampleField2__c'});
        
        this.acc = (Account)stdController.getRecord();
    }

    ...
}
<apex:page standardController="Account" extensions="ExampleControllerExtension">
    <!-- 在此处可以使用控制器扩展中声明的ExampleField1__c、ExampleField2__c字段了 -->
</apex:page>

自定义控制器类

除了标准控制器类,Visualforce页面还可以指定自定义的Apex类作为控制器类。

此时在“apex:page”标签中就不需要使用“standardController”属性,而是设定“controller”属性的值为自定义的Apex类的名字。

Salesforce有默认的“get函数”机制,可以从控制器类中自动得到页面中使用的变量的值。当页面中使用变量“abc”,那么“abc”的值会自动由控制器中的“getAbc()”函数来得到。此机制适用于单独对象变量和列表对象变量。

示例代码:自定义控制器类并在Visualforce页面中显示一组Account对象

首先,建立一个自定义的Apex类,名字叫“CustomAccountListController”。代码如下:

public class CustomAccountListController {
    public List<Account> getAccounts() {
        List<Account> results = Database.query(
                                            'SELECT Id, Name, Phone, Fax ' +
                                            'FROM Account ' +
                                            'LIMIT 10'
                                            );
        return results;
    }
}

然后建立一个Visualforce页面,名字叫“CustomAccountListView”,代码如下:

<apex:page controller="CustomAccountListController">
    <apex:pageBlock title="Account Info">
        <apex:pageBlockTable value="{! accounts }" var="acc">
        
            <apex:column value="{! acc.Id }"/>
            <apex:column value="{! acc.Name }"/>
            <apex:column value="{! acc.Phone }"/>
            <apex:column value="{! acc.Fax }"/>
            
        </apex:pageBlockTable>
    </apex:pageBlock>    
</apex:page>

预览此页面,可以看到系统中的10个Account对象的信息已经显示在了页面中。

显示Account列表信息

代码解释

  1. 当建立了Apex类之后,在Visualforce页面的“apex:page”标签中,将“controller”属性的值设置为Apex类的名字,即可建立页面和类的关系。此时Apex类便成为了页面的控制器。
  2. 在页面中,未经定义,直接使用了列表变量“accouonts”进行循环显示。此时,Salesforce会自动在控制器类中寻找名为“getAccounts()”的函数来得到列表变量的值。如果将上面的页面代码中的“accounts”变为“fakeObjects”,将Apex类中的“getAccounts()”函数改名为“getFakeObjects()”,也可以得到同样正确的结果。

转载于:https://www.cnblogs.com/chengcheng0148/p/visualforce_controller_basic.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: page.getrecords()方法是一个Salesforce Apex中的方法,用于获取当前页面上的记录列表。它返回一个SObject类型的列表,其中包含当前页面上显示的所有记录。这个方法通常用于在Visualforce页面中使用Apex控制器来获取记录列表,并在页面上显示它们。 例如,如果你有一个包含联系人记录的Visualforce页面,并且你想要在Apex控制器中获取这些记录,你可以使用page.getrecords()方法来获取它们。然后,你可以在页面上使用这些记录来显示它们的详细信息或执行其他操作。 需要注意的是,page.getrecords()方法只能在Visualforce页面中使用,并且只能在StandardSetController或CustomSetController对象的上下文中使用。此外,它只能返回当前页面上显示的记录,而不是整个记录列表。如果你需要获取整个记录列表,你需要使用其他方法,如SOQL查询。 ### 回答2: page.getrecords()是Salesforce Apex编程中常用到的方法之一,它可以获取指定页码的记录列表。具体来说,当我们在Visualforce页面中使用了分页功能,然后需要在后端处理这些分页数据时,就可以使用page.getrecords()方法,它可以根据当前页码和每页显示数量来获取对应的记录列表。 这个方法具体的语法是:List<sObject> getRecords(Integer offset, Integer pageSize),其中offset表示记录开始的位置,pageSize表示记录数量。我们可以在Apex代码中根据需要动态设置这两个参数,从而得到自己想要的记录列表。 需要注意的是,page.getrecords()方法返回的是一个sObject类型的列表,其中sObject可以是任何类型的对象。因此,在使用这个方法之前,我们需要明确获取的是哪个对象的记录列表,以便在代码中正确处理数据。 除了page.getrecords()方法以外,Salesforce Apex中还有其他一些用于分页的方法,比如setPageSize()、hasNext()和hasPrevious()等,它们一起构成了Salesforce Apex编程中处理分页数据的重要工具。使用这些方法,我们可以轻松地实现分页查询、数据导出等功能,方便用户在页面上浏览数据。 ### 回答3: page.getrecords()方法是Salesforce中一个非常重要的Apex分页查询方法,可以实现按照指定条件进行数据查询,并按照页码进行数据分页,返回一个包含当前页数据及分页信息的Page对象。 使用page.getrecords()方法进行数据查询,需要先使用一个包含查询条件的SOQL语句进行查询。例如,我们现在要按照创建时间降序查询所有的账户记录,我们可以使用以下SOQL语句: List<Account> accountList = [SELECT Id, Name, CreatedDate FROM Account ORDER BY CreatedDate DESC]; 接着我们可以使用PageReference类的newInstance()方法来创建一个PageReference对象,并且将查询结果列表和分页大小传递给PageReference的构造函数。然后使用PageReference的getContent()方法来获取Page对象。例如: Integer pageSize = 10; PageReference pageRef = new PageReference('/apex/AccountList'); pageRef.getParameters().put('pageSize', String.valueOf(pageSize)); pageRef.getParameters().put('soql', String.valueOf([SELECT Id, Name, CreatedDate FROM Account ORDER BY CreatedDate DESC])); Page page = pageRef.getContent(); List<Account> accountList = (List<Account>) page.getRecords(); 在上面的代码中,我们将页码大小pageSize和SOQL查询语句作为URL参数传递给PageReference对象,并使用getContent()方法获取包含当前页数据及分页信息的Page对象。最后,我们使用Page对象的getRecords()方法获取当前页的记录列表。 需要注意的是,page.getrecords()方法不会返回所有的记录,而只返回当前页的记录。因此,在处理大量数据的时候,需要在查询条件中增加限制条件,以避免超出SOQL查询限制。同时,在使用page.getrecords()方法时,还可以使用其他Page对象提供的方法,如getPageIndex()、getPageNumber()、hasNext()、hasPrevious()等,来获取当前页的位置和判断是否有下一页或下一页。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值