Skip to main content

使用标准控制器

学习目标

完成本单元后,您将能够:

  • 阐述 Visualforce 标准控制器的含义并描述其关键属性。
  • 在 Visualforce 页面中添加标准控制器。
  • 显示页面标准控制器检索到的记录数据。
  • 编写一个表达式,使用点记法来访问相关记录上的字段。
备注

备注

用中文(简体)学习?在中文(简体)Trailhead Playground 中开始挑战,用括号中提供的译文完成挑战。仅复制并粘贴英文值,因为挑战验证基于英文数据。如果在中文(简体)组织中没有成功通过挑战,我们建议您 (1) 将区域设置切换为美国,(2) 按此处说明将语言切换为英文,(3) 再次单击“检查挑战”按钮。

查看 Trailhead 本地化语言徽章详细了解如何利用 Trailhead 译文。

Visualforce 标准控制器简介

Visualforce 使用传统的模型 - 视图 - 控制器(MVC)范例,包含复杂的内置控制器来处理标准动作和数据访问,并提供与 Lightning 平台数据库简单而紧密的集成。这些内置控制器通常称为标准控制器,甚至称为标准控制器

MVC 设计模式可以轻松地将视图及其样式与底层数据库和逻辑分离。在 MVC 中,视图(Visualforce 页面)与控制器交互,控制器为页面提供功能。例如,控制器可以包含单击按钮时要执行的逻辑。控制器通常还与模型(数据库)进行交互 — 提供视图可能想要显示的可用数据,或将更改推送回数据库。

大多数标准和所有自定义对象都有标准控制器,可用于与对象关联的数据进行交互,因此您无需自己编写控制器代码。您可以扩展标准控制器以添加新功能,或从零开始创建自定义控制器。这里将为您介绍标准控制器。

找到一个记录 ID 并将其添加到请求 URL 中

通过将记录 ID 添加为请求 URL 中的参数,向标准控制器提供记录 ID。

如果要使用标准控制器引用特定的记录,需要知道要处理的记录标识符或记录 ID。使用 ID 检索数据,并在记录数据更改时将其保存回数据库。

当 Visualforce 页面与组织中的其他页面交互时,可以自动传入记录的标识符,Visualforce 页面可以使用标识符来查找和显示该记录的数据。但是在开发过程中,您的页面是独立的,因此为了让页面显示来自数据库中记录的数据,您需要手动提供记录 ID。最简单的方法是将其作为 GET 参数添加到请求 URL 中。

  1. 要创建新的 Visualforce 页面,请打开 Developer Console,然后单击 File(文件) | New(新建) | Visualforce Page(Visualforce 页面)。输入 AccountSummary 作为页面名称。
  2. 在编辑器中,将标记替换为以下内容。
    <apex:page>
        <apex:pageBlock title="Account Summary">
            <apex:pageBlockSection>
            </apex:pageBlockSection>
        </apex:pageBlock>
    </apex:page>
    此标记会创建一个框,供您添加一些有用的信息。
  3. 单击 Preview(预览)可打开页面预览,您可以在进行更改时查看该预览。确保您可以看到预览窗口的 URL 字段。只需几个步骤即可实现。
  4. 在一个单独的浏览器窗口中,转到组织的主页,然后选择“客户”选项卡。如果“客户”选项卡不可见,请从右上角的应用程序菜单中选择“销售”,即可切换到销售应用程序。
  5. 确保“查看”菜单显示“所有客户”。
  6. 在“所有客户”页面,单击任意客户名称。
  7. 客户详细信息页面加载完毕后,查看该页面的 URL。URL 看起来是这样的:https://MyDomainName.lightning.force.com/lightning/r/Account/001D000000JRBes/view。记录的标识符,即记录 ID,是一系列字母和数字的组合。该示例中,记录 ID 为 001D000000JRBes(与组织中的记录 ID 有所不同)。组织中所有对象类型的所有记录中,记录 ID 都是唯一的。
  8. 选择记录 ID,并将其复制到剪贴板。在您离开客户详细信息页之前,看看整个页面和上面显示的信息。[Alt text: Account details page] 这样做,不仅仅是为了获取记录 ID。至此,您将了解如何使用 Visualforce 代码构建显示相同信息的页面。
  9. 切换至您从开发者控制台打开的预览页面。单击浏览器窗口的 URL 字段,在 URL 的末尾输入 &id=,然后粘贴您之前复制的记录 ID。URL 看起来应该是这样的:https://MyDomainName.lightning.force.com/apex/AccountSummary?core.apexpages.request.devconsole=1&id=001D000000JRBes
  10. 按回车键以在新的 URL 中加载页面。

虽然加载带有记录 ID 的预览页看起来没有任何不同,但是添加 ID 意味着您可以请求标准控制器通过加载记录、且确保记录在页面上可用的方式来帮助您解决问题。

要在 Lightning Experience 的上下文中预览页面,请返回至主浏览器窗口,您可以在其中查看客户详细信息页。从客户详细信息页中,打开浏览器的 JavaScript 控制台并输入以下代码。请不要忘记将 pageName 替换为您的页面名称:

$A.get("e.force:navigateToURL").setParams( {"url": "/apex/pageName"}).fire();

您还可以通过将记录 ID 参数添加到 JavaScript 中 URL 末尾的方式来预览带有记录 ID 的页面:

$A.get("e.force:navigateToURL").setParams(
    {"url": "/apex/pageName?id=00141000004jkU0AAI"}).fire();

