我在页面上有一个项目,它有一系列菜单项(从数据库动态生成)作为菜单项。
每个Menuitem都将自己呈现为

<a class="ctl00_cphContent_cphMainContentTitle_uxHeaderMenu_menuPageNav_1 button ctl00_cphContent_cphMainContentTitle_uxHeaderMenu_menuPageNav_3" style="border-style:none;font-size:1em;" href="SomeURLHere.aspx">

不过,我想得到这个链接的clientid(我们使用外部javascript库在模式lightbox样式的框架中弹出页面)。其中一个要求是,我们需要识别“可点击对象id”,这样我们就可以设置它,以便能够在点击时触发事件。
我们网站上的其他地方
OurSite.SetupDialogueBoxForOpen('<%= HyperLink.ClientID =>');

但是由于某些原因,菜单项似乎没有为其分配clientid属性。这使得在javascript中设置客户机id几乎不可能。
是否有人知道如何获取menu item的clientid(仅为了澄清,菜单项的类型为system.web.ui.webcontrols.menuitem
提前谢谢!

最佳答案

如果要更改控件中项的呈现方式,可以使用StaticMenuItemTemplateDynamicMenuItemTemplate属性。我只在示例中使用第一个(静态,用于顶级项):

<asp:Menu runat="server" ...>
  <StaticMenuItemTemplate>
    <a id="<%# GetSuitableClientId(Container) %>"><%# Eval("Text") %></a>
  </StaticMenuItemTemplate>
</asp:Menu>

StaticMenuItemTemplate属性的类型为ITemplate,与此类模板属性的通常情况一样,它用TemplateContainer属性修饰。它指定要在其中实例化模板的容器,通常该容器提供对呈现时可能需要的某些上下文的访问。在这种情况下,它是MenuItemTemplateContainer类型,实现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>元素上的click事件,因为现在有了可预测的客户端id。
编辑:您还可以在模板中使用以下内容,并让asp.net负责创建唯一的客户端ID,但这是不可预测的…
<asp:HyperLink ID="MenuItem" runat="server" NavigateUrl='<%# Eval("NavigateUrl") %>' />

10-08 14:42