我在控制器中有一个List
List<string> myList = new List<string>(); myList.Add(aString); ViewBag.linkList = myList;
然后在我试图做的视图中
@ViewBag.linkList.First()
它给了我错误: 'System.Collections.Generic.List'不包含'First'的定义
如果我这样做
@ ViewBag.linkList [0]
工作正常。
我已将@using System.Linq
放入视图中。我错过了什么吗? Linq是否在视图内工作?
答案 0 :(得分:9)
ViewBag
是动态的。 First()
是IEnumerable<T>
上的扩展方法。扩展方法不适用于动态引用。
在致电IEnumerable<string>
之前,您必须先将列表转换为First()
。
@((ViewBag.linkList as IEnumerable<string>).First())
请注意,普通IEnumerable
无法使用,因为.First()
未定义。
答案 1 :(得分:2)
尝试将其投射到IEnumerable<T>
,如下所示:
@((IEnumerable<string>)ViewBag).linkList.First()
或List<string>
:
@((List<string>)ViewBag).linkList.First()
ViewBag是dynamic
对象...更具体地说,是ExpandoObject
。我猜测动态活页夹难以识别原始类型。
答案 2 :(得分:1)
您应该通过ViewModel将列表传递到视图中。在其最简单的形式中,从控制器传递视图中的列表,例如。 return View(myList);
在视图中,在页面顶部添加@model = List<string>
。然后,您可以使用Model.First()model.First()来获取所需的项目。
ViewModels可以创建为类或结构,也可以创建简单的数据类型,但好处是它们在进入View时会被强类型化。