将列表传递给ASP.NET MVC视图

3

以下是我在控制器中的操作方法。

public class MoviesController : Controller
{
        private MovieDBContext db = new MovieDBContext();

        // GET: /Movies/
        public ActionResult Index()
        {
            return View( db.Movies.ToList() );
        }
}

正如您所看到的,List被传递给了 View,因此我期望在 view 中将其视为 List 来操作,但在 View 中,它作为 IEnumerable 工作。

以下是来自 View 的第一行:

@model IEnumerable<MVCWebApplication2.Models.Movie>

为什么传递一个 List 值时会表现得像是 IEnumerableIEnumerableList 的超类吗?
2个回答

4

List<T> 实现了 IEnumerable<T> 接口:

http://msdn.microsoft.com/en-us/library/6sh2ey19(v=vs.110).aspx

通常最好使用接口来尽可能地保持代码解耦,这就是为什么 View 被搭建成那样的最佳实践。在这种情况下,您可以将实现了 IEnumerable<T> 的任何其他 Movie 集合传递给您的 View,您的 View 将愉快地渲染而不会出现问题。

因此,假设您有另一个 Controller 中的一些其他 Action,如下所示:

    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>模型!


3
正如 Chris 所提到的,List<T> 实现了 IEnumerable<T>,因此将其作为视图模型是有效的:
 @model IEnumerable<MVCWebApplication2.Models.Movie>

既然您说想将其用作List,那么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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接