Установить класс CSS «выбранным» в меню ASP.NET для родителей и их детей?

У меня есть следующий элемент управления меню, встроенный в файл Site.master:

<asp:Menu ID="NavigationMenu" runat="server" CssClass="menu" EnableViewState="false" IncludeStyleBlock="false" Orientation="Horizontal" RenderingMode="List">
    <Items>
        <asp:MenuItem NavigateUrl="~/Default.aspx" Text="Home" />
        <asp:MenuItem NavigateUrl="~/TechServices.aspx" Text="Tech Services"/>
        <asp:MenuItem NavigateUrl="~/HumanResources.aspx" Text="Human Resources"/>
        <asp:MenuItem NavigateUrl="~/Marketing.aspx" Text="Marketing"/>
        <asp:MenuItem NavigateUrl="~/DocumentControl.aspx" Text="Document Control"/>
        <asp:MenuItem NavigateUrl="~/IT.aspx" Text="Information Tech"/>
    </Items>
</asp:Menu>

Чтобы установить атрибут класса CSS selected, я использую следующий код C #:

protected void Page_Load(object sender, EventArgs e) {
    string thispage = this.Page.AppRelativeVirtualPath;
    int slashpos = thispage.LastIndexOf('/');
    string pagename = thispage.Substring(slashpos + 1);

    foreach (MenuItem mi in NavigationMenu.Items) {
        if (mi.NavigateUrl.Contains(pagename)) {
            mi.Selected = true;
            break;
        }
    }
}

Приведенный выше код отлично работает. Однако эти страницы теперь содержат подстраницы (дочерние), и я хотел бы, чтобы родительские страницы сохраняли свой атрибут CSS «Выбрано» при доступе к одной из своих дочерних страниц.

Я также создал файл Web.sitemap для организации всех родительских и их дочерних страниц. Однако я знаю, как использовать Web.sitemap, чтобы помочь указанной выше функции C #, чтобы помочь родительскому меню сохранить свой атрибут «selected» класса CSS. Я не уверен, нужен ли мне для этой цели файл Web.sitemap? Родительская и дочерняя логика доступна только в файле Web.sitemap.


person Fawadafr    schedule 05.02.2012    source источник


Ответы (1)


Как только вы найдете MenuItem для выбора, просто пройдите вверх и выберите все родительские элементы. Вот какой-то псевдокод:

MenuItem miP = mi.Parent;
while (miP != null) 
{ 
  miP.Selected = true;
  if (miP.Parent == null)
   break;
  else
   miP = miP.Parent;
}
person Malk    schedule 05.02.2012
comment
Я не хочу, чтобы это сработало, так как отношения между родительским и дочерним объектами упоминаются только в файле Web.sitemap. Я не вижу ссылок в вашем фрагменте кода. Если только я чего-то не упускаю. - person Fawadafr; 05.02.2012
comment
Я задал очень сложный вопрос? - person Fawadafr; 08.02.2012
comment
Да, я пробовал, но не вышло. Я верю в это главным образом потому, что отношения родитель-потомок определены только в файле web.sitemap. Мне интересно, мне может потребоваться полностью переделать систему меню, чтобы получить навигацию непосредственно из файла web.sitemap. Твои мысли? - person Fawadafr; 09.02.2012
comment
Если меню привязано к карте сайта (а оно должно быть, чтобы найти узел для выбора), тогда оно уже должно содержать отношения родитель / потомок. Что касается переделки системы; Я думаю, это будет зависеть от вашего уровня комфорта / навыков. - person Malk; 09.02.2012