自定义 SharePoint Team Services 中的 CAML 视图

Microsoft Corporation

2002 年 6 月

适用于:
Microsoft SharePoint Team Services

摘要:了解使用协作应用程序标记语言 (CAML) 中的 View 元素创建 Microsoft SharePoint Team Services 中列表数据的自定义视图。(20 页打印页)

本页内容

简介 简介
创建基本列表视图 创建基本列表视图
在脚本中使用视图 在脚本中使用视图
添加个性化消息 添加个性化消息
列出服务器上的所有子站点 列出服务器上的所有子站点
预填充输入框 预填充输入框
在视图中嵌入视图 在视图中嵌入视图
创建缩略图 创建缩略图

简介

协作应用程序标记语言 (CAML) 的 View 元素提供一个在 Microsoft SharePoint? Team Services 的数据库中执行查询和返回值的灵活方法。此元素适应对自定义 SharePoint Team Web 站点的广泛需求,从执行查询以便将数据返回到脚本进行处理,到布置页面 部分中列表数据的显示。

要点 您必须具有写页面权限,才能上载页面。您必须以本地 Administrators 组成员的身份登录到服务器计算机,才能写入数据库。

根据您的目的是返回并显示值,还是仅返回值以便在脚本中进行处理,Web 站点的 Default.htm 页或任何列表的 AllItems.htm 页上的列表视图典型方案包含下列子元素。

  • Query 如果您只希望在一个列表中返回所有值,则该子元素可以为空。

  • ViewBody 可以使用 ViewBody 子元素(带有或不带 ViewHeaderViewFooter 元素)来布置用于显示数据的视图表。

  • ViewEmpty ViewEmpty 子元素指定当查询未返回任何数据时所显示的内容。它还为执行替代视图提供了有用的制约性,以防查询中不返回任何项目。请参见下面的示例。

  • ViewFields 当视图不用于显示项目,只用于返回值进行处理时,ViewFields 子元素可以为空。

  • RowLimit RowLimit 子元素指定要在当前窗口中显示的项目数。

  • PagedRowsetRowLimit 元素包含的值超出时,PagedRowset 子元素将为下一个窗口定义一个视图。

  • Toolbar 在 AllItems.htm 页上,Toolbar 子元素定义紧靠列表视图之上的页中显示的按钮和部分行。

CAML HTML 元素与 CDATA 标记共同用来在视图中嵌入标记语言或脚本(例如 <HTML><![CDATA[<TABLE><TR><TH>]]></HTML>)。

要点 为了完成下述任务,您必须具有写页面权限才能上载页面。您必须以本地 Administrators 组成员的身份登录到计算机,才能写入数据库。

假设您具有 SharePoint Team Services 数据库的访问权,则可以通过从 Views 表的 View 列复制视图方案来学习和自定义视图。如果有许多视图,您可以通过要修改 ListView 组件的全局统一标识符 (GUID) 来标识相应的数据库记录。在其他情况下(例如在表单中),您可能需要引用 Lists 表(列表的列表)中 ID、Name 或 Title 列值的组合。然后,您可以使用其视图方案替换整个组件,并使用以下 CAML 包围已复制的视图:

<ows:XML>
  <SetList>[u_YourCustomListName[without "u_" for native lists]]</SetList>
  <View>
    .
    .
    .
    [Copied view schema goes here]
    .
    .
    . 
  </View>
</ows:XML>

在 Microsoft FrontPage 中,您可以选择一个视图,右键单击此视图,然后单击 Layout Customization 以展开视图方案并进行自定义。

应始终保存原始站点页面的副本,以便可以在需要时复原组件。

创建基本列表视图

下例布置了用于显示自定义列表 (u_MyCustomList) 的视图表。ViewFields 元素指定要在视图页眉中显示的 Title、Stock 和 Price 字段名称以及视图正文中显示的这些字段的值。

<ows:XML>
  <SetList>[u_MyCustomList]</SetList>
  <View Name="MyNewView">

    <ViewFields>
      <FieldRef Name="Title"/>
      <FieldRef Name="Stock"/>
      <FieldRef Name="Price"/>
    </ViewFields>

