这是我的控制器动作方法。
public class MoviesController : Controller
{
private MovieDBContext db = new MovieDBContext();
// GET: /Movies/
public ActionResult Index()
{
return View( db.Movies.ToList() );
}
}
正如可以看到List
被传递给View
这就是为什么我期望在List
中view
但View
中使用IEnumerable
它的作用为View
以下是@model IEnumerable<MVCWebApplication2.Models.Movie>
List
为什么传递的值IEnumerable
表现为IEnumerable
?
是List
的超级{{1}}吗?
答案 0 :(得分:2)
List<T>
实现了IEnumerable<T>
接口:
http://msdn.microsoft.com/en-us/library/6sh2ey19(v=vs.110).aspx
通常最好在可能的情况下尝试使用接口来保持代码解耦,这就是为什么View
是这样的脚手架的原因。在这种情况下,您可以将实现Movie
的任何其他IEnumerable<T>
集合传递到您的View
,并且您的View
会很乐意呈现而不会出现问题。
因此,假设您在其他Action
中有另一个Controller
,例如:
public ActionResult Index()
{
Queue<Movie> movies = new Queue<Movie>();
movies.Enqueue(db.Movies.Single(m => m.Title == "Flash Gordon"));
movies.Enqueue(db.Movies.Single(m => m.Title == "Star Wars"));
return View( "Movie/Index", movies );
}
由于Queue<T>
实施IEnumberable<T>
,movies
将由同一View
呈现,而不必对其进行任何更改。如果您的View
已输入List<Movies>
,则需要创建一个单独的View
以适应您的Queue<Movies>
模型!
答案 1 :(得分:2)
正如克里斯提到的,List<T>
实现了IEnumerable<T>
,这就是为什么它对于View模型有效:
@model IEnumerable<MVCWebApplication2.Models.Movie>
由于您说要将其用作List
,因此列表还实施IList<T>
,它应该为您提供您希望在视图中具有的功能
你可以使用像这样的List方法:
@model IList<MVCWebApplication2.Models.Movie>
<div>
First movie: @Model.First().Name
</div>
@Model.Count Action Movies:
<ul>
@foreach (var item in Model.Where(x => x.Type = "ActionMovie"))
{
<li>@item.Name - @item.Description</li>
}
</ul>