如果要更改控件中项目的呈现方式,可以使用StaticMenuItemTemplate
and DynamicMenuItemTemplate
特性。我将仅在示例中使用第一个(静态,用于顶级项目):
<asp:Menu runat="server" ...>
<StaticMenuItemTemplate>
<a id="<%# GetSuitableClientId(Container) %>"><%# Eval("Text") %></a>
</StaticMenuItemTemplate>
</asp:Menu>
The StaticMenuItemTemplate http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.menu.staticitemtemplate.aspx属性是类型ITemplate http://msdn.microsoft.com/en-us/library/system.web.ui.itemplate.aspx与此类模板属性的常见情况一样,它用TemplateContainer http://msdn.microsoft.com/en-us/library/system.web.ui.templatecontainerattribute.aspx属性。这指定了要在其中实例化模板的容器,通常该容器可以访问渲染时可能需要的某些上下文。在这种情况下,它是类型MenuItemTemplateContainer http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.menuitemtemplatecontainer.aspx它实现了IDataContainer
从而提供对数据项的访问。
因此,我们将此容器传递回页面中的方法,并在该方法中构造一个我们认为合适的 ID。例如,我们可以使用数据项作为深度,使用容器作为索引:
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>
元素,因为您现在有了可预测的客户端 ID。
编辑:您还可以在模板中使用以下内容,并让 ASP.NET 负责创建唯一的客户端 ID,但这不太可预测...
<asp:HyperLink ID="MenuItem" runat="server" NavigateUrl='<%# Eval("NavigateUrl") %>' />