ViewHeader 元素包含 FieldsField 元素,这些元素枚举了 ViewFields 元素所指定的字段名称。HTML 元素包含用于显示表格标题的标记语言,这取决于 Web 或子站点的 /_layouts/styles/ows.css 文件中定义的 ms-vh 样式。

    <ViewHeader>
      <HTML><![CDATA[<TABLE><TR class="ms-vh">]]></HTML>
      <Fields>
        <HTML><![CDATA[<TH>]]></HTML>
        <Field/>
        <HTML><![CDATA[</TH>]]></HTML>
      </Fields>
      <HTML><![CDATA[</TR>]]></HTML>
    </ViewHeader>

ViewBody 元素包含为列表中的每个项目枚举字段值的 FieldsField 元素。HTML 元素包含用于在表格单元格中显示这些值的标记语言,这取决于 Web 或子站点的 /_layouts/styles/ows.css 文件中定义的 ms-vb 样式。

    <ViewBody>
      <HTML><![CDATA[<TR class="ms-vb">]]></HTML>
        <Fields>
          <HTML><![CDATA[<TD>]]></HTML>
          <Field/>
          <HTML><![CDATA[</TD>]]></HTML>
        </Fields>
      <HTML><![CDATA[</TR>]]></HTML>
    </ViewBody>

    <ViewFooter>
      <HTML><![CDATA[</TABLE>]]></HTML>
    </ViewFooter>

Query 部分查询股票小于 15 或价格大于 20.00 的情况。

    <Query>
      <Where>
        <Or>
          <Lt>
            <FieldRef Name="Stock"/>
            <Value Type="Number">
              15
            </Value>
          </Lt>
          <Gt>
            <FieldRef Name="Price"/>
            <Value Type="Currency">
              20.00
            </Value>
          </Gt>
        </Or>
      </Where>
      <OrderBy>
        <FieldRef Name="Title"/>
      </OrderBy>
    </Query>
  </View>
</ows:XML>

为了返回指定字段的所有值,您可以转而使用空的 Query 元素 ()。

在脚本中使用视图

下例说明了如何使用 CAML 视图返回项目 ID 并将它们指定给数组,以便在脚本中进行处理。此视图返回事件日期晚于 1/1/2002 的以逗号分隔的项目 ID 列表。这些项目 ID 被指定给 strIDs 变量,然后逐一显示在消息框中。

<Script language="JavaScript">
function getIDs()
{
   var arrIDs = new Array();
   var strIDs="<ows:XML>
             <SetList>Events</SetList>
             <View>
               <ViewFields>
                 <FieldRef Name="ID"/>
               </ViewFields>
               <ViewBody>
                 <Fields>
                   <Field/>
                   <HTML><![CDATA[,]]></HTML>
                 </Fields>
               </ViewBody>
               <Query>
                 <Where>
                     <Gt>
                       <FieldRef Name="EventDate"/>
                       <Value Type="DateTime">2002-01-01T00:00:00Z</Value>
                     </Gt>
                 </Where>
               </Query>
             </View>
           </ows:XML>";

   arrIDs=strIDs.split(/,/);
   alert(arrIDs);
}
</Script>

如果您要在 CAML 视图中动态插入用户输入的数据,而不只是像上例中那样对值进行硬编码,则需要从解释器掩盖 CAML,以防止立即处理该视图。有关详细信息,请参阅使用 XMLHTTP 在 SharePoint Team Services 中发布命令

添加个性化消息

为了获得当前用户的名称并显示个性化消息,以下代码示例针对 UserInfo 表执行查询,此表是数据库中的全局列表,该数据库包含虚拟服务器上所有小组 Web 站点的所有用户信息。

<ows:XML>
  <SetList>UserInfo</SetList>
  <View>
    <ViewFields>
      <FieldRef Name="Title"/>
    </ViewFields>
    <Query>
      <Where>
        <Eq>
          <FieldRef Name="ID"/>
          <Value Type="Integer"><UserID/></Value>
        </Eq>
      </Where>
    </Query>
    <ViewBody>
      <HTML>
        <![CDATA[<TABLE><TR><TD class="Greeting">Hello ]]>
      </HTML>
      <Field Name="Title"/>
      <HTML>
        <![CDATA[, welcome to the team Web site.</TD></TR></TABLE>]]>
      </HTML>
    </ViewBody>
  </View>
