C# MenuItem客户ID

C# MenuItem客户ID,c#,asp.net,webforms,menuitem,C#,Asp.net,Webforms,Menuitem,我在页面上有一个项目,它有一系列菜单项(从数据库动态生成)作为菜单项 每个MenuItem将自身呈现为 <a class="ctl00_cphContent_cphMainContentTitle_uxHeaderMenu_menuPageNav_1 button ctl00_cphContent_cphMainContentTitle_uxHeaderMenu_menuPageNav_3" style="border-style:none;font-size:1em;" href="So

我在页面上有一个项目,它有一系列菜单项(从数据库动态生成)作为菜单项

每个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 =>');
OurSite.SetupDialogueBoxForOpen(“”);
但是,由于某些原因,菜单项似乎没有指定ClientID属性。这使得在JavaScript中设置客户端id几乎不可能

是否有人知道如何获取菜单项的ClientID(仅为了澄清,菜单项的类型为System.Web.UI.WebControl.menuitem


提前感谢!

试试这个,更改
选择器$(“menu>a”).bind('click',function(){})

您将进入如下菜单项:

OurSite.SetupDialogueBoxForOpen('<%= uxHeaderMenu.FindControl("menuPageNav_3").ClientID %>');
OurSite.SetupDialogueBoxForOpen(“”);
由于您没有发布任何代码,我无法告诉您如何具体选择第三个(在上述情况下)。。。。但这应该行得通

您需要使用FindControl,因为MenuItem是菜单的子项,而不是页面或用户控件的子项。

绑定菜单(OnMenuItemDataBound)时,您可能可以添加带有某些ID的自定义属性,这些ID可以稍后在JavaScript中使用

更新:MenuItem没有Attributes属性,因此它是死胡同。此外,由于MenuItem是密封的,因此没有更改的余地。但菜单是公共课,所以也许可以在那里做。整个菜单/菜单项不便于修改,因此我认为您必须编写大量自定义代码

或者使用它


如果由我决定,我会删除asp.net菜单并完全定制它。

获取DOM中每个锚标记的列表,然后遍历它们,查看.class直到找到该类==“无论您输入了什么\u Nav\u ID\u或\u flag\u,都可以\u以某种方式\u区分此\u元素”,然后使用.ID为其分配ID,怎么样?比如:未经测试

var-anchors=document.getElementsByTagName(“a”);
对于(int i=0;i
编辑: 在渲染过程中,您可以使用一个条件来查看新的菜单项是否就是您要查找的菜单项

<%
  if (MenuItem.flag == menuItemToTarget)
  {
      //set MenuItem id
  }
%>

Asp:menu提供一组CSS属性,例如hoverCss/SelectCss

如果选择(鼠标悬停/单击)一个菜单项,cssclass是否会添加到html控件(a)上

如果答案为“是”,则使用

$('.ThessClassusSpecified').live('单击',函数()){

或者说“不”,恐怕您必须使用下面的代码,VS2010之前的caz asp控件对于js和jquery来说并不完美

$('menu>a').live('click',function(){


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

我猜在构建这个答案时,您现在可以调整JavaScript,以绑定
Text
元素上的click事件,因为您现在有了可预测的客户端ID

编辑:您也可以在模板中使用以下内容,并让ASP.NET负责创建唯一的客户端ID,但这是不可预测的

<asp:HyperLink ID="MenuItem" runat="server" NavigateUrl='<%# Eval("NavigateUrl") %>' />

这些答案中的大多数都为定位某个链接并对其进行处理提供了很好的方法。问题是,您不知道数据库将生成哪些链接,并且这些链接没有可供选择的客户端ID

您可能不喜欢这个答案,但最终您需要实现一些东西,让您能够识别链接,无论它是
还是
id
属性,最终都是不相关的

大致设想如下:

  • 客户端的编号/命名约定。例如,在page ready上,使用jQuery解析锚,可能是它们的类或href值,并使用此数据按常规设置客户端Id

  • 更改DB架构以允许将客户端ID与链接详细信息一起存储。这可能需要最多的工作,因为这意味着更改架构、对象和方法等…但这不应该太难,而且可能是最安全、最干净的解决方案


我确信还有其他选择,但关键是在脚本帮助您之前,您需要以某种方式识别您的链接。

恐怕有大约10-15个菜单项,我只想绑定其中一个,因此无法做到这一点:|通常这对其他控件有效,但menuPageNav_3(或任何名称)仍然不会有ClinentID调用。uxHeaderMenu将是主菜单,FindControl将允许我查找给定的menuItem(我已经有了它)但是没有与MenuItem关联的ClientID谢谢John,我不知道。生成菜单时可以伪造ID吗?添加带值的属性,或者通过子类化MenuItem并自己添加ID来创建自定义MenuItem控件?到目前为止,我看到的唯一方法是使用“最佳猜测”方法,其中我获取ParentID,计算添加元素的顺序,然后将数字附加到末尾,例如ct0001\u NavMenu\u 1 ct0001\u NavMenu\u 2等。在数据绑定时,您是否尝试将ID添加到MenuItem的值中?或者您是否使用值字段进行其他操作,但无法更改?我们可以通过设置t强制它工作他是一个奇怪的目标,然后在jQuery中处理这个问题,但显然这不是一个修复,只是一个黑客。好奇地想知道是否有一个“真正的”修复。你的超链接上不需要runat=server吗?代码是abov
                                $(this)....

                              });
                       $(this)... 

               });
<asp:Menu runat="server" ...>
  <StaticMenuItemTemplate>
    <a id="<%# GetSuitableClientId(Container) %>"><%# Eval("Text") %></a>
  </StaticMenuItemTemplate>
</asp:Menu>
protected string GetSuitableClientId(MenuItemTemplateContainer container)
{
  MenuItem item = (MenuItem)container.DataItem;
  return String.Format("menuItem-{0}-{1}", item.Depth, container.ItemIndex);
}
<asp:HyperLink ID="MenuItem" runat="server" NavigateUrl='<%# Eval("NavigateUrl") %>' />