7

我在控制器中有一个列表

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 在视图内工作吗?

4

3 回答 3

8

ViewBag是动态的。 First()是 . 上的扩展方法IEnumerable<T>。扩展方法不适用于动态引用。

IEnumerable<string>在调用 之前,您必须先将列表投射到First()

@((ViewBag.linkList as IEnumerable<string>).First())

请注意,plainIEnumerable不起作用,因为.First()没有为它定义。

于 2013-08-01T00:19:23.347 回答
2

尝试将其转换为IEnumerable<T>,如下所示:

@((IEnumerable<string>)ViewBag).linkList.First()

List<string>

@((List<string>)ViewBag).linkList.First()

ViewBag 是一个dynamic对象......更具体地说,一个ExpandoObject. 我猜动态活页夹很难识别原始类型。

于 2013-08-01T00:08:38.830 回答
1

您应该通过 ViewModel 将列表传递到视图中。以最简单的形式将列表从控制器传递到视图中,例如。return View(myList);

@model = List<string>在页面顶部的视图中添加。然后,您可以使用 Model.First() model.First() 来获取您想要的项目。

ViewModel 可以创建为类或结构,或者只是简单的数据类型,但好处是当它们进入视图时它们是强类型的。

于 2013-09-06T23:55:59.950 回答