似乎无法将 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;
然后我可以设置item
的Selected
值,但它给了我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 一起使用 [关闭]
asp.net 做导航 用menu控件,实现菜单横排,鼠标移动到菜单的一项上,向下弹出子菜单。这个效果的xml怎么
在 ASP.Net Core Web 应用程序(引导程序)中向导航栏添加下拉菜单
LINQ to Entities 无法识别方法“Double Parse(System.String)”无法转换为存储表达式 C# asp.net [重复]