Как выбрать SiteMapNode из карты сайта с помощью кода программной части?

Я занят созданием собственной настраиваемой страницы навигации в ASP.Net. Я занят, пытаясь заполнить данные <asp:Repeater> конкретным SiteMapNode из моего web.sitemap файла.

Вот мой 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" />

Я пытаюсь заполнить <asp:Repeater> в коде позади, используя метод OnItemDataBound следующим образом:

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

Мой единственный вопрос: как установить homeNode SiteMapNode в SiteMapNode с помощью title home?


person Barry Michael Doyle    schedule 14.03.2017    source источник


Ответы (1)


После некоторого измельчения и изменения и небольшого исследования я пришел к решению, используя метод SiteMap.Provider.FindMapNodeFromKey(key). Где key - это url узла web.sitemap.

Я также понял, что мне не следует использовать метод OnItemDataBound для установки моего rptMenu DataSource. Так я и поступил в методе Page_Load.

В результате вот мой рабочий Page_Load код:

var homeNode = SiteMap.Provider.FindSiteMapNodeFromKey("~/Secure/Maintenance");
rptMenu.DataSource = homeNode.ChildNodes;
rptMenu.DataBind();
person Barry Michael Doyle    schedule 14.03.2017