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

发布于 2024-11-28 08:00:54 字数 917 浏览 0 评论 0原文

我有以下代码:

        // 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”。 '在哪里' 未找到。考虑显式指定范围的类型 变量“i”。

当我注释掉 where 子句时,出现以下错误:

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

I have the following piece of code:

        // 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;
            }
        }

What I'd like is:

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

Then I can set the Selected value of item, but it gives me an error on the NavigationMenu.Items.

Error 5 Could not find an implementation of the query pattern for
source type 'System.Web.UI.WebControls.MenuItemCollection'. 'Where'
not found. Consider explicitly specifying the type of the range
variable 'i'.

When I comment out the where clause, I get this error:

Error 22 Could not find an implementation of the query pattern for
source type 'System.Web.UI.WebControls.MenuItemCollection'. 'Select'
not found. Consider explicitly specifying the type of the range
variable 'i'.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦中的蝴蝶 2024-12-05 08:00:54

我怀疑 NavigationMenu.Items 仅实现 IEnumerable,而不是 IEnumerable。要解决此问题,您可能需要调用 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));

I suspect NavigationMenu.Items only implements IEnumerable, not IEnumerable<T>. To fix this, you probably want to call Cast, which can be done by explicitly specifying the element type in the query:

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

However, your query is named misleadingly - it's a sequence of things, not a single item.

I'd also suggest using a StringComparison to compare the strings, rather than upper-casing them. For example:

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

I'd then consider using extension methods instead:

var items = NavigationMenu.Items.Cast<MenuItem>()
            .Where(item => item.NavigateUrl.Equals(ThisPage, 
                                 StringComparison.CurrentCultureIgnoreCase));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文