【发布时间】:2015-05-06 17:53:09
【问题描述】:
在一个 asp.net 页面中,我有嵌套的转发器来显示我的站点地图的四个级别。
问题: 如果节点没有子节点,我如何告诉嵌套中继器不显示节点?更具体地说,当嵌套中继器没有子节点时,它呈现为一对<ul></ul> 标签——这就是我需要从呈现列表中隐藏的内容。
工作原理:此处提供的 HTML 和脚本将 web.sitemap 正确地呈现为干净的无序列表,仅在节点没有子节点的情况下使用空 UL 标记。
到目前为止我尝试过的(不成功):
- 我研究了 jQuery。虽然我找到了正确的 jQuery 命令来删除空的
<ul>对,但 webresource 绝对确保覆盖 jQuery 命令。 (这也使我无法使用 jQuery 来删除乱扔渲染的 asp:menu 的类)。换句话说,我还没有找到让 jQuery 清理 asp.net 控件产生的东西的方法。 - 我找到了论坛帖子,但它们似乎都重复了相同的两级深度中继器,而没有删除任何无子节点。
- 我仔细检查了我的 web.sitemap 文件,并确保我的源文件中没有任何内容会导致此问题。源头没有问题。
环顾四周,我在这里发现了一个非常有前途的帖子:Hide child and parent repeater when child repeater is empty。将其适应 VB.NET 并添加一个空检测 if-then 语句,我有:
Protected Sub HideIfEmpty(sender As Object, e As RepeaterItemEventArgs) Handles Repeater0.ItemDataBound
If e.Item.ItemType = ListItemType.Item Then
If e.Item.FindControl("Repeater4") IsNot Nothing Then
If (DirectCast(e.Item.FindControl("Repeater3"), Repeater).Items.Count = 0) Then
e.Item.Visible = False
End If
End If
End If
End Sub
根据评论,我还尝试了 PreRender 子。它提供了一个带有相同空 UL 标记的站点地图列表。使用断点并不能确定为什么它不能按预期工作。
这是 aspx 代码:
<asp:SiteMapDataSource ID="siteMapDataSource1" runat="server" ShowStartingNode="false" />
<asp:Repeater runat="server" ID="Repeater0" DataSourceID="SiteMapDataSource1">
<HeaderTemplate>
<ul>
<li>
<asp:HyperLink ID="HyperLink4" runat="server" NavigateUrl="~/index.aspx">Homepage</asp:HyperLink>
</li>
</HeaderTemplate>
<ItemTemplate>
<li>
<asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl='<%# Eval("Url") %>'><%# Eval("Title") %></asp:HyperLink>
<asp:Repeater ID="Repeater1" runat="server" DataSource='<%# DirectCast(Container.DataItem, SiteMapNode).ChildNodes%>'>
<HeaderTemplate>
<ul>
</HeaderTemplate>
<ItemTemplate>
<li>
<asp:HyperLink ID="HyperLink2" runat="server" NavigateUrl='<%# Eval("Url") %>'><%# Eval("Title") %></asp:HyperLink>
<asp:Repeater ID="Repeater2" runat="server" DataSource='<%# DirectCast(Container.DataItem, SiteMapNode).ChildNodes%>'>
<HeaderTemplate>
<ul>
</HeaderTemplate>
<ItemTemplate>
<li>
<asp:HyperLink ID="HyperLink3" runat="server" NavigateUrl='<%# Eval("Url") %>'><%# Eval("Title") %></asp:HyperLink>
<asp:Repeater ID="Repeater3" runat="server" DataSource='<%# DirectCast(Container.DataItem, SiteMapNode).ChildNodes%>' OnPreRender="HideIfEmpty">
<HeaderTemplate>
<ul>
</HeaderTemplate>
<ItemTemplate>
<li>
<asp:HyperLink ID="HyperLink3" runat="server" NavigateUrl='<%# Eval("Url") %>'><%# Eval("Title") %></asp:HyperLink>
</li>
</ItemTemplate>
<FooterTemplate>
</ul>
</FooterTemplate>
</asp:Repeater>
</li>
</ItemTemplate>
<FooterTemplate>
</ul>
</FooterTemplate>
</asp:Repeater>
</li>
</ItemTemplate>
<FooterTemplate>
</ul>
</FooterTemplate>
</asp:Repeater>
</li>
</ItemTemplate>
<FooterTemplate></ul></FooterTemplate>
</asp:Repeater>
这是呈现的 HTML:
<ul id="menu_Main" class="sm sm-blue">
<li>
<a id="Repeater0_HyperLink4" href="index.aspx">Homepage</a>
</li>
<li>
<a id="Repeater0_HyperLink1_0">Data Manager Documents</a>
<ul>
<li>
<a id="Repeater0_Repeater1_0_HyperLink2_0" href="/Data_Manager/Skill_Journal.aspx">Skill Journal</a>
<ul>
</ul>
</li>
<li>
<a id="Repeater0_Repeater1_0_HyperLink2_1">Test Pages</a>
<ul>
<li>
<a id="Repeater0_Repeater1_0_Repeater2_1_HyperLink3_0" href="/Data_Manager/xslt_test.aspx">XSLT Test</a>
<ul>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>
<a id="Repeater0_HyperLink1_1">Incident Report</a>
<ul>
<li>
<a id="Repeater0_Repeater1_1_HyperLink2_0" href="http://wales:4885/IncidentReport/IncidentReport.aspx">Add/Edit/View</a>
<ul>
</ul>
</li>
<li>
<a id="Repeater0_Repeater1_1_HyperLink2_1" href="http://wales:4885/IncidentReport/V1_History.aspx">Archive</a>
<ul>
</ul>
</li>
</ul>
</li>
<li>
<a id="Repeater0_HyperLink1_2" href="/Ordering_Database/Ordering_Database.aspx">Ordering Database</a>
<ul>
<li>
<a id="Repeater0_Repeater1_2_HyperLink2_0" href="/Ordering_Database/Reports.aspx">Reports</a>
<ul>
</ul>
</li>
<li>
<a id="Repeater0_Repeater1_2_HyperLink2_1" href="/Ordering_Database/Stats.aspx">Stats</a>
<ul>
</ul>
</li>
<li>
<a id="Repeater0_Repeater1_2_HyperLink2_2" href="/Ordering_Database/View_Items.aspx">View Items</a>
<ul>
</ul>
</li>
<li>
<a id="Repeater0_Repeater1_2_HyperLink2_3" href="/Ordering_Database/Manage_Items.aspx">Manage Items</a>
<ul>
</ul>
</li>
<li>
<a id="Repeater0_Repeater1_2_HyperLink2_4">Utility</a>
<ul>
</ul>
</li>
</ul>
</li>
总而言之,呈现为嵌套无序列表的站点地图是正确的,但仍会产生应在服务器端删除的空 UL 标签。
【问题讨论】:
-
在您最近一次更新后,此时是否还有问题?
-
是的。我距离发布下一个更新还有几分钟。这真的很奇怪:当我重建解决方案并查看呈现的 html 页面时,那里有空的 UL 标记。当我应用一个 jQuery 命令时,它具有删除标签的外观,以便我的 CSS 菜单正常工作,当我右键单击查看源代码时,空的 UL 标签仍然存在。
-
我从不同的角度得出了一个答案。这是一个非常简单的子。现在,如果我可以简化主体中的嵌套中继器,那将是一个更大的胜利。
-
太棒了 - 很高兴你能想出办法!