如何:在自定义列表视图中实现资源
上次修改时间: 2010年10月15日
适用范围: SharePoint Foundation 2010
此编程任务演示如何为标准 Microsoft SharePoint Foundation 列表创建自定义视图。在下面的示例中,将创建两种自定义资源:一种资源指定用于介绍页脚节所提供的自定义链接的文本,另一种资源用于修改在列表不包含任何项目时显示的文本。XSLT 模板将替代默认 FreeForm 模板来定义包含指向网站集中其他位置的链接的特殊页脚节。该模板还会替代 ViewEmpty 模板,以修改为空列表呈现的文本。
本编程任务演示了用于创建自定义视图并实现该视图中的资源的以下步骤:
在 Microsoft Visual Studio 2010 中创建自定义列表定义。
向项目中添加一个 XSLT 文件,并更改 Schema.xml 中的 XslLink 值,使其引用您的 XSLT 文件。
向项目中添加用于定义资源字符串的资源文件。
向列表的 Schema.xml 文件中添加参数绑定,并向 XSLT 文件中添加声明以使用这些参数。
有关演示如何在列表视图中自定义字段呈现方式的编程任务,请参阅如何:自定义列表视图中字段的呈现方式。
创建自定义列表定义
在 Visual Studio 2010 中的"文件"菜单上,指向"新建",然后单击"项目"。
在"新建项目"对话框中的"已安装的模板"下,展开"Visual Basic"节点或"Visual C#"节点。
展开"SharePoint"节点,并选择"2010"。
在"项目类型"下,选择"列表定义"。
键入列表定义项目的名称,然后单击"确定"。
在"SharePoint 自定义向导"中,指定用于调试的网站。对于解决方案的信任级别,请选择"部署为场解决方案",然后单击"下一步"。
在"选择列表定义设置"对话框中,指定列表定义的显示名称,选择要用于定义的基本列表类型,然后单击"完成"。您指定的显示名称是将在"创建"页中显示的名称。
添加和引用 XSLT 文件
在"解决方案资源管理器"中,右键单击项目,指向"添加",然后单击"SharePoint 映射文件夹"。
在"添加 SharePoint 映射文件夹"对话框中,选择"{SharePointRoot}\TEMPLATE\LAYOUTS\XSL"文件夹,然后单击"确定"。
在"解决方案资源管理器"中,右键单击新"XSL"文件夹,指向"添加",然后单击"新建项目"。
在"添加新项目"对话框中,展开用于 C# 的"Visual C#"节点或用于 Visual Basic 的"常用项目"节点。
选择"数据",然后选择"XSLT 文件"。指定文件的名称,然后单击"添加"。
在"解决方案资源管理器"中,双击"Schema.xml"文件,以在"代码编辑器"中打开该文件。
在 Schema.xml 文件中查找"所有项目"或"所有文档"视图定义。通过视图元素中的 DefaultView 属性(设置为 TRUE)可以标识此定义。
默认情况下,视图中的 XslLink 元素将 main.xsl 指定为 XSLT 文件。将此值更改为您为在步骤 5 中添加的 XSLT 文件指定的名称。
为自定义视图添加资源
在"解决方案资源管理器"中,右键单击项目,指向"添加",然后单击"SharePoint 映射文件夹"。
在"添加 SharePoint 映射文件夹"对话框中,选择"{SharePointRoot}\CONFIG\Resources"文件夹,然后单击"确定"。
在"解决方案资源管理器"中,右键单击新"Resources"文件夹,指向"添加",然后单击"新建项目"。
在"添加新项目"对话框中,展开"Visual C#"节点或"常用项目"节点,选择"常规",然后选择"资源文件"。输入文件的名称,然后单击"添加"。
在"资源编辑器"中,输入资源的"名称"和"值"。该值是在列表为空时显示的字符串。此示例指定"EmptyListResource"作为值"Please add information to this list ASAP!"的资源名称,"WikiResource"作为"For information about the contents of this list see the"的资源名称。
在 Schema.xml 文件中,向视图的 <ParameterBindings> 部分添加参数绑定,以便添加在上一步中指定的资源。
这些标记的格式如下所示:<ParameterBinding Name="EmptyListString" Location="Resource(Resource1,EmptyListResource)" /> 和 <ParameterBinding Name="TeamWiki" Location="Resource(Resource1,WikiResource)" />。在此示例中,"EmptyListString"和"TeamWiki"是可在 XSLT 文件中实现的参数名称,"Resource1"是不带扩展名的资源文件的名称,"EmptyListResource"和"WikiResource"是您在 .resx 文件中提供的资源名称。
在 XSLT 代码中实现资源
若要替代在 vwstyles.xsl 中定义的默认 FreeForm 和 EmptyTemplate 模板,请将 main.xsl 文件导入 XSLT 文件。
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" > <xsl:import href="/_layouts/xsl/main.xsl"/>
导入 main.xsl 时还会将 vwstyles.xsl 和 fldtypes.xsl 导入您的文件中,因为默认情况下,这两个文件都会导入 main.xsl 中。
由于您之前修改了 XslLink 元素值并在 Schema.xml 文件中添加了参数绑定,因此可在 XSLT 文件中使用您所定义的资源字符串。
按如下方式声明参数:
<xsl:param name="MyEmptyListString" /> <xsl:param name="TeamWiki" />
将 FreeForm 模板复制到 XSLT 文件中,并添加一个部分,以定义页脚节在"所有项目"视图中的特殊呈现方式,如下所示。
<xsl:template name="Freeform"> <xsl:param name="AddNewText"/> <xsl:param name="ID"/> <xsl:variable name="Url"> <xsl:choose> <xsl:when test="List/@TemplateType='119'"> <xsl:value-of select="$HttpVDir"/>/_layouts/CreateWebPage.aspx?List=<xsl:value-of select="$List"/>&RootFolder=<xsl:value-of select="$XmlDefinition/List/@RootFolder"/> </xsl:when> <xsl:when test="$IsDocLib"> <xsl:value-of select="$HttpVDir"/>/_layouts/Upload.aspx?List=<xsl:value-of select="$List"/>&RootFolder=<xsl:value-of select="$XmlDefinition/List/@RootFolder"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="$ENCODED_FORM_NEW"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:variable name="HeroStyle"> <xsl:choose> <xsl:when test="Toolbar[@Type='Standard']">display:none</xsl:when> <xsl:otherwise></xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="$ListRight_AddListItems = '1' and (not($InlineEdit) or $IsDocLib)"> <table id="Hero-{$WPQ}" width="100%" cellpadding="0" cellspacing="0" border="0" style="{$HeroStyle}"> <tr><td colspan="2" class="ms-partline"> <img src="/_layouts/images/blank.gif" width="1" height="1" alt="" /> </td></tr> <tr><td class="ms-addnew" style="padding-bottom: 3px"> <span style="height:10px;width:10px;position:relative;display:inline-block;overflow:hidden;" class="s4-clust"> <img src="/_layouts/images/fgimg.png" alt="" style="left:-0px !important;top:-128px !important;position:absolute;" /></span> <xsl:text disable-output-escaping="yes" ddwrt:nbsp-preserve="yes">&nbsp;</xsl:text> <xsl:choose> <xsl:when test="List/@TemplateType = '115'"> <a class="ms-addnew" id="{$ID}-{$WPQ}" href="{$Url}" onclick="javascript:NewItem2(event, "{$Url}");javascript:return false;" target="_self"> <xsl:value-of select="$AddNewText" /> </a> </xsl:when> <!—Define a special footer section for the custom list definition, which has 10000 as template type.--> <xsl:when test="$XmlDefinition/List/@TemplateType ='10000'"> <a class="ms-addnew" id="{$ID}-{$WPQ}" href="{$Url}" onclick="javascript:NewItem2(event, "{$Url}");javascript:return false;" target="_self"> <xsl:value-of select="$AddNewText" /> </a> <p> <xsl:value-of select="$TeamWiki"/> <a href="{$RootSiteUrl}/TeamWiki">Team Wiki</a>. </p> </xsl:when> <xsl:otherwise> <a class="ms-addnew" id="{$ID}" href="{$Url}" onclick="javascript:NewItem2(event, "{$Url}");javascript:return false;" target="_self"> <xsl:value-of select="$AddNewText" /></a> </xsl:otherwise> </xsl:choose> </td></tr> <tr><td><img src="/_layouts/images/blank.gif" width="1" height="5" alt="" /></td></tr></table> <xsl:choose> <xsl:when test="Toolbar[@Type='Standard']"> <script type='text/javascript'> if (typeof(heroButtonWebPart<xsl:value-of select="$WPQ"/>) != "undefined") { <xsl:value-of select="concat(' var eleHero = document.getElementById("Hero-', $WPQ, '");')"/> if (eleHero != null) eleHero.style.display = ""; } </script> </xsl:when> <xsl:otherwise></xsl:otherwise> </xsl:choose> <xsl:if test="List/@TemplateType = '115'"> <script type='text/javascript'> if (typeof(DefaultNewButtonWebPart<xsl:value-of select="$WPQ"/>) != "undefined") { <xsl:value-of select="concat(' var eleLink = document.getElementById("', $ID, '-', $WPQ, '");')"/> if (eleLink != null) { DefaultNewButtonWebPart<xsl:value-of select="$WPQ"/>(eleLink); } } </script> </xsl:if> </xsl:if> </xsl:template>
本示例使用 XmlDefinition 参数检索列表定义的 TemplateType(为 10000),从而对视图的页脚节应用特殊呈现方式。此外,本示例还使用"TeamWiki"参数返回"WikiResource"字符串,使用全局"RootSiteUrl"参数返回包含列表的父网站的网站集的根网站。本示例假定在根网站中存在一个名为"TeamWiki"的 Wiki 库。
向 XSLT 文件中添加以下代码,该代码将替代 EmptyTemplate 定义来修改显示的文本。
<xsl:template name="EmptyTemplate"> <tr> <td class="ms-vb" colspan="99" style="color:red;font-weight:bold"> <xsl:value-of select="$MyEmptyListString"/> </td> </tr> </xsl:template> </xsl:stylesheet>
在"生成"菜单上,单击"生成解决方案",然后单击"部署解决方案",以将自定义列表部署到 SharePoint Foundation 网站。
备注
部署项目时,Visual Studio 2010 会将您创建的资源文件放入您所指定的映射文件夹 (%ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\CONFIG\Resources) 中。创建新的 Web 应用程序时,SharePoint Foundation 会将 .resx 文件复制到为该 Web 应用程序创建的 \inetpub\...\App_GlobalResources 文件夹中,该文件必须位于此位置,资源才会生效。但是,要使文件在当您部署项目时已经存在的 Web 应用程序中生效,您必须手动将该文件复制到 Web 应用程序的 App_GlobalResources 文件夹中。