Если вы хотите изменить способ визуализации элементов в элементе управления, вы можете использовать свойства StaticMenuItemTemplate
и DynamicMenuItemTemplate
. В моем примере я буду использовать только первое (статическое, для элементов верхнего уровня):
<asp:Menu runat="server" ...>
<StaticMenuItemTemplate>
<a id="<%# GetSuitableClientId(Container) %>"><%# Eval("Text") %></a>
</StaticMenuItemTemplate>
</asp:Menu>
Свойство StaticMenuItemTemplate
имеет тип ITemplate
и, как часто бывает в случае с такими свойствами шаблона, оно украшено TemplateContainer
приписывать. Это указывает контейнер, в котором должен быть создан экземпляр шаблона, обычно контейнер предоставляет доступ к некоторому контексту, который может вам понадобиться при рендеринге. В этом случае он имеет тип MenuItemTemplateContainer
, который реализует IDataContainer
и, таким образом, дает доступ к элементу данных.
Таким образом, мы передаем этот контейнер методу на нашей странице, и в этом методе мы создаем идентификатор по своему усмотрению. Мы могли бы использовать элемент данных для глубины и контейнер для индекса, например:
protected string GetSuitableClientId(MenuItemTemplateContainer container)
{
MenuItem item = (MenuItem)container.DataItem;
return String.Format("menuItem-{0}-{1}", item.Depth, container.ItemIndex);
}
Я предполагаю, что при построении этого ответа вы можете настроить свой JavaScript для привязки к событиям клика по элементу <a id="menuItem-2-4">Text</a>
, поскольку теперь у вас есть предсказуемые идентификаторы на стороне клиента.
Редактировать: вы также можете использовать следующее в своем шаблоне и позволить ASP.NET позаботиться о создании уникального идентификатора на стороне клиента, но это менее предсказуемо ...
<asp:HyperLink ID="MenuItem" runat="server" NavigateUrl='<%# Eval("NavigateUrl") %>' />