ASP.NET: выделить пункт меню текущей страницы
Я пытался найти простой способ выделить текущий выбранный пункт меню asp.net(чтобы пользователь знал, на какой странице они находятся), но независимо от того, что я пытался, я не могу получить это работать. В моей разметке у меня есть:
<asp:Menu ID="NavigationMenu" runat="server" CssClass="menu" EnableViewState="false" IncludeStyleBlock="false" Orientation="Horizontal" StaticSelectedStyle-ForeColor="#99CCFF" DynamicSelectedStyle-ForeColor="#99CCFF">
<Items>
<asp:MenuItem NavigateUrl="~/Default.aspx" Text="Operations"/>
<asp:MenuItem NavigateUrl="~/Analysis.aspx" Text="Analysis"/>
<asp:MenuItem NavigateUrl="~/Dashboard.aspx" Text="Dashboard"/>
<asp:MenuItem NavigateUrl="~/Flashboard.aspx" Text="Flashboard"/>
<asp:MenuItem NavigateUrl="~/Spacequest.aspx" Text="SQ OBP"/>
</Items>
</asp:Menu>
И на стороне сервера функция Page_Load:
((Menu)Master.FindControl("NavigationMenu")).Items[0].Selected = true;
Но это не работает. Я попытался использовать карту сайта (хотя карта сайта не то, что я хочу использовать), и это тоже не сработало. Любые идеи?
Ответы
Ответ 1
Здесь есть свойство StaticSelectedStyle
, которое вы можете использовать в своем меню.
<asp:menu [...]>
<staticselectedstyle backcolor="LightBlue"
borderstyle="Solid"
bordercolor="Black"
borderwidth="1"/>
[...]
</asp:menu>
Подробнее см. .
Кроме того, если к выбранному элементу применяется класс (который я не уверен, есть ли это, но это было бы удобно), вы можете просто подключиться к этому с помощью своего CSS. Это было бы намного лучше, чем использование свойства StaticSelectedStyle
.
UPDATE
Стоит также отметить, что ваше использование IncludeStyleBlock="false"
остановит ваше меню от создания CSS, необходимого для управления выбранным элементом.
Когда блок стиля отключен, вы должны предоставить свои собственные стили, и автоматически созданные стили меню не будут использоваться.
Из MSDN:
Если вы установите для этого свойства значение false, вы не можете установить свойства стиля. Например, вы не можете добавить атрибут DynamicHoverStyle-ForeColor в разметки или установить свойство DynamicHoverStyle.ForeColor в коде.
Источник: http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.menu.includestyleblock.aspx
Ответ 2
Я думаю, вам придется перебирать элементы меню и посмотреть, содержит ли URL текущей страницы NavigateUrl элемента меню.
foreach (MenuItem item in mn.Items)
{
if (Request.Url.AbsoluteUri.ToLower().Contains(Page.ResolveUrl(item.NavigateUrl.ToLower()))
{
item.Selected = true;
}
}
Ответ 3
Я бы использовал jQuery в этом экземпляре.
Для указанной страницы, например, на странице Analysis.aspx, добавьте этот бит jquery на свою страницу.
$('#MenuItemID').addClass('active');
Можете ли вы указать идентификатор пунктов меню?
Например:
<asp:MenuItem ID="AnalysisMenuItem" NavigateUrl="~/Analysis.aspx" Text="Analysis"/>
Затем вы использовали бы это:
$('#' + <% AnalysisMenuItem.ClientID %>').addClass('active');
то, конечно, просто определите, что active
в вашем css:
.active { background-color: #FFF; }
Ответ 4
Если вы думаете сделать это динамически, то это лучший способ:
Menu MyMenu = new Menu();
....
MyMenu.MenuItemDataBound += new MenuEventHandler(MyMenu_MenuItemDataBound);
TheMenu.StaticSelectedStyle.CssClass ="MySelectedClass";
protected void MyMenu_MenuItemDataBound(Object sender, MenuEventArgs e)
{
if (e.Item.NavigateUrl.ToLower().Contains(Path.GetFileName(Request.FilePath).ToLower()))
{
//e.Item.Text = "<div style='color: Yellow'>" + e.Item.Text + " </div>";
e.Item.Selected = true;
}
}
добавить, то просто добавьте стиль .MySelectedClass в ваш файл Css
..
Ответ 5
//Master
<asp:Menu ID="NavigationMenu" runat="server" CssClass="menu"
EnableViewState="False" Orientation="Horizontal"
BackColor="#465C71" DynamicHorizontalOffset="2"
ForeColor="#DDE4EC">
<StaticMenuItemStyle HorizontalPadding="15px" VerticalPadding="2px" />
<StaticSelectedStyle BackColor="#FFFFFF" ForeColor="#000000"/>
<Items>
<asp:MenuItem NavigateUrl="~/Secure/About.aspx" Text="About"/>
<asp:MenuItem NavigateUrl="~/Secure/Login.aspx" Text="Login"/>
</Items>
</asp:Menu>
//Master.cs
foreach (MenuItem item in ((Menu)this.FindControl("NavigationMenu")).Items)
{
if(Request.Url.AbsoluteUri.ToLower().Contains(item.NavigateUrl.ToLower().Substring(1)))
{
item.Selected = true;
}
}
//item.NavigateUrl.ToLower() содержит "~". Итак, найдите подстроку и проверьте.