</ows:XML>

此示例查询当前用户的 ID 与 UserInfo 表中的 ID 相匹配的情况,并按 ViewFields 元素的指定显示对应的 Title 字段值(在此例中为用户名)。CDATA 部分布置用于对齐页面上个性化问候的简单表。请注意,为了设置格式,可将自定义样式定义添加到 ows.css 并在 HTML 及其元素中实现。

列出服务器上的所有子站点

下例显示如何通过创建数据库中 Projects 表的视图来创建返回服务器上所有子站点链接列表的视图:

<ows:XML>
  <SetList>Projects</SetList>
  <View Name="ProjectsView">
    <ViewFields>
      <FieldRef Name="Title"/>
      <FieldRef Name="HomePageID" Explicit="TRUE"/>
    </ViewFields>
    <ViewHeader>
    <HTML><![CDATA[<TABLE>]]></HTML>
    </ViewHeader>
    <ViewBody>
     <HTML><![CDATA[<TR><TD>]]></HTML>
       <HTML><![CDATA[<a target="_blank" href="]]></HTML>
       <LookupColumn Name="HomePageID"/>
       <HTML><![CDATA[">]]></HTML>
       <Field Name="Title"/>
       <HTML><![CDATA[</a></TD></TR>]]></HTML>
    </ViewBody>
    <ViewFooter>
    <HTML><![CDATA[</TABLE>]]></HTML>
    </ViewFooter>
  </View>
</ows:XML>

HomePageID 字段是 DocMd 表(该表存储服务器上的所有 URL)的查找字段。此处,HTML target 属性设置为 _blank,以便当用户单击子站点链接时,该子站点会显示在新窗口中。

预填充输入框

要使用当前用户的名称和电子邮件地址来预填充表单,您可以创建一个返回此用户名的视图,然后将其指定给一个变量。使用 GetEmailFromUser 元素返回当前用户的电子邮件地址。

首先,添加一个 CAML 岛,它将此视图定义给包含该表单的页面(为了适应 MSDN Web 布局的需要,此代码示例已经“被截断”):

<ows:XML>
  <SetList>UserInfo</SetList>
  <View>
    <ViewFields>
      <FieldRef Name="Name"/>
    </ViewFields>
      <Query>
        <Where>
          <Eq>
            <FieldRef Name="ID"/>
            <Value Type="Integer"><UserID/></Value>
          </Eq>
        </Where>
      </Query>
      <ViewBody>
          <SetVar Name="UName" Scope="Request"><Field 
Name="Name"/></SetVar>
      </ViewBody>
    </View>
</ows:XML>

请注意,此视图只用于返回当前用户的名称,此名称已指定给自定义 CAML 变量 UName。然后,您可以添加两个输入框,将适当的 CAML 指定给它们的 value 属性:

<input type="text" name="username" size="38" value="<ows:GetVar Name="UName"/>">

<input type="text" name="user_email" size="38" value="<ows:GetEmailFromUser HTMLEncode="TRUE"><UserID/></ows:GetEmailFromUser>">

在视图中嵌入视图

视图可以嵌入到其他视图中,以便从 SharePoint Team Services 数据库中的多个表返回值。在下例中,将两个视图嵌入到主页上的另一个框架视图中,以便根据当前用户是否有过期任务来显示不同的消息。

此示例包含 Tasks 列表的两个视图,一个用于在当前用户有过期任务的情况下返回具有特定格式的消息,另一个用于返回过期项目的视图。

<ows:XML>
  <SetList>Tasks</SetList>
  <View>
    <ViewFields>
      <FieldRef Name="AssignedTo"/>
    </ViewFields>
    <Query>
      <Where>
        <And>
          <Eq>
            <FieldRef Name="AssignedTo"/>
            <Value Type="Integer">
              <UserID/>
            </Value>
          </Eq>
          <And>
            <Lt>
              <FieldRef Name="DueDate"/>
              <Value Type="DateTime">
                <Today/>
              </Value>
            </Lt>
            <Neq>
              <FieldRef Name="Status"/>
              <Value Type="Choice">Completed</Value>
            </Neq>
          </And>
        </And>
      </Where>
    </Query>
    <ViewBody>
      <HTML><![CDATA[<TABLE><TR><TD class="Warning">Hello ]]></HTML>
      <LookupColumn Name="AssignedTo" HTMLEncode="TRUE"/>
      <HTML><![CDATA[, these items are now past due!</TD></TR>
      <TR><TD>
        <A href="mailto:Manager_Name@example.com" class="ResolveNow">
          Please contact your manager</A>
      </TD></TR>
      <TR><TD>]]></HTML>

此框架视图可针对当前用户的 ID 等于 AssignedTo 字段值的情况以及截止日期在今天之前且状态不等于 Completed 的情况,查询数据库中的 Tasks 表。LookupColumn 元素用于将用户名称作为对用户的个性化警告的一部分返回。

在代码中的此处,可以插入 Tasks 列表的其他视图,以返回并显示过期项目。

     <SetList>Tasks</SetList>
      <View>
        <ViewFields>
          <FieldRef Name="LinkTitle"/>
          <FieldRef Name="Priority"/>
          <FieldRef Name="Body"/>
          <FieldRef Name="DueDate"/>
        </ViewFields>
        <Query>
          <Where>
            <And>
              <And>
                <Lt>
                  <FieldRef Name="DueDate"/>
                  <Value Type="DateTime">
                    <Today/>
                  </Value>
                </Lt>
                <Neq>
                  <FieldRef Name="Status"/>
                  <Value Type="Choice">Completed</Value>
                </Neq>
              </And>
              <Eq>
                <FieldRef Name="AssignedTo"/>
                <Value Type="Integer">
                  <UserID/>
                </Value>
              </Eq>
            </And>
          </Where>
        </Query>
        <ViewHeader>
          <HTML><![CDATA[<TABLE><TR>]]></HTML>
          <Fields>
            <HTML><![CDATA[<TH class="ms-vh">]]></HTML>
            <Field/>
            <HTML><![CDATA[</TH>]]></HTML>
          </Fields>
          <HTML><![CDATA[</TR>]]></HTML>
        </ViewHeader>
        <ViewBody>
          <HTML><![CDATA[<TR>]]></HTML>
          <Fields>
            <HTML><![CDATA[<TD class="ms-vb">]]></HTML>
            <Field/>
            <HTML><![CDATA[</TD>]]></HTML>
          </Fields>
          <HTML><![CDATA[</TR>]]></HTML>
        </ViewBody>
        <ViewFooter>
          <HTML><![CDATA[</TABLE>]]></HTML>
        </ViewFooter>
      </View>
      <HTML><![CDATA[</TD></TR></TABLE>]]></HTML>
    </ViewBody>

这在当前用户具有过期任务的情况下,完成了外部框架视图的 ViewBody 部分。ViewEmpty 部分可用于包含另一个视图,此视图可将另一则消息传送给没有过期任务的当前用户。

<ViewEmpty>
      <SetList>UserInfo</SetList>
      <View>
        <ViewFields>
          <FieldRef Name="Title"/>
        </ViewFields>
        <Query>
          <Where>
            <Eq>
              <FieldRef Name="ID"/>
              <Value Type="Integer"><UserID/></Value>
            </Eq>
          </Where>
        </Query>
        <ViewBody>
          <HTML>
            <![CDATA[<TABLE><TR><TD class="NoOverdues">Hello ]]>
          </HTML>
          <Field Name="Title"/>
          <HTML><![CDATA[, you have no past due items. Great work!</TD></TR></TABLE>]]></HTML>
        </ViewBody>
      </View>
    </ViewEmpty>
  </View>
</ows:XML>

通过将定义添加到 /_layouts/styles/ows.css(如下所示),可以为上述属性定义样式:

.Warning  {
 font-size: 14pt;
 color: red;
 font-weight: bold;
 font-family: verdana;
 }
.ResolveNow  {
 font-size: 12pt;
 color: red;
 text-decoration: underline;
 font-family: verdana;
 padding: 12px;
 font-weight: bold;
 }
.NoOverdues  {
 font-size: 12pt;
 color: green;
 font-family: verdana;
 padding: 12px;
 font-weight: bold;
 }

下例在框架视图的 ViewEmpty 部分中嵌入一个视图,以便将另一消息显示给访问主页的当前用户(这取决于他们是否接受了名为 TeamSurvey 的调查)。如果他们已经接受了调查,则 ViewBody 部分将显示个性化的欢迎消息。如果未接受调查,则 ViewEmpty 部分将显示一则警告,并提供此调查的链接(为了适应 MSDN Web 布局的需要,此代码示例已经“被截断”):

<ows:XML>
  <SetList>u_TeamSurvey</SetList>
  <View>
    <ViewFields>
      <FieldRef Name="Author"/>
    </ViewFields>
    <Query>
      <Where>
        <Eq>
          <FieldRef Name="Author"/>
          <Value Type="Integer"><UserID/></Value>
        </Eq>
      </Where>
    </Query>
    <ViewBody>
      <HTML><![CDATA[<TABLE><TR><TD class="DidSurvey">Hello ]]></HTML>
      <LookupColumn Name="Author" HTMLEncode="TRUE"/>
      <HTML><![CDATA[, thanks for taking the 
survey!</TD></TR></TABLE>]]></HTML>
    </ViewBody>
    <ViewEmpty>
      <SetList>UserInfo</SetList>
        <View>
          <ViewFields>
            <FieldRef Name="Title"/>
          </ViewFields>
          <Query>
            <Where>
              <Eq>
                <FieldRef Name="ID"/>
                <Value Type="Integer"><UserID/></Value>
              </Eq>
            </Where>
          </Query>
          <ViewBody>
            <HTML>
              <![CDATA[<TABLE><TR><TD class="Warning">Hello ]]>
            </HTML>
            <Field Name="Title"/>
           <HTML>
             <![CDATA[, you have not yet taken the survey!
               </TD></TR><TR><TD class="TakeNow">
               <A href="http://[server_name]/[subweb_name]/Lists/
                 TeamSurvey/overview.htm">
                 Please take the survey immediately!</A>
               </TD></TR></TABLE>]]></HTML>
          </ViewBody>
        </View>
    </ViewEmpty>
  </View>
</ows:XML>

您还可以将适当的样式定义添加到 ows.css 中。

.TakeNow  {
 font-size: 12pt;
 color: red;
 text-decoration: underline;
 font-family: verdana;
 padding: 12px;
 font-weight: bold;
 }
.DidSurvey  {
 font-size: 12pt;
 color: green;
 font-family: verdana;
 padding: 12px;
 font-weight: bold;
 }

可以采取的更极端方法是让 ViewBody 部分作为空元素,并只使用 ViewEmpty 部分将用户重定向到此调查,而不让他们看到主页,如下所示:

<ows:XML>
  <SetList>u_TeamSurvey</SetList>
    <View>
      <ViewFields/>
      <Query>
        <Where>
          <Eq>
            <FieldRef Name="Author"/>
            <Value Type="Integer"><UserID/></Value>
          </Eq>
        </Where>
      </Query>
      <ViewBody/>
      <ViewEmpty>
        <SetList>UserInfo</SetList>
          <View>
            <ViewFields/>
            <Query>
              <Where>
                <Eq>
                  <FieldRef Name="ID"/>
                  <Value Type="Integer"><UserID/></Value>
                </Eq>
              </Where>
            </Query>
          <ViewBody>
            <HTML><![CDATA[<Script>window.parent.location =  
              "http://[server_name]/[subweb_name]
              /Lists/TeamSurvey/overview.htm";</Script>]]></HTML>
          </ViewBody>
          </View>
      </ViewEmpty>
    </View>
</ows:XML>

此处,ViewBody 部分只包含将调查的 URL 指定到 window.parent.location 的脚本块。

创建缩略图

您可以通过在 CAML 中嵌入 HTML 来创建包含图像的文档库的缩略图。下例假设存在一个名为 Image Gallery 的库,除了内置的 FileRef 和 Title 字段外,它还包含一个 Artist 字段。

<ows:xml>
  <SetList>u_ImageGallery</SetList>
  <HTML><![CDATA[<TABLE>]]></HTML>
  <View Name="Image Gallery">
    <ViewFields>
      <FieldRef Name="FileRef"/>
      <FieldRef Name="Title"/>
      <FieldRef Name="Artist"/>
    </ViewFields>
    <ViewBody>
      <HTML><![CDATA[<tr><td>]]></HTML>
      <HTML><![CDATA[<a href="]]></HTML>
      <HttpHost URLEncodeAsURL="TRUE"/>
      <LookupColumn Name="FileRef"/>
      <HTML><![CDATA["><img src="]]></HTML>
      <HttpHost URLEncodeAsURL="TRUE"/>
      <LookupColumn Name="FileRef"/>
      <HTML><![CDATA[" width=50 height=50></a></td><td>]]></HTML>
      <Field Name="Title"/>
      <HTML><![CDATA[</td><td>]]></HTML>
      <Field Name="Artist"/>
      <HTML><![CDATA[</td></tr>]]></HTML>
    </ViewBody>
  </View>
  <HTML><![CDATA[</TABLE>]]></HTML>
</ows:xml>

为图像文件的链接提供 URL 的 href 属性值是使用 CAML HttpHostLookupColumn 元素构造的。LookupColumn 元素用于为列表的 FileRef 字段(即 DocMd 表中包含的图像文件 URL,它存储了服务器上所有站点的所有文档 URL)返回查找值。此视图中还显示了 Title 字段和 Artist 字段。

同一视图还可以与矢量标记语言 (VML) 集成来创建缩略图。您可以使用 CDATA 部分来构造 VML rectimagedata 元素,以便两者均可以将图像显示为缩略图并提供图像文件的链接。

<ows:XML>
  <SetList Scope="Request">u_ArtDocs</SetList>
  <View Name="ThumbNailView">    
    <ViewFields>
      <FieldRef Name="FileRef"/>
      <FieldRef Name="Title"/>
      <FieldRef Name="Artist"/>
    </ViewFields>
    <ViewHeader>
      <HTML><![CDATA[<TABLE><TR><TD>]]></HTML>
    </ViewHeader>
    <ViewBody>
      <HTML><![CDATA[<TABLE  cellpadding=20><TR><TD>]]></HTML>
      <HTML><![CDATA[<v:rect href="]]></HTML>
      <HttpHost URLEncodeAsURL="TRUE"/>
      <LookupColumn Name="FileRef"/>
      <HTML><![CDATA[" style="HEIGHT: 50px; LEFT: 10px; 
         POSITION:relative; TOP:10px; WIDTH: 50px">
         <v:imagedata src="]]></HTML>
      <HttpHost URLEncodeAsURL="TRUE"/>
      <LookupColumn Name="FileRef"/>
      <HTML><![CDATA["/></v:rect>]]></HTML>
      <HTML><![CDATA[</TD><TD class=ms-vb><BR>]]></HTML>
      <Field Name="Title"/>
      <HTML><![CDATA[<BR>]]></HTML>
      <Field Name="Artist"/>
      <HTML><![CDATA[</TD></TR></TABLE>]]></HTML>
    </ViewBody>
    <ViewFooter>
      <HTML><![CDATA[</TD></TR></TABLE>]]></HTML>
    </ViewFooter>
    <Query/>
  </View>
</ows:XML>

rect 元素的 href 值(它为图像文件的链接提供 URL)是使用 CAML HttpHostLookupColumn 元素构造的。

页面中需要包括下面的处理说明,以便 VML 正常工作。

其他阅读材料

有关 VML 的详细信息,请参阅 MSDN VML Reference

有关 CAML 的详细信息,请参阅 SharePoint Team Services SDK 中的 CAML 参考。

转到原英文页面