这篇文章属于我的文章系列 Chameleon介绍...
控件开发者使用条件控件定义查询条件,给其它控件使用.
条件控件通常用于其它Chameleon控件(如 单值控件, 列表控件,以及 表单控件),定义它们显示的条件.显示条件通过内置属性"DisplayConditions"定义.
Chameleon包含一系列默认的条件控件,同时提供了实现自定义条件的机制(继承ConditionBase).已有的条件控件包括:
- Conditions(<CSControl:Conditions />)
Conditons控件用于组合一个或更多其它条件控件的结果.例如:
< CSControl:Conditions Operator ="And" runat ="server" >只有在当前贴子包含视频并且已被审核通过时才会计算为真.
< CSControl:PostPropertyValueComparison runat ="server" ComparisonProperty ="HasVideo"
Operator ="IsSetOrTrue" />
< CSControl:PostPropertyValueComparison runat ="server" ComparisonProperty ="IsApproved"
Operator ="IsSetOrTrue" />
</ CSControl:Conditions >
Conditions控件只提供了一个属性,"Operator",用于定义如何计算包含的条件控件.支持的值有:Or, And, ExclusiveOr, 以及Not.
Chameleon控件的内置属性"DisplayConditions",是一个Conditons控件,用于支持只在某些条件下输出.
注意Conditions控件可以包含其它Conditons控件.当显示条件非常复杂时,嵌入Conditions控件很有用. - 属性和值比较控件
对Community Server API里的每个数据类型,都有一个对其进行属性/值比较的条件控件.属性/值比较控件提供了一种方式,来实现把对象的值或属性与一个预定义的值进行比较.例如:
< CSControl:PostPropertyValueComparison runat ="server" ComparisonProperty ="PostDate"在当前贴子的发表日期早于6/8/2006时为真.所有的属性/值比较控件提供了下列配置属性:
ComparisonValue ="6/8/2006" Operator ="LessThan" />
- ComparisonProperty
ComparisonProperty指定了用于比较的对象的属性名. - ComparisonValue
ComparisonValue指定一个固定的值,用于与ComparisonProperty进行比较.如果与ComparisonProperty是个DateTime值,ComparisonValue可以设为"today"或"now"来指定当前的日期或时间. - ComparisonValueAdjustment
ComparisonValueAdjustment 定义了用于调整ComparisonValue的量.当为ComparisonValue指定"today"或"now"时特别有用.在这种情况下,在处理条件前,ComparisonValueAdjustment与ComparisonValueAdjustmentUnits共同指定的一个时间长度会加到"today"或"now"上.
只有在ComparisonValue的类型是DateTime, int, 或double时,才会使用ComparisonValueAdjustment. - ComparisonValueAdjustmentUnits(Minute, Hour, Day, Month, Year, Default)
当指定了ComparisonValueAdjustment时,ComparisonValueAdjustmentUnits用于指定调整值的单位.例如,你可以使用下面的代码来检查一个指定的贴子是否是在最近24小时内发表的:
当ComparisonProperty的类型是int或double,并且指定了ComparisonValueAdjustment时,ComparisonValueAdjustUnit会被忽略.DateTime类型调整值的默认单位是Day. - Operator(Contains, EndsWith, EqualTo, GreaterThan, GreaterThanOrEqualTo, LessThan, LessThanOrEqualTo, StartsWith, IsSetOrTrue)
Operator指定如何比较ComparisonProperty的值与ComparisonValue.
如果Operator设为"IsSetOrTrue",ComparisonValue会被忽略.
- ComparisonProperty
- 属性比较条件
每个Community Server API数据类型对应了一个属性比较控件,和属性/值控件一样.属性比较控件提供了一种方式,来比较同一对象的两个属性.例如:
< CSControl:PostPropertyComparison runat ="server" ComparisonProperty1 ="Views"在当前贴子的点击数与回复数相等时为真.所有的属性比较条件提供了下列配置属性:
ComparisonProperty2 ="Replies" Operator ="EqualTo" />
- ComparisonProperty1
ComparisonProperty1定义了当前对象的一个属性名称,用于比较. - ComparisonProperty2
ComparisonProperty2定义了当前对象的一个属性名称,用于与ComparisonProperty1的值进行比较. - Operator(Contains, EndsWith, EqualTo, GreaterThan, GreaterThanOrEqualTo, LessThan, LessThanOrEqualTo, StartsWith, IsSetOrTrue)
Operator指定了如何比较ComparisonProperty1的值和ComparisonProperty2的值.
当Operator设为"IsSetOrTrue"时,ComparisonProperty2的值会被忽略.
- ComparisonProperty1
- ControlVisibilityCondition (<CSControl:ControlVisibilityCondition />)
ControlVisibilityCondition使用前页面的另一个控件的可视性(visibility)来构造条件.ControlVisibilityCondition定义了下面的配置属性:
- ControlId
当前页面用于比较其可视性的控件的ID. - ControlVisibilityEquals
ControlVisibilityEquals是个布尔值,用于指定使整个条件为真的可视性的值.
例如,如果ControlVisibilityEquals设置为"true",ControlId指定的控件必须可见(译注:即Visible=true),才能使ControlVisibilityCondition为真.
- ControlId
- UserInRoleCondition (<CSControl:UserInRoleCondition />)
UserInRoleCondition提供了一种方式来根据用户的角色定义条件.这个控件提供了下列配置属性:
- Role
Role指定了一个角色名称,用户只有属性这个角色时,条件才会计算为真. - UseAccessingUser
如果为true,会使用请求页面的用户来检查成员角色.如果为假,会使用根据UserInRoleCondition控件的上下文得到的当前用户.
- Role
- SectionPermissionCondition (<CSControl:SectionPermissionCondition />)
SectionPermissionCondition提供了一种根据用户在当前节的权限构造条件的方式。这个控件只提供了一个配置属性“Permission”,指定用户访问当前页面所需要的权限名称。如果用户在当前节(或节及帖子)里拥有指定的权限,SectionPermissionCondition值为真,否则为假。 - CurrentSiteUrlCondition (<CSControl:CurrentSiteUrlCondition />)
CurrentSiteUrlCondition提供了根据当前页面URL及SiteUrls.config文件构造条件的方式。这个控件只提供了一个配置属性“SiteUrlName”,指定URL在SiteUrls.config里的名称。如果当前页面的URL是SiteUrlName定义的Url,CurrentSiteUrlCondition值为真。
当SiteUrl.config里有多个URL通过同一物理Aspx页面输出,但不同的URL的输出间应该有轻微的不同时,这个控件非常有用。 - CustomCondition (<CSControl:CustomCondition />)
CustomCondition添加了对基于代码的条件的支持。它仅提供了一个属性“CustomResult”,可以设置为自定义代码的结果。例如:
< CSControl:CustomCondition runat ="server" CustomResult ='<%# DateTime.Now.Hour == 12 % > ' />在服务器时间在中午12点到1点之间时值为真。
界面开发者可以使用这些控件在他们的界面里实现大范围的条件输出。例如:
<
CSBlog:WeblogPostData
Text
="{0} comment(s)"
Property
="Replies"
LinkTo
="PostComments"
runat
="server"
>
< DisplayConditions >
< CSBlog:WeblogPostPropertyValueComparison runat ="server" ComparisonProperty ="Replies"
ComparisonValue ="0" Operator ="GreaterThan" />
</ DisplayConditions >
</ CSBlog:WeblogPostData >
< CSBlog:WeblogPostData Text ="no comments" LinkTo ="PostComments" runat ="server" >
< DisplayConditions >
< CSBlog:WeblogPostPropertyValueComparison runat ="server" ComparisonProperty ="Replies"
ComparisonValue ="0" Operator ="LessThanOrEqualTo" />
</ DisplayConditions >
</ CSBlog:WeblogPostData >
要么输出当前博客文章的评论数(如果大于0),要么输出“no comments"(如果尚无任何评论)。
< DisplayConditions >
< CSBlog:WeblogPostPropertyValueComparison runat ="server" ComparisonProperty ="Replies"
ComparisonValue ="0" Operator ="GreaterThan" />
</ DisplayConditions >
</ CSBlog:WeblogPostData >
< CSBlog:WeblogPostData Text ="no comments" LinkTo ="PostComments" runat ="server" >
< DisplayConditions >
< CSBlog:WeblogPostPropertyValueComparison runat ="server" ComparisonProperty ="Replies"
ComparisonValue ="0" Operator ="LessThanOrEqualTo" />
</ DisplayConditions >
</ CSBlog:WeblogPostData >
如果你有关于Chameleon表单控件的问题(或任何有关Chameleon的问题),请通过我的 联系表单或添加评论告诉我。我会在 这一系列的最后一篇文章里回答它们。
这个系列的下一篇文章里,我会讨论 动作控件。