其他分享
首页 > 其他分享> > 7.Visualforce 标准列表控制器(Standard List Controllers)

7.Visualforce 标准列表控制器(Standard List Controllers)

作者:互联网

1.标准列表控制器简介(Standard List Controller)

标准列表控制器允许您创建可以显示或操作一组记录的 Visualforce 页面。
显示记录列表是几乎所有 Web 应用程序的基本行为。Visualforce 只需使用标记,无需后端代码,就可以非常轻松地显示相同类型的记录列表。

标准列表控制器提供了诸多强大的自动行为,例如查询特定对象的记录并使记录在集合变量中可用,以及对结果进行筛选和分页。

将标准列表控制器添加到页面与添加标准(记录)控制器非常相似,目的是一次处理多条记录,而不是只处理一条记录。

2.显示记录列表(a List of Records)

使用标准列表控制器和迭代组件,例如使用 <apex:pageBlockTable> 显示记录列表。
标准(记录)控制器可以轻松地将单个记录加载到可以在 Visualforce 页面上使用的变量中。标准列表控制器与之类似,不同的是,它不是将单个记录加载到变量中,而是将记录的列表或集合加载到变量中。

因为需要处理的是一个集合,而不是单个记录,所以需要使用迭代组件来显示。迭代组件处理类似项的集合,而不是单个值。迭代组件循环遍历集合,并且对于每个记录,根据作为组件标记的一部分提供的模板生成输出。

使用标准列表控制器的标记几乎与使用标准的、一次一条记录的控制器相同。

示例代码:

<apex:page standardController="Contact" recordSetVar="contacts">
    <apex:pageBlock title="Contacts List">
        <!-- Contacts List -->
        <apex:pageBlockTable value="{! contacts }" var="ct">
            <apex:column value="{! ct.FirstName }"/>
            <apex:column value="{! ct.LastName }"/>
            <apex:column value="{! ct.Email }"/>
            <apex:column value="{! ct.Account.Name }"/>
        </apex:pageBlockTable>
    </apex:pageBlock>
</apex:page>

代码解析:

  1. <apex:pageBlockTable> 的 value 属性设置为标准列表控制器加载的变量 {! contacts }。这是 <apex:pageBlockTable> 使用的记录列表。
  2. 对于列表中的每条记录,一次一条记录,<apex:pageBlockTable> 将该记录分配给 <apex:pageBlockTable> 的 var 属性中命名的变量。本示例中,变量名称为 ct。
  3. 对于每条记录,<apex:pageBlockTable> 使用 <apex:pageBlockTable> 主体中的 <apex:column> 列组件集合定义的行在表中构造一个新行。<Apex:column> 组件依次使用表示当前记录的 ct 变量来提取该记录的字段值。
  4. 在循环的外部,<apex:pageBlockTable> 使用 <apex:column> 列组件中的字段,通过查找每个字段标签的方式来创建列标题。

预览结果:

 

 

 3.将筛选列表视图添加到列表中(Add List View Filtering to the List)

标准列表控制器提供了诸多可用于更改列表显示的特性。其中最强大的特性是列表视图筛选器。可以声明使用单击而不是代码的方式创建列表视图筛选器,标准列表控制器允许在页面上使用已定义的任意列表视图筛选器。

将整个 <apex:pageBlock> 封装在 <apex:form> 标签中。要更改标准列表控制器的列表视图筛选器,需要将新值提交回服务器。提交的标准方法是使用 <apex:form> 组件创建的表单。

在 <apex:pageBlock> 标签下,添加以下属性,这样就给<apex:pageBlock> 提供了一个“名称”,就可以用它来实现很酷的 Ajax 效果

id="contacts_list"

示例代码:

<apex:page standardController="Contact" recordSetVar="contacts">
    <apex:form>
        <apex:pageBlock title="Contacts List" id="contacts_list">
            Filter:
            <apex:selectList value="{! filterId }" size="1">
                <apex:selectOptions value="{! listViewOptions }"/>
                <apex:actionSupport event="onchange" reRender="contacts_list"/>
            </apex:selectList>
            <!-- Contacts List -->
            <apex:pageBlockTable value="{! contacts }" var="ct">
                <apex:column value="{! ct.FirstName }"/>
                <apex:column value="{! ct.LastName }"/>
                <apex:column value="{! ct.Email }"/>
                <apex:column value="{! ct.Account.Name }"/>
            </apex:pageBlockTable>
        </apex:pageBlock>
    </apex:form>
</apex:page> 

 

代码解析:

列表会在不重新加载整个页面的情况下更新。这种 “Ajax” 效果是由 <apex:actionSupport> 组件上的 reRender="contacts_list” 属性提供的。

