Be and aware who you are.
置顶随笔
摘要: 别被下面那些复杂的表达式吓倒,只要跟着我一步一步来,你会发现正则表达式其实并不像你想像中的那么困难。当然,如果你看完了这篇教程之后发现自己明白了很多,却又几乎什么都记不得,那也是很正常的--其实我认为没接触过正则表达式的人在看完这篇教程后能把提到过的语法记住80%以上的可能性为零。这里只是让你明白基本道理,以后你还需要多练习,多查资料,才能熟练掌握正则表达式。
阅读全文
2007年9月18日
遇到这个问题的代码很可能像这样:
[Layout("default")]
public void Save([ARDataBind("item")]Item item)
{
item.Save();
}
解决它的办法也很简单,改成下面这样就可以了:
[Layout("default")]
public void Save([ARDataBind("item", AutoLoadBehavior.NewInstanceIfInvalidKey)]Item item)
{
item.Save();
}
2007年5月13日
[原文]: http://getben.com/archive/2007/01/16/introduction-to-chameleon-action-controls.aspx
这篇文章属于我的文章系列Chameleon介绍...
动作控件定义了单个功能或行为,由其它Chameleon控件在配置的事件发生时调用。
动作控件通常使用于当Chameleon表单控件处理完成了一个事件,比如博客联系表单提交成功。例如:
<CSBlog:ContactForm runat="server" SubjectTextBoxId="Subject" NameTextBoxId="Name"
EmailTextBoxId="Email" MessageTextBoxId="Body" SubmitButtonId="Submit">
<SuccessActions>
<CSControl:SetVisibilityAction runat="server" ControlIdsToShow="SuccessMessage" />
</SuccessActions>
<FormTemplate>
<div><CSControl:FormLabel LabelForId="Name" runat="server"
ResourceName="Weblog_ContactForm_Name" /></div>
<div><asp:TextBox id="Name" runat="server" /></div>
<div><CSControl:FormLabel LabelForId="Email" runat="server"
ResourceName="Weblog_ContactForm_Email" /></div>
<div><asp:TextBox id="Email" runat="server" /></div>
<div><CSControl:FormLabel LabelForId="Subject" runat="server"
ResourceName="Weblog_ContactForm_Subject" /></div>
<div><asp:TextBox id="Subject" runat="server" /></div>
<div><CSControl:FormLabel LabelForId="Body" runat="server"
ResourceName="Weblog_ContactForm_Body" /></div>
<div><asp:TextBox id="Body" runat="server" TextMode="MultiLine" /></div>
<div>
<asp:Button id="Submit" runat="server" Text="Send" />
<CSControl:ResourceControl runat="Server" id="SuccessMessage"
ResourceName="Weblog_ContactForm_Sent" Visible="false" />
</div>
</FormTemplate>
</CSBlog:ContactForm>
使用<CSControl:SetVisibilityAction />动作控件来声明,当<CSBlog:ContactForm />提交成功后,以"SuccessMessage"为ID的控件的Visibility属性应该设为真。
Community Server 2007里定义了很多动作控件,也可以轻松地定义新的动作控件(所有动作控件继承于ActionBase)。已有的动作控件包括:
- ExecuteScriptAction (<CSControl:ExecuteScriptAction />)
ExecuteScriptAction会运行由Script属性指定的JavaScript脚本。
- GoToCurrentContentAction (<CSControl:GoToCurrentContentAction />)
如果在当前上下文中存在内容对象的话,GoToCurrentContentAction会导航到当前内容对象。
- GoToCurrentPostAction (<CSControl:GoToCurrentPostAction />)
如果当前上下文中存在贴子的话,GoToCurrentPostAction会导航到当前的贴子(Post)。
- GoToModifiedUrlAction (<CSControl:GoToModifiedUrlAction />)
GoToModifiedUrlAction会应用指定的查询字符串(QueryStringModification属性指定)及目标更改(TargetLocaitonModification属性指定)到当前URL,并导航到更改后的结果URL。
- GoToReferralUrlAction (<CSControl:GoToReferralUrlAction />)
如果查询字符串里声明了引用URL的话,GoToReferralUrlAction会导航到该URL。
- GoToSiteUrlAction (<CSControl:GoToSiteUrlAction />)
GoToSiteUrlAction会导航到UrlName指定的SiteUrls.config文件里定义的Url。
- SetVisibilityAction (<CSControl:SetVisibilityAction />)
SetVisibilityAction会设置ControlIdsToShow属性指定的控件为可见(Visible=ture)并且设置ControlIdsToHide属性指定的控件为不可见(Visible=false)。两个属性里的列表都用逗号分隔。
- CustomAction (<CSControl:CustomAction />)
CustomAction通过提供CustomEvent事件,添加了基于代码的动作。这个事件可以用来实现内联代码。CustomEvent为事件处理器传入了执行此事件的父控件的引用,以及父控件的参数(与具体的控件有关)。例如:
<script runat="server" language="C#">
protected void MyCustomEventHandler(System.Web.UI.Control sender, object parameter)
{
// custom code here
}
</script>
<CSControl:CustomAction runat="server" CustomEvent="MyCustomEventHandler" />
会执行定义在页面上的MyCustomEventHandler方法里的自定义代码。
- Actions (<CSControl:Actions />)
Actions用于执行一系列的子动作。上面示例中<CSBlog:ContactForm />的内置属性"SuccessActions"就是一个Actions控件。
注意,Actions里可以使用多于一个运作控件。动作以它们定义的顺序执行,因此,下面的例子:
<SuccessActions>
<CSControl:GoToReferralUrlAction runat="server" />
<CSControl:SetVisibilityAction runat="server" ControlIdsToShow="SuccessMessage" />
</SuccessActions>
会首先试图导航到查询字符串里指定的引用URL。如果没有定义引用URL,"SuccessMessage"控件会显示。
动作控件提供了一种简单的机制允许界面开发者自定义表单的行为。界面开发者现在可以根据他们界面的需要而实现自定义的导航和通知行为。
如果你有关于Chameleon表单控件的问题(或任何有关Chameleon的问题),请通过我的联系表单或添加评论告诉我。我会在这一系列的最后一篇文章里回答它们。
这个系列的下一篇文章里,我会讨论辅助控件。
2007年5月11日
[原文]
http://getben.com/archive/2007/01/15/introduction-to-chameleon-condition-controls.aspx这篇文章属于我的文章系列
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"
ComparisonValue="6/8/2006" Operator="LessThan" />
在当前贴子的发表日期早于6/8/2006时为真.所有的属性/值比较控件提供了下列配置属性:
- 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会被忽略.
- 属性比较条件
每个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的值会被忽略.
- ControlVisibilityCondition (<CSControl:ControlVisibilityCondition />)
ControlVisibilityCondition使用前页面的另一个控件的可视性(visibility)来构造条件.ControlVisibilityCondition定义了下面的配置属性:
- ControlId
当前页面用于比较其可视性的控件的ID.
- ControlVisibilityEquals
ControlVisibilityEquals是个布尔值,用于指定使整个条件为真的可视性的值.
例如,如果ControlVisibilityEquals设置为"true",ControlId指定的控件必须可见(译注:即Visible=true),才能使ControlVisibilityCondition为真.
- UserInRoleCondition (<CSControl:UserInRoleCondition />)
UserInRoleCondition提供了一种方式来根据用户的角色定义条件.这个控件提供了下列配置属性:
- Role
Role指定了一个角色名称,用户只有属性这个角色时,条件才会计算为真.
- UseAccessingUser
如果为true,会使用请求页面的用户来检查成员角色.如果为假,会使用根据UserInRoleCondition控件的上下文得到的当前用户.
- 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"(如果尚无任何评论)。
如果你有关于Chameleon表单控件的问题(或任何有关Chameleon的问题),请通过我的
联系表单或添加评论告诉我。我会在
这一系列的最后一篇文章里回答它们。
这个系列的下一篇文章里,我会讨论
动作控件。
2007年5月5日
[原文]http://getben.com/archive/2007/01/12/introduction-to-chameleon-form-controls.aspx
这篇文章属于我的文章系列Chameleon介绍...
Chameleon表单控件实现了Community Server的表单功能,例如:创建论坛贴子,编辑用户资料,或注册用户账号。
Chameleon里的表单控件定义了实现表单所需的最少功能——它们像“胶水”一样,把一系列表单元素粘合在一起,执行一个操作。操作完成后,很多表单还提供了一种方式,让界面开发人员决定下一步要做什么。例如,博客控件ContactForm:
<CSBlog:ContactForm runat="server" SubjectTextBoxId="Subject" NameTextBoxId="Name"
EmailTextBoxId="Email" MessageTextBoxId="Body" SubmitButtonId="Submit">
<SuccessActions>
<CSControl:SetVisibilityAction runat="server" ControlIdsToShow="SuccessMessage" />
</SuccessActions>
<FormTemplate>
<div><CSControl:FormLabel LabelForId="Name" runat="server"
ResourceName="Weblog_ContactForm_Name" /></div>
<div><asp:TextBox id="Name" runat="server" /></div>
<div><CSControl:FormLabel LabelForId="Email" runat="server"
ResourceName="Weblog_ContactForm_Email" /></div>
<div><asp:TextBox id="Email" runat="server" /></div>
<div><CSControl:FormLabel LabelForId="Subject" runat="server"
ResourceName="Weblog_ContactForm_Subject" /></div>
<div><asp:TextBox id="Subject" runat="server" /></div>
<div><CSControl:FormLabel LabelForId="Body" runat="server"
ResourceName="Weblog_ContactForm_Body" /></div>
<div><asp:TextBox id="Body" runat="server" TextMode="MultiLine" /></div>
<div>
<asp:Button id="Submit" runat="server" Text="Send" />
<CSControl:ResourceControl runat="Server" id="SuccessMessage"
ResourceName="Weblog_ContactForm_Sent" Visible="false" />
</div>
</FormTemplate>
</CSBlog:ContactForm>
定义了一个表单,允许浏览网站的人联系博客的所有者。ContactForm的属性指定了FormTemplate里的控件,它使用这些控件来实现表单必需的输入——主题,姓名,邮件,消息,以及提交。ContactForm自身提供了“连线”功能,使得这些表单元素执行联系博客所有者的任务。当表单成功处理后,内置属性SuccessActions定义了要执行的动作(动作控件将会在本系列稍后的一篇文章里讨论)。
Chameleon表单控件支持与单值控件相同的属性(ControlIdsToHideWhenNotVisible, ContainerId, CssClass, Tag, DisplayConditions, LeaderTemplate, TrailerTemplate, DataSource, and Attributes),同时还支持以下属性(从WrappedFormBase继承而来):
- ValidationGroup
ValidationGroup是验证组的名字,会在验证表单的内容时使用。
- FormTemplate
FormTemplate是一个内置属性,包含了作为表单内容输出的标签和控件。一般情况下,表单的子控件包含在FormTemplate里,但这并不是必须的。
- 子控件的ID
每个表单支持指定用途的一系列子控件。对于支持的每个子控件,都暴露了一个属性,以期望的值/用途和控件的类型命名。
并非所有子控件属性都必须被设置,然而,如果需要的控件ID未被指定(或不存在),表单控件将会抛出一个异常,解释哪些控件ID是必须的。
- 完成后的动作
取决于表单的功能,与动作相关的内置属性会被暴露,以允许界面开发者定义一个或一些动作,在表单完成了特定功能后执行。
大部分表单控件暴露了“SuccessActions”,在表单成功完成后(例如,当ContactForm成功地提交后)执行。如果一个表单有不止一个完成动作,它会为每种类型的完成动作,暴露一个“Actions”内置属性。类似地,如果表单没有完成动作,或它的完成动作是预定义的(例如,SearchForm总是把用户转到搜索结果页面),它不会支持任何界面开发者定义的“Actions”。
- SubFormIDs
少数几个Chameleon表单控件支持子表单。Chameleon子表单控件(继承于WrappedSubFormBase)可以参与表单生命周期,并且扩展现有表单的功能。例如,CreateEditForumPostForm支持子表单,在默认的界面中,它使用了TagsSubForm,AttachmentSubForm,VideoSubForm,PollSubForm,以及InkSubForm,给基本的论坛发贴表单添加标签,附件,视频,投票,以及Ink(各自添加一种功能)等功能。
子表单使得表单更加简单——CreateEditForumPostForm实现了发表论坛贴子所需要的基本功能——同时允许在界面复用的基础上,添加新的,自定义的功能。例如,界面开发者可以使用投票子表单或视频子表单的自定义实现,而不需要编程重写整个CreateEditForumPostForm控件。类似地,界面开发者可以给表单添加一个新的子表单,比如添加一个允许用户选择贴子背景纹理的子表单。
Chameleon表单控件在功能上类似Community Server 2.1及更早版本里的themed controls。它们附加到预定义的子控件上,并使用这些子控件执行特定的功能。然而,不像Community Server 2.1及更早版本,Chameleon表单控件暴露了它所支持的子控件的列表(通过子控件ID属性),允许界面开发人员定义控件ID,并且允许界面开发者自定义完成动作(通过动作控件)以及表单功能(通过子表单)。
如果你有关于Chameleon表单控件的问题(或任何有关Chameleon的问题),请通过我的联系表单或添加评论告诉我。我会在这一系列的最后一篇文章里回答它们。
这个系列的下一篇文章里,我会讨论条件控件。
2007年5月4日
[原文]
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),但它还定义了额外的模板,用于支持对列表中的每个对象/值进行布局。这些模板包括(以输出顺序):
- 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 />)
- 等等...
当Community Server 2007发布后,我们会有每个控件的文档。大体上说,和
单值控件一样,每个Community Server API对象都有一个相应的列表控件。
每个API相关列表控件都会根据它的上下文自动获取一系列对象。上下文由以下项定义:
- URL里的对象引用(例如贴子名称,用户ID,节的Application Key,等等)
- 父控件(通常由列表控件定义)
例如:
- 如果页面中没有上下文(在URL中没有指定对象引用),UserList控件默认情况下会列出网站的所有用户。
- 如果所在的页面指定了节ID或节的Application Key(比如一个博客页面),UserList控件将会列出此节的所有者。
- 如果UserList控件在SectionList控件的ItemTeplate或AlternateItemTemplate里,它将会列出每个节的所有者。
- 如果UserData控件在UserList控件的ItemTeplate或AlternateItemTemplate里,它会显示UserList控件中定义的当前用户。
大多数控件同时也支持一个内置属性,用于影响或改写默认的隐式数据源。这个属性的名称是“QueryOverrides”,它的属性很大程度上依赖于控件所列出的对象的类型。例如,UserList的QueryOverrides属性支持:
- 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>
将会列出10个最后发帖的在线用户的昵称(链接到对用户帖子的搜索)。如果没有用户在线,将会输出消息“There are no active users!”。
注意<CSControl:UserData />控件在这个例子里显示了列表中的当前用户的数据。UserData控件隐式的从UserList控件获取当前用户。这个例子中,没有必要设置UserList或UserData的DataSource属性。
除了QueryOverrides里的特定选项以外,所有的Chameleon列表控件都以同样的方式运作。在智能提示的帮助下,定义列表以及浏览列表选项非常轻松。
如果你有任何关于Chameleon的问题,请通过我的
联系表单或添加评论发送给我。我会在这一系列的最后一篇文章里回答它们。
这个系列的下一篇文章里,我会讨论
表单控件。