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”。
- 在Developer Console中,建立Visualforce页面,命名为“CustomAccountView”。
- 在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>
- 将浏览器中的Salesforce主界面下的URL地址修改一下,保留根地址,在后面加入“/apex/CustomAccountView?id=0010Y00000H3TiV”
- 页面将显示传入的Account对象的信息。

代码解释
- 在代码的“apex:page”标签中,使用了“standardController”属性,将其定义为“Account”。这就是告诉Salesforce该页面在载入时,需要在URL中接收一个Account对象的ID值,并在数据库中查询得到该对象的信息,存入“Account”变量供页面使用。
- 在代码中,使用“{! 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”就是预定义的显示详细信息的组件。

在控制器中绑定列表变量
使用标准控制器类,不光可以绑定一个对象变量,也可以绑定一个列表变量。
在“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对象的信息已经显示在了页面中。

代码解释
- 当建立了Apex类之后,在Visualforce页面的“apex:page”标签中,将“controller”属性的值设置为Apex类的名字,即可建立页面和类的关系。此时Apex类便成为了页面的控制器。
- 在页面中,未经定义,直接使用了列表变量“accouonts”进行循环显示。此时,Salesforce会自动在控制器类中寻找名为“getAccounts()”的函数来得到列表变量的值。如果将上面的页面代码中的“accounts”变为“fakeObjects”,将Apex类中的“getAccounts()”函数改名为“getFakeObjects()”,也可以得到同样正确的结果。
Visualforce控制器的更多相关文章
- 用 FFLIB 实现 Apex 企业设计模式
Apex 企业设计模式将应用分为服务层.模型层.选择逻辑层.工作单元几个部分.FFLIB 是一个开源的 Apex 框架,可以帮助开发者快速建立相关的功能. FFLIB 的安装 FFLIB 可以直接部署 ...
- 学习Salesforce | Platform Developer Ⅰ 平台初级开发认证考试指南及备考资源
一.平台开发人员考试计划 Salesforce平台开发人员初级认证面向具有在Lightning平台上构建自定义应用程序的知识.技能和经验的个人. 该认证考核Lightning平台的基本编程能力,并会使 ...
- 在Visualforce页面中使用Visual Flow
在本文中,我们将通过一个示例说明如何将"流"(Visual Flow)用于Visualforce页面. 更全面的知识可以参考官方文档. 创建流 我们要创建一个流,它的作用是得到一个 ...
- Visualforce Page超链接
Salesforce开发者文档:https://developer.salesforce.com/docs/atlas.en-us.pages.meta/pages/pages_quick_start ...
- Visualforce入门第六篇_2017.3.1
Visualforce实现过滤.数据列表显示.分页功能 可以参考salesforce官网开发文档:https://trailhead.salesforce.com/modules/visualforc ...
- Visualforce入门第五篇_2017.3.1
Visualforce添加过滤器,实现数据的筛选 参考原文:https://trailhead.salesforce.com/modules/visualforce_fundamentals/unit ...
- Visualforce入门第三篇_2017.3.2
Visualforce实现显示Record List(列表) 详细见链接:https://trailhead.salesforce.com/modules/visualforce_fundamenta ...
- Salesforce学习之路-developer篇(三)利用Visualforce Page实现页面的动态刷新案例学习
Visualforce是一个Web开发框架,允许开发人员构建可以在Lightning平台上本地托管的自定义用户界面.其框架包含:前端的界面设计,使用的类似于HTML的标记语言:以及后端的控制器,使用类 ...
- Visualforce 页面的生命周期
了解 Visualforce 页面的生命周期可以让我们明白其各个元素的执行顺序.改变逻辑,从而提高开发效率,避免不必要的错误. 在官方文档中有详细的讲解.本文摘取其中的要点,作为一个总结. Visua ...
随机推荐
- 有没有人曾告诉你,你的SQL又报错了?[开发篇]
引语:线上运行的真实环境总是变幻莫测,明明你在本地测试的时候各种情况都是OK得不要不要的,也许你还在为自己某个地方炫酷的效果以及神奇的设计感到激动不已!但是,到线上以后,他就会偶尔跟抽风一样的跟你sa ...
- HttpRunner Manager接口自动化测试平台实践(Windows)
1. 源码下载 github: https://github.com/HttpRunner/HttpRunnerManager 下载后放入项目目录,结构如下: 2.依赖环境 根据根目录require ...
- 利用SSH反向隧道,连接内网服务器
前言 公司有一台文件服务器(内部使用,无外网IP),上面主要安装了SVN服务,用来存储和共享各部门的文档,因为都是内网,直接远程(mstsc)上去就可以方便维护,但最近公司租了新的办公室,部分员工被分 ...
- MySQL:索引
索引的目的在于提高查询效率,它的作用就相当于一本书的目录: 1. 常见的索引模型 1.1 哈希表 优点:适用于等值查询的场景: 缺点:范围查询效率较低: 1.2 有序数组 优点:范围查询和等值查询效率 ...
- javascript Location对象属性和方法
Location对象 Location对象包含有关当前URL的信息 https://blog.csdn.net/u010953692/article/details/80901035#3 https( ...
- centos7使用lldb调试netcore应用转储dump文件
centos7下安装lldb,dotnet netcore 进程生成转储文件,并使用lldb进行分析 随着netcore应用在linux上部署的应用越来越多,碰到cpu 100%,内存暴涨的情况也一直 ...
- vueAdmin ui基础包
这个版本的vueAdmin ui是针对官网版本进行修改而成,主要修改了后端接口修改,登录等等,一个通用的前端工程基础包,即开即用,省去了前期繁琐配置 Demo Build Setup # Clone ...
- 课程四(Convolutional Neural Networks),第一周(Foundations of Convolutional Neural Networks) —— 0.Learning Goals
Learning Goals Understand the convolution operation Understand the pooling operation Remember the vo ...
- 移动端 h5开发相关内容总结(三)
之前写过两篇开发中遇到的问题和解决方案.当时是CSS 和 JavaScript 分开写的.现在写这篇文章的时候感觉很多内容都是有内在联系的,所以不好分开. 给大家分享一下这半年来的感受吧: 知道和理解 ...
- Vue + Element UI 实现权限管理系统 前端篇(十):动态加载菜单
动态加载菜单 之前我们的导航树都是写死在页面里的,而实际应用中是需要从后台服务器获取菜单数据之后动态生成的. 我们在这里就用上一篇准备好的数据格式Mock出模拟数据,然后动态生成我们的导航菜单. 接口 ...