[翻译]Chameleon介绍(2) : 单值控件

[原文]http://getben.com/archive/2007/01/10/introduction-to-chameleon-single-value-base-controls.aspx

这篇文章属于我的文章系列Chameleon介绍...

在我的文章与CS2.1的区别里提到过,Chameleon使用了基于Community Server API的一系列通用控件。这些控件分为以下几类:

  1. 单值控件
  2. 列表控件
  3. 表单控件
  4. 条件控件
  5. 动作控件
  6. 辅助控件

今天的文章里将会介绍单值控件。

单值控件代表了单个的值(语言资源,弹出菜单,等等)或者单个API对象(帖子,用户,节(译注:CS里把论坛分版,博客,相册,下载文件夹等概念统一成节(Section),作为一个容器,节用于容纳里边的论坛帖子,文章,照片,文件等具体内容。这有点类似于文章系统里的分类的概念),分组,等等等)的一系列值。例如,UserData控件,可以这样简单:

<CSControl:UserData runat="server" Property="DisplayName" />

这将会输出我的名字,“Ben Tiedt”(不会添加任何标签);或者也可以这么自定义:

<CSControl:UserData ContainerId="WrapperID" Tag="H2" CssClass="WrapperClass" Property="DisplayName"
 LinkTo="Profile" unrecognized="true">
   
<DisplayConditions Operator="And">
      
<CSControl:QueryStringPropertyValueComparison runat="server" QueryStringProperty="ShowName"
 ComparisonValue="true" Operator="EqualTo" />
      
<CSControl:UserInRoleCondition runat="server" Role="Moderators" />
   
</DisplayConditions>
   
<LeaderTemplate>
      I'm a moderator and my 
<u>name</u> is
   
</LeaderTemplate>
   
<TrailerTemplate>
      .  So there!
   
</TrailerTemplate>
</CSControl:UserData>

这将会输出下面的HTML源代码:

<h2 class="WrapperClass" id="WrapperID" unrecognized="true">I'm a moderator and my <u>name</u> is
<href="http://getben.com/user/Profile.aspx?UserID=2108">Ben Tiedt</a>.  So there!</h2>

这里的H2是内容包装标签,进一步,首部和尾部模板在内容包装标签(H2)内部对内容进行包装。注意只有在页面查询参数包含“ShowName=true”,并且我是“Moderators”角色的成员时才会输出。我会在稍后的另一篇文章里谈谈条件控件。

所有的单值控件都支持以下属性(从WrappedContentBase中继承得到):

  1. ControlIdsToHideWhenNotVisible

    当使用非Chameleon控件时ControlIdsToHideWhenNotVisible很有用。如果当前控件的DisplayConditions导致此控件不会输出,ControlIdsToHideWhenNotVisible属性所指向的控件也不会输出(Visible=false)。这个属性的值是以逗号间隔的控件ID的列表。

  2. ContainerId

    ContainerId只是简单地指定输出的内容包装标签的客户ID。ASP.net不(像对待常规的ID/ClientId那样)担保这个ID在整个输出页面的唯一性,所以你只应该把它用于层叠样式表。

    注意只有当ContainerId,CssClass,Tag,和/或Attributes被设置时内容包装标签才会输出。

  3. CssClass

    CssClass用于指定应用到内容包装标签的CSS类的名称。

    注意只有当ContainerId,CssClass,Tag,和/或Attributes被设置时内容包装标签才会输出。

  4. Tag

    Tag是内容包装标签的标签名。Tag的类型是WrappedContentTag,后者代表了常用的标签名。

    注意只有当ContainerId,CssClass,Tag,和/或Attributes被设置时内容包装标签才会输出。

  5. DisplayConditions

    DisplayConditions是内置属性(译注:指不是作为XML元素的属性,而是作为一个子元素出现),标识了控件在哪些情况下才应该输出,它的类型是Conditions。如果定义了这个属性,只有当DisplayConditons被解析为真时控件才会输出。

    我会在一篇文章里单独介绍条件控件。

  6. LeaderTemplate

    LeaderTemplate是一个内置属性,它能够包含标签和控件。这些标签和控件会在内容包装标签内部,当前控件内容之前输出。LeaderTemplate是数据绑定的,支持输出DataSource的属性。

    例如,LeaderTemplate可以在上面的UserData控件的示例中这样使用:

    <LeaderTemplate>
       
    <%# Eval("DisplayName") %>
    </LeaderTemplate>

    这将会计算出用户的呢称(并输出)。

  7. TrailerTemplate

  8. DataSource

    对ASP.net用户来说它的作用不言而喻。如果没有手工编程改写的话,DataSource将会隐式地定义和绑定。

  9. Attributes

    Chameleon控件实现了IAttributeAccessor接口,把任何不认识的属性作为内容包装标签的属性进行输出。在上面的例子中, “unrecognized”作为属性被传递给内容包装标签(H2),正是因为这样的属性支持——“unrecognized”并不是Chameleon 控件定义的属性。

    注意只有当ContainerId,CssClass,Tag,和/或Attributes被设置时内容包装标签才会输出。

