[翻译]Chameleon介绍(3) : 列表控件
[原文]http://getben.com/archive/2007/01/11/introduction-to-chameleon-list-base-controls.aspx
这篇文章属于我的文章系列Chameleon介绍...
Chameleon 列表控件显示多个对象/值(例如一系列用户,或者同一主题里的若干论坛贴子)。和单值控件类似,列表控件也支持同样的基本属性(ControlIdsToHideWhenNotVisible, ContainerId, CssClass, Tag, DisplayConditions, LeaderTemplate, TrailerTemplate, DataSource, and Attributes),但它还定义了额外的模板,用于支持对列表中的每个对象/值进行布局。这些模板包括(以输出顺序):
与单值控件类似,与Community Server API对象相关的列表控件也根据它们包含的对象(如User, Post,等等)而命名,包括:
以及与特定应用相关的列表:
每个API相关列表控件都会根据它的上下文自动获取一系列对象。上下文由以下项定义:
尽管这只是UserList的QueryOverrides属性的实现,大多数列表也都支持PageIndex,PageSize,以及PagerID。每个列表暴露了与它所包含的数据相关的选项,这些选项可以通过智能提示方便地发现。例如,帖子列表(WeblogPostList, ForumPostList, EntityList, 以及GalleryPostList),通过它们的QueryOverrides内置属性,暴露了与具体应用相关的ThreadQuery实现。总体上来说,API提供的数据加载选项,大多数或者全部可以通过QueryOverrides使用(但是不需要编写C#代码)。
UserList控件的一个简单实例:
将会列出10个最后发帖的在线用户的昵称(链接到对用户帖子的搜索)。如果没有用户在线,将会输出消息“There are no active users!”。
注意<CSControl:UserData />控件在这个例子里显示了列表中的当前用户的数据。UserData控件隐式的从UserList控件获取当前用户。这个例子中,没有必要设置UserList或UserData的DataSource属性。
除了QueryOverrides里的特定选项以外,所有的Chameleon列表控件都以同样的方式运作。在智能提示的帮助下,定义列表以及浏览列表选项非常轻松。
如果你有任何关于Chameleon的问题,请通过我的联系表单或添加评论发送给我。我会在这一系列的最后一篇文章里回答它们。
这个系列的下一篇文章里,我会讨论表单控件。
这篇文章属于我的文章系列Chameleon介绍...
Chameleon 列表控件显示多个对象/值(例如一系列用户,或者同一主题里的若干论坛贴子)。和单值控件类似,列表控件也支持同样的基本属性(ControlIdsToHideWhenNotVisible, ContainerId, CssClass, Tag, DisplayConditions, LeaderTemplate, TrailerTemplate, DataSource, and Attributes),但它还定义了额外的模板,用于支持对列表中的每个对象/值进行布局。这些模板包括(以输出顺序):
- LeaderTemplate
LeaderTemplate包含了在控件内容之前,内容包装标签之内输出的标签。LeaderTemplate不支持数据绑定(这点不像单值控件)。
- HeaderTemplate
HeaderTemplate代表要在ItemTemplate, AlternateItemTemplate以及NoneTemplate前面输出的内容。
这个模板继承自Repeater(所有的Chameleon列表控件的基类).
- ItemTemplate
ItemTemplate代表DataSource里每一项的模板。
这个模板继承自Repeater(所有的Chameleon列表控件的基类)。
- AlternateItemTemplate
AlternateItemTemplate是可选的模板,用于交替输出DataSource内的项。如果未定义,所有的项都会以ItemTemplate输出。
这个模板继承自Repeater(所有的Chameleon列表控件的基类)。
- NoneTemplate
当DataSource不包含任何项时会输出NoneTemplate。在这种情况下,可以通过设置ShowHeaderFooterOnNone为 false来隐藏HeaderTemplate和FooterTemplate(ShowHeaderFooterOnNone默认为true)。
- SeparatorTemplate
SeparatorTemplate在输出的DataSource项之间(在ItemTemplate和AlternatingItemTeplate之间)输出。
这个模板继承自Repeater(所有的Chameleon列表控件的基类)。
- RowSeparatorTemplate
RowSeparatorTemplate在预定义数量的项之后(并且在SeparatorTemplate的后面)输出。ItemsPerRow属性定义了RowSeparatorTemplate之间应该输出多少项。
在以行和列的形式显示数据——比如相册里的图片时非常有用。
注意除非ItemsPerRow的值大于零,否则RowSeparatorTemplate不会输出。
- AdTemplate
AdTemplate表示要在DataSource的项之间显示的广告。广告出现的位置由属性AdPlacement(译注:目前 AdPlacementOptions枚举包括:None, PreFooter, PreSecond, PreSecondAndLast, Seperator)定义。
- FooterTemplate
FooterTemplate表示要在ItemTemplate, AlternateItemTemplate以及NoneTemplate后面输出的内容。
这个模板继承自Repeater(所有的Chameleon列表控件的基类)。
- TrailerTemplate
TrailerTemplate包含了在控件内容之前,内容包装标签之内输出的标签。TrailerTemplate不支持数据绑定(这点不像单值控件)。
与单值控件类似,与Community Server API对象相关的列表控件也根据它们包含的对象(如User, Post,等等)而命名,包括:
- UserList(<CSControl:UserList />)
- PostList(<CSControl:PostList />)
- SectionList(<CSControl:SectionList />)
- GroupList(<CSControl:GroupList />)
- 等等...
以及与特定应用相关的列表:
- WeblogList(<CSBlog:WeblogList />)
- WebLogPostList(<CSBlog:WebLogPostList />)
- ForumList(<CSForum:ForumList />)
- ForumPostList(<CSForum:ForumPostList />)
- 等等...
每个API相关列表控件都会根据它的上下文自动获取一系列对象。上下文由以下项定义:
- URL里的对象引用(例如贴子名称,用户ID,节的Application Key,等等)
- 父控件(通常由列表控件定义)
- 如果页面中没有上下文(在URL中没有指定对象引用),UserList控件默认情况下会列出网站的所有用户。
- 如果所在的页面指定了节ID或节的Application Key(比如一个博客页面),UserList控件将会列出此节的所有者。
- 如果UserList控件在SectionList控件的ItemTeplate或AlternateItemTemplate里,它将会列出每个节的所有者。
- 如果UserData控件在UserList控件的ItemTeplate或AlternateItemTemplate里,它会显示UserList控件中定义的当前用户。
- IncludeHiddenUsers
如果设为true,列表将包含隐藏用户。
- JoinedDate
当处理JoinedDateComparer时使用的DateTime值。
- JoinedDateComparer(LessThan, EqualTo, GreaterThan)
如果指定了JoinedDate,用户的注册时间必须匹配JoinedDateComparer定义的条件才会包含在列表中。例如,如果JoinedDate是"6/8/2001", JoinedDateCompare是"GreaterThan",那么只有在6/8/2001之后注册的用户才会被列出.
- LastPostDate
当处理LastPostDateComparer时使用的DateTime值。
- LastPostDateCompare(LessThan, EqualTo, GreaterThan)
如果指定了LastPostDate,用户的最后发贴时间必须匹配LastPostDateComparer定义的条件才会包含在列表中。例如,如果 LastPostDate是"6/8/2001",LastPostDateComparer是"LessThan",那么只有最后发贴时间在 6/8/2001之前的用户才会被列出。
- SortOrder(Ascending, Descending)
对用户排序方式(SortBy)的补充说明,顺序还是倒序。
默认情况下SortOrder的值是"Ascending"。
- PageIndex
要显示的页码。例如,如果PageSize设置为10,PageIndex为0,将会显示第1到10条用户数据(如果PageIndex设为1,将会显示第11到20条)。
注意如果指定了PagerId,属性PageIndex会被忽略,取代它作用的是分页器的PageIndex值
- PageSize
一页要显示的用户的数量。如果没有指定PagerId,它将是列表中显示的用户的总数量。
- Role
如果指定,只会显示属于指定角色的用户。
- SearchEmail
如果为true,SearchText会用来搜索用户的邮件地址。
- SearchUsername
如果为true,SearchText会用来搜索用户的名字。
- SearchText
如果指定,只有邮件地址或用户名(取决于SearchEmail和SearchUsername的值)匹配的用户才会被列出。
- SortBy(JoinedDate, Username, Website, LastActiveDate, Posts, Email, RecentPosts)
指定用户排序的依据。以顺序还是以倒序排序由SortOrder属性定义。
默认情况下,用户根据Username排序。
- AccountStatus(ApprovalPending, Approved, Banned, Disapproved, All)
如果指定,只有处于指定账号状态下的用户会被列出。
- Usernames
如果指定,只有这个属性里包含了用户名的用户会被列出。这个属性的值应该是以逗号间隔用户名。
- QueryType(Default, Search, ActiveUsers, ActiveModerators, CurrentUserFavorites, AccessingUserFavorites, UsersWatchingAccessingUser)
QueryType定义了用于获取用户列表的方法。"Default"将会单独以控件的上下文获取用户列表。
注意当QueryType是"ActiveUsers", "ActiveModerators", "CurrentUserFavorites", "AccessingUserFavorites" 或 "UsersWatchingAccessingUser" 时,很多过滤选项不可用。
- PagerID
分页器(或分页组,PagerGroup)的控件ID。这个控件用来在用户列表的不同页之间导航。
仅管这只是单个控件的ID,但还是可以通过一个辅助控件(PagerGroup)使用多个分页器给单个列表进行导航。
尽管这只是UserList的QueryOverrides属性的实现,大多数列表也都支持PageIndex,PageSize,以及PagerID。每个列表暴露了与它所包含的数据相关的选项,这些选项可以通过智能提示方便地发现。例如,帖子列表(WeblogPostList, ForumPostList, EntityList, 以及GalleryPostList),通过它们的QueryOverrides内置属性,暴露了与具体应用相关的ThreadQuery实现。总体上来说,API提供的数据加载选项,大多数或者全部可以通过QueryOverrides使用(但是不需要编写C#代码)。
UserList控件的一个简单实例:
<CSControl:UserList runat="server" ShowHeaderFooterOnNone="false">
<QueryOverrides QueryType="ActiveUsers" SortBy="RecentPosts" SortOrder="Descending" PageSize="10" />
<HeaderTemplate>
<ol>
</HeaderTemplate>
<ItemTemplate>
<CSControl:UserData Property="DisplayName" runat="server" Tag="LI" LinkTo="PostsSearch" />
</ItemTemplate>
<NoneTemplate>
There are no active users!
</NoneTemplate>
<FooterTemplate>
</ol>
</FooterTemplate>
</CSControl:UserList>
<QueryOverrides QueryType="ActiveUsers" SortBy="RecentPosts" SortOrder="Descending" PageSize="10" />
<HeaderTemplate>
<ol>
</HeaderTemplate>
<ItemTemplate>
<CSControl:UserData Property="DisplayName" runat="server" Tag="LI" LinkTo="PostsSearch" />
</ItemTemplate>
<NoneTemplate>
There are no active users!
</NoneTemplate>
<FooterTemplate>
</ol>
</FooterTemplate>
</CSControl:UserList>
将会列出10个最后发帖的在线用户的昵称(链接到对用户帖子的搜索)。如果没有用户在线,将会输出消息“There are no active users!”。
注意<CSControl:UserData />控件在这个例子里显示了列表中的当前用户的数据。UserData控件隐式的从UserList控件获取当前用户。这个例子中,没有必要设置UserList或UserData的DataSource属性。
除了QueryOverrides里的特定选项以外,所有的Chameleon列表控件都以同样的方式运作。在智能提示的帮助下,定义列表以及浏览列表选项非常轻松。
如果你有任何关于Chameleon的问题,请通过我的联系表单或添加评论发送给我。我会在这一系列的最后一篇文章里回答它们。
这个系列的下一篇文章里,我会讨论表单控件。