组件和 reRender 的组合效果是仅更新在 reRender 属性中命名的页面部分。

由于将 id="contacts_list” 添加到 <apex:pageBlock>,当操作完成时,在无需重新加载整个页面的情况下,即可实现只更新 <apex:pageBlock> 的效果。

 

此页面新功能的完整生命周期是这样的:

当加载页面时,<apex:selectList> 通过从 {! listViewOptions } 表达式获取列表,创建可用筛选器菜单。listViewOptions 是标准列表控制器提供的属性。

当从菜单中选择一个新选项时,<apex:actionSupport> 组件会触发 onchange 事件。

当 onchange 触发时,页面通过将新项目提交给 <apex:selectList> 中设置的 filterId 属性的方式,提交已选择的新列表视图。

当属性更新时,页面从服务器获得新的响应,在 contacts 变量中会有一个新的匹配记录集合。

由于 <apex:actionSupport> 指定只重新渲染页面的一部分,页面是使用 Ajax(异步 JavaScript)更新的,而不是通过重新加载整个页面的方式。

最终结果是,只需添加几行标记,即可实现错综复杂的行为。

 

预览结果:

 

 

 4.向列表添加分页

使用标准列表控制器的分页特性,允许用户单次查看一页长的记录列表。

事实上,标准列表控制器默认情况下只显示符合筛选条件的前 20条记录(如果有的话)。如何让用户访问超出前 20 条的记录,或者每页记录超过 20 条?

分页可以解决这个问题。这是一个标准的 Web 应用程序用户界面元素,通常使用下一页和上一页链接,实现在单页的一长串记录中向前或向后移动。

可以使用标准列表控制器将其添加到页面中,还可以使用进度指示器和菜单来更改每页记录的数量。

代码示例:

<apex:page standardController="Contact" recordSetVar="contacts">
    <apex:form>
        <apex:pageBlock title="Contacts List" id="contacts_list">
            Filter:
            <apex:selectList value="{! filterId }" size="1">
                <apex:selectOptions value="{! listViewOptions }"/>
                <apex:actionSupport event="onchange" reRender="contacts_list"/>
            </apex:selectList>
            <!-- Contacts List -->
            <apex:pageBlockTable value="{! contacts }" var="ct">
                <apex:column value="{! ct.FirstName }"/>
                <apex:column value="{! ct.LastName }"/>
                <apex:column value="{! ct.Email }"/>
                <apex:column value="{! ct.Account.Name }"/>
            </apex:pageBlockTable>
            <!-- Pagination -->
            <table style="width: 100%">
                <tr>
                    <td>
                        <!-- 向列表中添加进度指示器,指示用户正在查看哪个页面,以及剩下多少页面 -->
                        Page: <apex:outputText value=" {!PageNumber} of {! CEILING(ResultSize / PageSize) }"/>
                    </td>
                    <td align="center">
                        <!-- 上一页及下一页链接 -->
                        <apex:commandLink action="{! Previous }" value="« Previous" rendered="{! HasPrevious }"/>
                        <!-- inactive (no earlier pages) -->
                        <apex:outputText style="color: #ccc;" value="« Previous" rendered="{! NOT(HasPrevious) }"/>
                          
                        <apex:commandLink action="{! Next }" value="Next »" rendered="{! HasNext }"/>
                        <!-- inactive (no more pages) -->
                        <apex:outputText style="color: #ccc;" value="Next »" rendered="{! NOT(HasNext) }"/>
                    </td>
                    <td align="right">
                        <!-- 更改每页记录数的菜单 -->
                        Records per page:
                        <apex:selectList value="{! PageSize }" size="1">
                            <apex:selectOption itemValue="5" itemLabel="5"/>
                            <apex:selectOption itemValue="20" itemLabel="20"/>
                            <apex:actionSupport event="onchange" reRender="contacts_list"/>
                        </apex:selectList>
                    </td>
            	</tr>
            </table>
        </apex:pageBlock>
    </apex:form>
</apex:page>

代码解析:

  通过使用渲染属性中的表达式,可以在页面上显示或隐藏该组件的结果。当第一次加载页面时,上一页链接置灰,但如果通过单击下一页链接向前移动时,上一个链接则变为活动状态。

预览结果:

标准列表控制器提供了诸多 Web 应用程序中常见的功能,远不止本章节介绍的功能。

例如,除了每次向前或向后移动一个页面的 Previous 和 Next 操作以外,还有指向记录列表开头或结尾的 First 和 Last 操作。

Resources

a List of Records

标签:控制器,记录,List,列表,Controllers,标准,组件,Standard,页面
来源: https://www.cnblogs.com/kousaimiao/p/16244499.html