如何使用代码隐藏从站点地图 select SiteMapNode?

How to select a SiteMapNode from sitemap using code behind?

我正忙于在 ASP.Net 中构建自己的自定义导航页面。我正忙着用我的 web.sitemap 文件中的特定 SiteMapNode 填充 <asp:Repeater> 的数据。

这是我的 web.sitemap:

<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
    <siteMapNode roles="*">
        <siteMapNode url="~/Secure/Home" title="Home">
            <!-- Home SiteMapNodes -->
        </siteMapNode>
        </siteMapNode url="~/Secure/Maintenance title="maintenance">
            <!-- Maintenance SiteMapNodes -->
        </siteMapNode>
    </siteMapNode>
</siteMap>

在我的主页导航页面中,我设置了以下转发器:

<ul>
    <asp:Repeater runat="server" ID="rptMenu" DataSourceID="smdsMain" OnItemDataBound="rptMenu_ItemDataBound">
        <ItemTemplate>
            <li>
                <a runat="server" href='<%# Eval("url") %>'>
                    <%# Eval("title") %>
                </a>
            </li>
        </ItemTemplate>
    </asp:Repeater>
</ul>
<asp:SiteMapDataSource ID="smdsMain" runat="server" ShowStartingNode="false" SiteMapProvider="XmlSiteMapProvider" />

我正在尝试使用 OnItemDataBound 方法在后面的代码中填充 <asp:Repeater>,如下所示:

protected void rptMenu_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    SiteMapNode homeNode = ???;
    ((Repeater)e.Item.FindControl("rptMenu")).DataSource = homeNode;
    ((Repeater)e.Item.FindControl("rptMenu")).DataBind();
}

我唯一的问题是如何使用 title home?

homeNode SiteMapNode 设置到 SiteMapNode

经过一些改动和一些研究,我找到了使用 SiteMap.Provider.FindMapNodeFromKey(key) 方法的解决方案。其中 keyweb.sitemap 节点的 url

我还意识到我不应该使用 OnItemDataBound 方法来设置我的 rptMenuDataSource。所以我在 Page_Load 方法中做了。

因此,这是我的工作 Page_Load 代码:

var homeNode = SiteMap.Provider.FindSiteMapNodeFromKey("~/Secure/Maintenance");
rptMenu.DataSource = homeNode.ChildNodes;
rptMenu.DataBind();