似乎无法将 Linq 与 ASP.Net 导航菜单一起使用

Posted

技术标签:

【中文标题】似乎无法将 Linq 与 ASP.Net 导航菜单一起使用【英文标题】:Can't seem to use Linq with ASP.Net Navigation menu 【发布时间】:2011-08-05 09:26:00 【问题描述】:

我有以下代码:

        // Iterate through the root menu items in the Items collection.
        foreach (MenuItem item in NavigationMenu.Items)
        
            if (item.NavigateUrl.ToLower() == ThisPage.ToLower())
            
                item.Selected = true;
            
        

我想要的是:

var item = from i in NavigationMenu.Items
           where i.NavigateUrl.ToLower() == ThisPage.ToLower()
           select i;

然后我可以设置itemSelected 值,但它给了我NavigationMenu.Items 的错误。

错误 5 找不到查询模式的实现 源类型“System.Web.UI.WebControls.MenuItemCollection”。 '在哪里' 未找到。考虑明确指定范围的类型 变量“我”。

当我注释掉 where 子句时,我收到此错误:

错误 22 找不到查询模式的实现 源类型“System.Web.UI.WebControls.MenuItemCollection”。 '选择' 未找到。考虑明确指定范围的类型 变量“我”。

【问题讨论】:

为了将来参考,真的值得阅读错误消息 - 它给出了与我完全相同的建议:明确指定范围变量的类型。 当我注释掉 Linq 语句的 where 部分时,就会出现该消息。当我取消注释 where 语句时,它给了我一个不同的错误。 @Neil:那个错误信息是什么?一般来说,在这样的问答网站上,如果不指定错误消息本身,就说“它给了我一个错误”绝不是一个好主意。 @Neil:这不是一个 非常 不同的错误消息 - 它仍然准确地告诉你需要做什么来修复它:) 【参考方案1】:

我怀疑NavigationMenu.Items 只实现了IEnumerable,而不是IEnumerable<T>。要解决此问题,您可能需要调用 Cast,这可以通过在查询中显式指定元素类型来完成:

var item = from MenuItem i in NavigationMenu.Items
           where i.NavigateUrl.ToLower() == ThisPage.ToLower()
           select i;

但是,您的查询被误导了 - 它是事物的序列,而不是单个项目。

我还建议使用StringComparison 来比较字符串,而不是大写字符串。例如:

var items = from MenuItem i in NavigationMenu.Items
            where i.NavigateUrl.Equals(ThisPage, 
                                 StringComparison.CurrentCultureIgnoreCase)
            select i;

然后我会考虑使用扩展方法:

var items = NavigationMenu.Items.Cast<MenuItem>()
            .Where(item => item.NavigateUrl.Equals(ThisPage, 
                                 StringComparison.CurrentCultureIgnoreCase));

【讨论】:

哦...这是一个巧妙的技巧!我希望我早点知道Cast

以上是关于似乎无法将 Linq 与 ASP.Net 导航菜单一起使用的主要内容,如果未能解决你的问题,请参考以下文章

无法让 ASP.NET Core Web API 与 IIS 一起使用 [关闭]

siteMap与站点导航

asp.net 做导航 用menu控件,实现菜单横排,鼠标移动到菜单的一项上,向下弹出子菜单。这个效果的xml怎么

在 ASP.Net Core Web 应用程序(引导程序)中向导航栏添加下拉菜单

引导程序和 ASP.NET 菜单

LINQ to Entities 无法识别方法“Double Parse(System.String)”无法转换为存储表达式 C# asp.net [重复]