如何为Visual Studio中开发的列表定义指定自定义XSL?

时间:2013-04-09 17:41:30

标签: sharepoint-2010 contenttype list-definition

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

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

这是我迄今为止成功完成的任务:

  1. 在基于Web的编辑器中编辑 sdList 的AllItems.aspx页面。通过将其工具栏类型设置为“摘要”来自定义包含“添加新项”超链接的XsltListViewWebPart。然后,使用SharePoint Designer(SPD),我在设计器视图中单击“添加新项目”超链接,并出现小右箭头,并允许我编辑超链接选项(即将值设置为我自己的自定义URL)。
  2. 将上面的XSL代码复制并粘贴到 vsList 文档库的AllItems.aspx文件中,并确保该网址的路径是正确的,因为SharePoint当然无法找到任何内容,因为“是”SharePoint的映射和虚拟目录的垃圾。
  3. 选项#1不是真正的解决方案,因为它仅适用于通过SP门户中基于Web的GUI编辑器直接创建的文档库。我需要在我在VS中创建的列表定义中定义所有这些。对于选项#2,问题几乎相同。如果我将自定义XSL复制并粘贴到AllItems.aspx页面,那么每次重新部署包含我的自定义列表定义的VS解决方案时,它都会被覆盖。所以我真的需要一个允许我在VS列表定义中定义自定义URL的解决方案。

    这是我们应该做的 - 但不是:

    1. 创建一个自定义Xsl文件,其中包含覆盖默认“添加新项目”链接所需的所有调整。使用Site Action =>编辑 sdList 文档库的AllItems.aspx页面中XsltListViewWebPart的XslLink属性。编辑页面=>编辑Web部件=>杂项=> XSL链接。
    2. 通过添加必要的Module和File XML标记来编辑列表定义的Elements.xml文件,以指向将覆盖“添加新项”URL的自定义XSL文件。无论我做什么,当我添加标签时它都不会部署,因为它无法找到自定义XSL文件。
    3. 我已经尝试将文件放在100个不同的地方,并且一直试图在“功能[我的项目名称] _PrimaryFeature \ CustomStyle.xsl”中查找它。它在哪里得到我将文件存储在该路径/位置的想法?即使我尝试将XSL文件存储在SharePoint映射的LAYOUTS / XSL目录中或实际SharePoint站点中的样式库文档库中,它仍然无法找到它。这真令人抓狂。路径,位置,目录结构和XSL已成为我尝试在SharePoint中完成任何事情的最大障碍。

      请帮忙。

1 个答案:

答案 0 :(得分: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>

无论如何,我希望这可以帮助别人。