【问题标题】:How can I specify custom XSL for a List Definition developed in Visual Studio?如何为在 Visual Studio 中开发的列表定义指定自定义 XSL?
【发布时间】:2013-04-09 17:41:30
【问题描述】:

我正在尝试将 AllItems.aspx 页面上的超链接更改为指向我的名为 CustomUpload.aspx 的文档库的自定义上传页面。

假设我有两个文档库(列表)。一个名为 vsList,在 Visual Studio 中创建并部署为 SharePoint 解决方案的一部分,另一个名为 sdList,从浏览器创建。

这是我迄今为止能够成功完成的事情:

  1. 在基于 Web 的编辑器中编辑 sdList 的 AllItems.aspx 页面。通过将其工具栏类型设置为“摘要”来自定义包含“添加新项目”超链接的 XsltListViewWebPart。然后,使用 SharePoint Designer (SPD),我在设计器视图中单击“添加新项目”超链接,然后出现小右箭头并允许我编辑超链接选项(即,将值设置为我自己的自定义 URL)。李>
  2. 将上面的 XSL 代码复制并粘贴到 vsList 文档库的 AllItems.aspx 文件中,并确保 url 的路径正确,因为 SharePoint 永远找不到任何东西,因为“是”SharePoint 的映射目录和虚拟目录最糟糕的情况。

选项 #1 不是真正的解决方案,因为它仅适用于通过 SP 门户中基于 Web 的 GUI 编辑器直接创建的文档库。我需要在我在 VS 中创建的列表定义中定义所有这些。至于选项#2,问题几乎相同。如果我将自定义 XSL 复制并粘贴到 AllItems.aspx 页面中,那么每次我重新部署包含自定义列表定义的 VS 解决方案时,它将被覆盖。所以我真的需要一个解决方案,允许我在我的 VS 列表定义中定义自定义 URL。

以下是应该有效但无效的方法:

  1. 创建一个自定义 Xsl 文件,其中包含覆盖默认“添加新项目”链接所需的所有调整。使用站点操作 => 编辑页面 => 编辑 Web 部件 => 其他 => XSL 链接,在 sdList 文档库的 AllItems.aspx 页面中编辑 XsltListViewWebPart 的 XslLink 属性。
  2. 编辑列表定义的 Elements.xml 文件,方法是添加必要的模块和文件 XML 标记以指向将覆盖“添加新项目”URL 的自定义 XSL 文件。无论我做什么,当我添加标签时它都不会部署,因为它只是找不到自定义 XSL 文件。

我已经尝试将文件放在 100 个不同的位置,并且它一直在尝试在“Features[MY PROJECT NAME]_PrimaryFeature\CustomStyle.xsl”中查找它。它从哪里得到我将文件存储在该路径/位置的想法?即使我尝试将 XSL 文件存储在 SharePoint 映射的 LAYOUTS/XSL 目录或实际 SharePoint 网站的样式库文档库中,它仍然找不到它。这简直令人抓狂。路径、位置、目录结构和 XSL 已成为我尝试在 SharePoint 中完成任何事情的最大障碍。

请帮忙。

【问题讨论】:

    标签: sharepoint-2010 contenttype list-definition


    【解决方案1】:

    所以这就是我最终要做的......

    我在最初的尝试中基本上执行了上述第 1 步和第 2 步,并将整个站点模板导出到我工作站上的本地文件中。然后我在 Visual Studio 中创建了一个新的 SharePoint 项目/解决方案(以免弄乱我现有的项目),选择从现有网站模板导入数据并仅选择 sdList 导入我的新解决方案。

    导入过程完成后,我可以查看为 AllItem.aspx 生成的源代码(其中包含我使用 SPD 手动更新的 XSL 代码),然后将该代码复制到 Schema.xml我现有的 SharePoint 解决方案中的 vsList 文件。

    在 Schema.xml 文件的 View 部分中,我在 BaseViewID #1(即 AllItems.aspx 视图)的标记之后添加了标记,并将代码粘贴在那里。

    在理想情况下,我宁愿将所有 Xsl 代码转储到外部文件中,然后只使用标签,但我无法让它工作。由于某种原因,SharePoint 无法找到该文件。这是我对 SharePoint 的不满之一(如我原来的帖子中所述):文件夹映射和文件位置。不必要的混乱。

    对于那些感兴趣的人,这是自定义 Xsl 的外观。查找带有“CustomUpload.aspx”的行以及紧接在它之前和之后的行。不幸的是,我无法在此编辑器中加粗或突出显示代码部分,因此您必须自己进行一些调查。

        <Xsl>
              <![CDATA[
                  <xsl:stylesheet xmlns:x="http://www.w3.org/2001/XMLSchema" xmlns:d="http://schemas.microsoft.com/sharepoint/dsp" version="1.0" exclude-result-prefixes="xsl msxsl ddwrt" xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime" xmlns:asp="http://schemas.microsoft.com/ASPNET/20" xmlns:__designer="http://schemas.microsoft.com/WebParts/v2/DataView/designer" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:SharePoint="Microsoft.SharePoint.WebControls" xmlns:ddwrt2="urn:frontpage:internal" xmlns:o="urn:schemas-microsoft-com:office:office"> 
      <xsl:include href="/_layouts/xsl/main.xsl"/> 
      <xsl:include href="/_layouts/xsl/internal.xsl"/> 
                <xsl:param name="AllRows" select="/dsQueryResponse/Rows/Row[$EntityName = '' or (position() &gt;= $FirstRow and position() &lt;= $LastRow)]"/>
                <xsl:param name="dvt_apos">&apos;</xsl:param>
                <xsl:template name="Freeform" ddwrt:ghost="" xmlns:ddwrt2="urn:frontpage:internal">
                    <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"/>&amp;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"/>&amp;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">&amp;nbsp;</xsl:text>
                <xsl:choose>
                    <xsl:when test="List/@TemplateType = '115'">
                  <a class="ms-addnew" id="{$ID}-{$WPQ}"
                     href="{$Url}"
                     onclick="javascript:NewItem2(event, &quot;{$Url}&quot;);javascript:return false;"
                     target="_self">
                    <xsl:value-of select="$AddNewText" />
                  </a>
                </xsl:when>
                    <xsl:otherwise>
                           <xsl:variable name="CustomUrl">
                              ../../../_layouts/MyControls/CustomUpload.aspx?List=<xsl:value-of select="$List"/>
                           </xsl:variable>
                           <a href="{$CustomUrl}"><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"/>) != &quot;undefined&quot;)
                {
                    <xsl:value-of select="concat('  var eleHero = document.getElementById(&quot;Hero-', $WPQ, '&quot;);')"/>
                    if (eleHero != null)
                        eleHero.style.display = &quot;&quot;;
                }
              </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"/>) != &quot;undefined&quot;)
                {
                    <xsl:value-of select="concat('  var eleLink = document.getElementById(&quot;', $ID, '-', $WPQ, '&quot;);')"/>
                    if (eleLink != null)
                    {
                        DefaultNewButtonWebPart<xsl:value-of select="$WPQ"/>(eleLink);
                    }
                }
              </script>
          </xsl:if>
        </xsl:if>
      </xsl:template></xsl:stylesheet>
                  ]]>
            </Xsl>
    

    无论如何,我希望这对某人有所帮助。

    【讨论】:

    • 这对我有帮助,感谢您不厌其烦地发布解决方案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 2023-01-31
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多