[翻译]Chameleon介绍(1) : 与CS2.1的区别
[原文]:http://getben.com/archive/2007/01/09/introduction-to-chameleon-differences-from-cs2-1.aspx
这篇文章属于我的文章系列:Chameleon介绍
Chameleon代表Community Server界面实现方式上的一个大的更改。变化包括:
- 取消了皮肤文件
Community Server 2.1及以前的版本包含了大量的通用控件,每个都有自己的ASCX文件,用以包含它们的界面结构。Chameleon则为SiteUrls.config里声明的每个URL(可能一个ASPX对应SiteUrls.config里的多个URL)定义单个ASPX页面。每个ASPX文件定义了页面展现的整个内容,这样就允许对整个页面布局和行为进行更多的控制。界面开发人员根据情况自己决定是否使用主版页和用户控件。现在一个页面不再是六个或者更多ASCX文件的集合了——默认情况下每个展现的页面只对应一个文件(不计算主版页的话)。
- 一个完整的Blog界面现在只包括8个文件(CS2.1里是55个,也就是减少了85%)
- 一个完整的网站界面现在只包括70个文件(CS2.1里是164个,减少了58%)
- 通用控件
Community Server 2.1及更早的版本里的控件具有着专用的用户界面和行为。2.1及以前版本的大多数控件,都通过在它们相关的皮肤文件中查找预先定义的(并且经常是含义模糊的)子控件ID,来生成这些子控件。这样,这些控件就约束了界面开发者的创意:它们只支持预先定义了数量和类型的子控件,而且,它们行为和完成后的动作也是预定义的,无法被改写。与之不同,Chameleon则根据Community Server 的API 定义了标准的一系列通用控件。Chameleon控件不是通过界面把数据“推”进页面(在CS2.1里预定义子控件的控件就是采用这种方式),而是从Community Server的API里“拉”出数据,给界面开发人员以无比的灵活性。Chameleon控件支持声明性的,可扩展的“DisplayCondition”,用于定义在什么条件下一个控件应该显示;也支持通过声明来定义的“Actions”,用于定义当控件支持的事件引发时应该怎么处理(比如表单提交成功)。
Chameleon被实现为一个简单的声明性UI语言,包含了与Community Server API里每一种类型的数据相关的控件。
例如,在Chameleon,用户的呢称可以通过UserData控件来获取和显示:
<CSControl:UserData Property="DisplayName" runat="server" Text="Display name is {0}" LinkTo="Profile" />这将会输出:
链接到我的个人资料。
无论你想要在哪里显示用户的数据,都可以使用同一个控件:UserData,控件明白它自己的上下文...
- 隐式的,上下文相关的数据绑定
- 所有的Chameleon控件都支持隐式的,上下文相关的数据绑定。例如:
放在SectionList控件里的UserData控件会显示与每个Section相关的第一个所有者的数据(如果这个Section拥有一个或更多的拥有者的话;同样地,UserList控件将会列出这个Section的所有拥有者)。 - 放在PostList控件里的UserData控件会显示每个Post的作者的相关数据。
很多用于列出数据的控件(例如SectionList和UserList)都支持“QueryOverrides”选项,允许界面开发人员定义或改写默认的隐式数据源,或者定义分页控件来对列出的数据进行分页。
隐式数据源可以通过设置控件的DataSource属性来改写。然而,大多数情况下(在CS3.0默认模板里是所有情况下),没有这个必要。
下面是隐式上下文相关数据绑定的一个示例:
<CSForum:ForumPostList runat="server">
<QueryOverrides SortBy="SortOrder" PagerID="Pager" PageSize="40" />
<HeaderTemplate>
<ul>
</HeaderTemplate>
<ItemTemplate>
<li>
<CSForum:ForumPostData Property="Subject" runat="server" />
by
<CSControl:UserData Property="DisplayName" LinkTo="Profile" runat="server" />
</li>
</ItemTemplate>
<FooterTemplate>
</ul>
</FooterTemplate>
</CSForum:ForumPostList>
<CSControl:Pager runat="server" id="Pager" />将会根据当前的下下文(例如,一个主题)列出论坛贴子,以它们的“SortOrder”排序,40个一页,分页控件会出现在帖子列表的下面:
* Post Subject 1 by Ben
* Post Subject 2 by Ben
* Post Subject 3 by Ben
* …
* Post Subject 40 by Ben
1 2 3 - 所有的Chameleon控件都支持隐式的,上下文相关的数据绑定。例如:
- 更少(或者没有)预定义的标签语句
Community Server 2.1及更早的版本里的一些控件和方法,包含了大量硬编码的HTML标签语句。Chameleon控件,一般而言,则为界面开发人员提供了对输出HTML的完全控制。
所有的Chameleon控件都提供了“Tag”,“CssClass”,以及“ContainerId”属性,用于定义包含控件内容简单标签。例如:
<CSControl:UserData runat="server" Property="DisplayName" Tag="H1" CssClass="CommonTitle"
ContainerID="UserName" />将会输出
<h1 id="UserName" class="CommonTitle">Ben</h1>所有的Chameleon控件都支持一个“LeaderTemplate”和“TailerTemplate”属性,它们的值会输出在控件内容的前面(Leader)和后面(Tailer)。例如:
<CSControl:UserData runat=”server” Property=”DisplayName” LinkTo=”Profile”>
<LeaderTemplate>
<div id=”UserArea”>
<h2 style=”color: #ff0000; font-size: 200%;”>
</LeaderTemplate>
<TrailerTemplate>
</h2>
</div>
</TrailerTemplate>
</CSControl:UserData>的输出是当前用户的DisplayName,它被指定的首部和尾部HTML所包含,并且链接到用户的个人资料页面,注意只有当控件被输出时“LeaderTemplate”和“TailerTemplate”才会输出——因此如果界面开发人员在UserData控件上设置了“DisplayCondition”,首部HTML和尾部HTML,以及控件的内容,都只有在条件为真时才会输出。
- 取消了界面继承
界面继承是CS2.1及更早版本里的一个不常使用而且容易令人困惑的功能。如果一个界面没有定义一个需要的皮肤文件,CS2.1和以前的版本会从默认界面加载相应的皮肤文件。这种事不会再发生了。
Chameleon里所有的界面都必须是完整的。这样使得界面更容易提取,也更加可移植。要想发布一个Chemeleon界面,只需要拷贝web/theme/[THEME_NAME]目录下的内容,不再有依赖于外部(除非界面开发人员引入了对外部的依赖)。
- 对控制面板的分离
控制面板现在与网站界面完全分离——控制面板需要的所有的主版页,样式表,图片等等现在都包含在WEB/ ControlPannel目录下。界面开发人员不再需要手动分离控制面板(译:需要的部分),或者设计同时支持前台网站和后台控制面板的界面。
这些就是CS2.1和CS2007里界面开发的比较大的区别。在我的下一篇Chameleon文章里,我将开始介绍Chameleon基本控件。
如果你有任何关于Chameleon的问题,请通过我的联系表单或发表评论来告诉我。我会在这一系列的最后的文章里回答所有这些问题。