我正在运行 umbraco v 4.0.3。我的网络服务器是 Windows Server 2003。
我注意到除了它托管的控件之外,我的一个页面还显示了来自父节点的内容。由于该页面仅用作 ascx 控件的宿主,因此它没有自己的内容。
节点的内容区域是空的,所以我不知道这些内容的来源。
我已经做了以下事情来试图解决这个问题,但没有一个会导致有问题的页面发生变化。页面仍然存在。
- 我再次发布了节点。
- 我点击了取消发布按钮,然后发布了节点。
- 我已经清除了我的浏览器缓存。
- 我用过多个浏览器。
- 我在 Chrome 上使用了隐身模式。
- 我已经更改了节点所基于的模板,这应该阻止宏运行,但它没有。
- 我已将内容添加到节点。新内容没有出现。
- 我已经更改了节点的名称。当我以旧名称重新加载页面时,它仍然存在。
- 我已经触及 web.config 以重新启动应用程序。没有变化。
- 我已经停止并启动了该网站。
- 我已经右键单击站点的顶部节点,然后选择“重新发布”
- 我已经手动删除了 data 文件夹下的 umbraco.conf 文件。
- 我什至删除了节点。
当我导航到页面时,我所做的任何事情都不会改变出现的内容。此时,我应该得到一个 404,但页面仍然加载并且仍然运行宏。
在这一点上,我不知所措,但我猜这与 IIS 或 Dot.Net 和缓存有关。
有人知道如何解决这个问题吗?
编辑
我发现,如果我从构建已删除页面的模板中删除了 XSLT 宏引用,则在浏览器中加载已删除页面时,父页面的副本就会消失。由于这是我的主要问题,我重新创建了页面并继续。我仍然对为什么我删除的页面能够从多个浏览器加载感到困惑。
我删除的宏在我们网站的 1,500 多个页面中的大多数中使用,并且在它们中都没有在子页面上复制父文档,在我看来,XSLT 宏也不可能到达XML 缓存。我查看了代码,没有看到任何对其他数据存储的引用。我承认 XSLT 对我来说很新。
下面列出了我删除其引用的宏的代码。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:Stylesheet [ <!ENTITY nbsp " "> ]>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxml="urn:schemas-microsoft-com:xslt"
xmlns:umbraco.library="urn:umbraco.library"
xmlns:custom="urn:custom.library"
exclude-result-prefixes="msxml umbraco.library custom">
<xsl:output method="xml" omit-xml-declaration="yes"/>
<msxml:script language="C#" implements-prefix="custom">
public System.Xml.XPath.XPathNodeIterator SplitMultiPageText(string unsplitText,
string pageDelimeter) {
System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument();
string[] splitPages = System.Text.RegularExpressions.Regex.Split(unsplitText, pageDelimeter);
System.Xml.XmlElement pagesElement = xmlDoc.CreateElement("pages");
foreach (string page in splitPages) {
System.Xml.XmlElement pageElement = xmlDoc.CreateElement("page");
pageElement.AppendChild(xmlDoc.CreateCDataSection(page));
pagesElement.AppendChild(pageElement);
}
return pagesElement.CreateNavigator().Select(".");
}
</msxml:script>
<xsl:param name="currentPage"/>
<xsl:variable name="content" select="/macro/content" />
<xsl:variable name="pageNumber" select="/macro/pageNumber" />
<xsl:variable name="joinContent">
<xsl:choose>
<xsl:when test="/macro/joinContent = ''">
<xsl:value-of select="boolean(false)" />
</xsl:when>
<xsl:otherwise><xsl:value-of select="/macro/joinContent" /></xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="splitExpr"><hr class="pagebreak" /></xsl:variable>
<xsl:template match="/">
<xsl:variable name="pages" select="custom:SplitMultiPageText($content, $splitExpr)" />
<xsl:variable name="pageCount" select="count($pages/page)" />
<xsl:choose>
<xsl:when test="$pageCount = 1 or string($joinContent) = 'true'">
<xsl:for-each select="$pages/page">
<xsl:value-of
select="umbraco.library:RenderMacroContent(., $currentPage/@id)"
disable-output-escaping="yes" />
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<p class="multiPageNotice">This document is split among multiple pages. To view
the other pages, use the <strong>page selector</strong> near the bottom of the screen.</p>
<xsl:for-each select="$pages/page">
<xsl:if test="position() = $pageNumber or ( $pageNumber = '' and position() = 1 )">
<xsl:value-of
select="umbraco.library:RenderMacroContent(., $currentPage/@id)"
disable-output-escaping="yes" />
</xsl:if>
</xsl:for-each>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="$pageCount > 1 and string($joinContent) != 'true'">
<div class="pageSelector">
<p>Page: </p>
<ul>
<xsl:for-each select="$pages/page">
<li>
<xsl:choose>
<xsl:when test="position() = $pageNumber or ( $pageNumber = '' and position() = 1 )">
<xsl:value-of select="position()" />
</xsl:when>
<xsl:otherwise>
<a href="{umbraco.library:NiceUrl($currentPage/@id)}/page/{position()}">
<xsl:value-of select="position()" />
</a>
</xsl:otherwise>
</xsl:choose>
</li>
</xsl:for-each>
</ul>
</div>
</xsl:if>
</xsl:template>
</xsl:stylesheet>