在上面的UserData控件示例中,我也使用了属性“Property”和“LinkTo”。这些属性对与API相关的控件(继承自 ObjectDataBase)是很常用的。API相关的控件以它们基于的底层类型(如User,Post,等等)而命名,因此有这些控件:

  • UserData(<CSControl:UserData />)
  • PostData(<CSControl:PostData />)
  • SectionData(<CSControl:SectionData />)
  • GroupData(<CSControl:GroupData />)
  • 等等...

以及,与特定应用相关的控件诸如:

  • WeblogData(<CSBlog:WeblogData />)
  • WeblogPostData(<CSBlog:WeblogPostData />)
  • ForumData(<CSForum:ForumData />)
  • ForumPostData(<CSForum:FroumPostData />)
  • 等等...

当Community Server 2007发布后,我们会有每个控件的文档,但是,因为他们直接对应到Community Server的API——如果您对API有一定的了解的话,你应该已经知道了这些控件的名称和大概的选项是什么。

每个API相关的控件都会根据自己所处的上下文,自动获取它代表的API对象,用作DataSource——UserData控件根据自己的上下文自动加载相应的用户对象。如果API对象在上下文中无法获取,控件将不会产生输出。

我会在稍后的列表控件文章里对隐式数据绑定进行更多的介绍,我猜在问与答里应该也会。

API相关控件添加了对下列属性的支持:

  1. Property

    Property是想要输出的DataSource实例的属性名。对于这个属性,不同的数据类型有不同的默认值,并且日期会自动转换到用户的当地时间。如果设置了Property的值,但DataSource并不包含指定的属性,将会引发一个异常。如果指定的属性为null或未设置,控件将不会输出。

  2. ExtendedAttribute

    如果Property未定义,控件将会通过ExtendedAttribute来决定要输出的内容。如果DataSource继承了ExtendedAttributes类,控件将会获取扩展的属性值作为内容进行显示。

  3. FormatString

    FormatString用于对Property属性指定的值进行格式化。它支持任何适合Property类型的.net格式字符串。

  4. ResourceName,ResourceFile

    ResourceName/ResourceFile指定一个语言资源作为控件的内容进行输出。如果同时指定了Property或 ExtendedAttribute,格式化后的Property或ExtendedAttribute值会作为格式化参数传递给由 ResourceName/ResourceFile指定的资源。

  5. Text

    Text指定了作为ObjectDataBase控件的内容进行输出的文本。如果同时指定了Property或ExtendedAttribute,格式化后的Property或ExtendedAttribute的值会作为格式化参数传递给Text指定的文本。

    注意如果同时指定了Text和ResourceName,Text属性会被忽略。

  6. TruncateAt

    如果指定了TruncateAt,控件的最终内容将会在给定的长度进行截断。如果内容包含HTML,在截断之前会移除HTML标签。

  7. TruncationEllipsisText/TruncationEllipsisResourceName/TruncationEllipsisResourceFile

    当内容被截断时,TruncationEllipsisText的值,或 TruncationEllipsisResourceName/TruncationEllipsisResourceFile指定的语言资源会追加到截断后的内容上(如果同时提供了两者,TruncationEllipsisResourceName会覆盖Text属性)。 TruncationEllipsisText的默认值是“...”。

  8. IncludeTimeInDate

    如果Property的值是DateTime,设置IncludeTimeInDate为true会输出日期时也输出时间。此属性的默认值是false。

  9. ContentTemplate

    ContentTemplate是一个内置的属性,可以包含标签和控件。这些标签和控件会作为当前控件的内容而输出。设置ContentTemplate 会覆盖Property,FormatString,ResourceName,ResourceFile,Text,TruncateAt,以及 IncludeTimeInDate属性。ContentTemplate支持数据绑定,可以输出DataSource的属性值。

    如果你想要对某个属性或API相关对象执行一些编程功能时,ContentTemplate会很有用。例如:

    <CSControl:UserData runat="server">
       
    <ContentTemplate>
          
    <%# Eval("DisplayName").ToString().ToLower().Substring(1,1) %>
       
    </ContentTemplate>
    </CSControl:UserData>

    将会以小写形式输出用户的呢称的第二个字符。

