【问题标题】:Can't seem to use Linq with ASP.Net Navigation menu似乎无法将 Linq 与 ASP.Net 导航菜单一起使用
【发布时间】: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:这不是一个 非常 不同的错误消息 - 它仍然准确地告诉你需要做什么来修复它:)

标签: c# linq navigationbar


【解决方案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
猜你喜欢
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
  • 2021-05-09
  • 2021-06-17
  • 1970-01-01
  • 2015-05-20
  • 1970-01-01
相关资源
最近更新 更多