显示单个记录的数据

将客户的标准控制器添加到页面,然后引用客户字段以显示记录数据。

按照上一章节中加载的页面 URL 执行以下步骤,创建一个显示客户摘要的页面。

  1. 在页面标记的开头,在 <apex:page>标签内部添加以下属性。
    standardController="Account”现在当您保存页面时,预览页面会像以前一样重新加载,但这次客户的标准控制器处于活动状态。当页面加载时,标准控制器解析 URL 中的参数,找到 id 参数,并使用 id 的值来检索记录使得记录在页面上可用。您还看不到记录,但记录就在那里。
  2. 在页面正文中,添加以下标记。
Name: {! Account.name }

现在您可以看到正在检索记录!您应该会看到添加到 URL 中的记录 ID 所属的客户名称。

  1. 将客户名称的单行替换为以下标记。
    Name: {! Account.Name } <br/>
    Phone: {! Account.Phone } <br/>
    Industry: {! Account.Industry } <br/>
    Revenue: {! Account.AnnualRevenue } <br/>
    您的完整代码显示如下。
    <apex:page standardController="Account">
        <apex:pageBlock title="Account Summary">
            <apex:pageBlockSection>
                Name: {! Account.Name } <br/>
                Phone: {! Account.Phone } <br/>
                Industry: {! Account.Industry } <br/>
                Revenue: {! Account.AnnualRevenue } <br/>
            </apex:pageBlockSection>
        </apex:pageBlock>
    </apex:page>
    结果应该是一个简单的客户摘要。 

简单的客户摘要页面

接下来会发生什么呢?这一系列行为,都多亏了标准控制器!

  1. 当页面被加载,<apex:page> 组件激活时,也会激活客户对象的标准控制器。
  2. 标准控制器检测 URL 中有一个 ID 参数,然后搜索并检索匹配的客户记录。
  3. 标准控制器获取记录并将其放入可供页面使用的变量中。变量名与标准控制器的 sObject 同名,都称为 Account。它是一个对象变量,包含客户 sObject 上可用的所有字段。
  4. 四个 Visualforce 表达式都引用了客户变量。这些表达式使用点记法访问客户变量中的各个字段。{!Account.Name } 获取了客户名称等数据。

但是,收入数字是怎么回事?它是用科学计数法显示的。怎么能让它显示为货币呢?

数字显示为科学记数法中的“原始”值的原因是数字由表达式直接输出。它将原始值直接放到页面上。要控制值的格式,您需要使用一个组件,并为该组件提供要处理的值。该组件将获取原始值并对其进行适当的格式化,然后负责将结果输出到页面。您会在别的章节了解如何做到这一点。这里我们只探讨访问记录数据。

使用点记法显示相关记录的数据。

例如,在查看客户对象详细信息时,您可能已经注意到客户对象有一个名为“客户所有者”的字段,它的类型是 Lookup(User)。换句话说,这个字段与用户记录有关系。通过单击“客户所有者”字段标签链接,您会发现其字段名称是“所有者”。

Owner 关系代表一个用户。并且,如果从 Setup(设置)转到 Object Manager(对象管理器)| User(用户) | Fields & Relationships(字段和关系),您会发现用户有一个 Name(名称)字段。让我们使用此信息来显示用户。

在页面正文的客户名称之前,添加以下行。

Account owner: {! Account.Owner.Name } <br/>

点记法 (Account.Owner.Name) 表示要遍历记录之间的关系。Account.Owner 表示客户记录的所有者字段。末尾的附加 Name 表示 owner 字段不是字符串的简单字段,而是与另一条记录(即 Lookup(User))的关系,并且您希望获取由 Owner 字段值表示的记录(即用户记录),并在该记录上显示 Name 字段。

了解详细信息...

标准控制器功能非常强大,我们只是触及了皮毛。您将在其他地方了解关于标准触发器的更多信息,但这里聚焦了重点信息。

除了此处提及的轻松数据访问之外,标准控制器还提供了一组标准操作,例如创建、编辑、保存和删除,您可以使用标准用户界面元素(例如按钮和链接)将这些操作添加到您的页面中。当您了解 Visualforce 输入表单并将更改保存回数据库时,您将了解有关这些标准操作的更多信息。

想要嵌入到对象页面布局中的 Visualforce 页面,用作特定于对象的自定义操作,或用作 Salesforce 应用程序的移动卡必须使用相关对象的标准控制器。

如果您创建了自己的自定义对象(而不是使用客户等对象),并且想知道如何引用一个字段,则必须遵循略有不同的程序。从 Setup(设置)中,在 Quick Find(快速查找)方框中输入 Object Manager,然后选择 Object Manager(对象管理器)| <您的自定义对象> |Fields & Relationships(字段和关系)。找到您的字段并选择该字段。API 名称指明了必须在 Visualforce 页面中使用的字段的名称。例如,如果您的字段叫做 Foo,则其 API 名称为 Foo__c,您可以通过该名称引用 Foo,如:{! myobject__c.foo__c}

尽管标准控制器功能强大,但有时您还是需要做一些不同的事情,而 Visualforce 也都可以。任何时候,您都可以使用 Apex 代码替换或扩充控制器,编写自己的控制器,或扩展内置控制器。

资源

在 Salesforce 帮助中分享 Trailhead 反馈

我们很想听听您使用 Trailhead 的经验——您现在可以随时从 Salesforce 帮助网站访问新的反馈表单。

了解更多 继续分享反馈