另外,API相关控件通过以下属性暴露了底层对象(帖子,节,用户等等)的所有相关链接:

  1. LinkTo

    LinkTo可以设置为想要把控件内容链接到的位置的名称。每个API相关控件都暴露了一个枚举,里面定义了可选的相关链接(对于LinkTo属性来说智能补全功能很不错)。

    注意LinkTo只链接控件内容,而不是控件的包装标签,或首部/尾部模板。它会链接ContentTemplate定义的内容,如同链接Property定义的内容一样。

  2. LinkQueryStringModification

    如果定义了这个属性,它的值会被解释为查询字符串,相应的名称/值会用来改写或添加到链接的URL上。例如,如果LinkTo的URL在正常情况下是

    this.aspx?value1=1&value2=2

    并且LinkQueryStringModification被设置成

    value1=5&value3=3

    结果链接URL将会是

    this.aspx?value1=5&value2=2&value3=3

  3. LinkTargetLocationModification

    定义时,它的值会解释为一个目标位置(#targetLocation),改写或添加到链接的URL上。例如,如果LinkTo的URL在正常情况下是

    this.aspx?value1=1&value2=2#target

    并且LinkTargetLocationModification被设置为

    newtarget

    结果链接URL将会是

    this.aspx?value1=1&value2=2#newtarget

  4. LinkCssClass

    应用到链接的CSS类(标签的class属性)

  5. LinkRel

    被链接到的文档与当前文档的关系(译注:标签的rel属性)

  6. LinkTarget

    链接的目标窗口(标签的target属性)

  7. LinkTitleText/LinkTitleResourceName/LinkTitleResourceFile

    应用到链接的标题(title)。如果同时定义了两者,LinkTitleResourceName将会覆盖LinkTitleText。

    当链接内容被截断(通过TruncateAt属性)时,默认的链接标题是内容的全部文本。


对这些属性的了解提供了关于所有单值/单对象控件的知识,它们都以同样的方式工作(大部分情况下都由它们的基类实现)。

我认为现在提供一个完整的Chameleon页面会很有帮助。我上传了默认的博客主页(postlist.aspx,查看文章底部来获取这个文件)。我建议你审阅这个简单的Chameleon页面,看看单值控件是怎么使用的——单值控件应该很容易认出来,因为它们通常都叫somethingDATA。

如果你有任何关于Chameleon的问题,请通过我的联系表单或添加评论发送给我。我会在这一系列的最后一篇文章里回答它们。

这个系列的下一篇文章里,我会讨论Chameloen列表控件

posted on 2007-05-01 04:31  deerchao  阅读(1307)  评论(2编辑  收藏  举报