2014-06-04 2 views
2

Вот мой метод действия от контроллера.Переходящий список для просмотра в asp.net mvc

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? Is IEnumerable супер класс List?

ответ

2

List<T> реализует интерфейс IEnumerable<T>:

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

Это, как правило, лучшие практики, чтобы попытаться работать с интерфейсами, где это возможно, чтобы сохранить код развязкой, так вот почему View был scaffolded подобное. В этом случае вы можете передать любую другую коллекцию 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>!

2

Как уже упоминалось Крис, List<T> реализует IEnumerable<T>, так что именно поэтому она справедлива для модели The 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> 
Смежные вопросы