2013-05-24 3 views
2

В настоящее время у меня есть приложение с домашней страницей, в которой показан список из десяти фильмов на основе даты, когда они были «созданы» или введены в базу данных. Я также хотел бы показать список из десяти лучших фильмов, основанный на рейтинге каждого фильма. Есть ли способ перейти в другую модель или изменить мой текущий ViewModel, чтобы сделать это? Вот раздел Индекс моего дома контроллера:Использование двух моделей в одном контроллере?

public ActionResult Index() 
    { 
     var model = 
      _db.Movies 
       .OrderByDescending(m => m.DateEntered) 
       .Take(10) 
       .Select(m => new MovieListViewModel 
       { 
        Id = m.Id, 
        Title = m.Title, 
        Genre = m.Genre, 
        ReleaseDate = m.ReleaseDate, 
        CountOfReviews = m.Reviews.Count() 
       }); 

     return View(model); 

    } 

И ViewModel передается в:

public class MovieListViewModel 
{ 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public string Genre { get; set; } 

    [Display(Name="Year Released")] 
    public DateTime ReleaseDate { get; set; } 
    public int CountOfReviews { get; set; } 
} 
+0

Вы можете создать единую модель представления, содержащую два набора результатов. Это становится немного более сложным с сценариями чтения/записи, но для отображения информации это очень просто. –

ответ

6

Создать модель, которая охватывает оба списка:

public class MovieListViewModel 
{ 
    public List<MovieModel> Top10ByCreated { get; set; } 
    public List<MovieModel> Top10ByRating { get; set; } 
} 

public class MovieModel 
{ 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public string Genre { get; set; } 

    [Display(Name="Year Released")] 
    public DateTime ReleaseDate { get; set; } 
    public int CountOfReviews { get; set; } 
} 

Тогда в контроллере :

var model = new MovieListViewModel(); 

model.Top10ByCreated = ... 
model.Top10ByRating = ... 

return View(model); 

I n ваш взгляд, используйте MovieListViewModel в качестве вашей модели и используйте ваши два списка по мере необходимости.

+0

Мне это нравится. Очень прямолинейно и просто. Я собираюсь дать ему вихрь. :) –

+0

+1 MVVMC за победу – GFoley83

1

Вы можете создать единую модель просмотра, содержащую два набора результатов. Затем контроллер создает экземпляр родительского типа и заполняет дочерние коллекции по своему усмотрению.

public sealed class HomeViewModel{ 
    public MovieListViewModel TopTenByRating { get; set; } 
    public MovieListViewModel TopTenByDate { get; set; } 
} 

public ActionResult Index() 
{ 
    var model = new HomeViewModel(); 

    model.TopTenByDate = 
     _db.Movies 
      .OrderByDescending(m => m.DateEntered) 
      .Take(10) 
      .Select(m => new MovieListViewModel 
      { 
       Id = m.Id, 
       Title = m.Title, 
       Genre = m.Genre, 
       ReleaseDate = m.ReleaseDate, 
       CountOfReviews = m.Reviews.Count() 
      }); 

    model.TopTenByRating = // something else 

    return View(model); 
} 

Для более сложных сценариев, я предпочитаю dedicated composer, который отвечает за создание модели вида (вместо того, чтобы вся логика в методе действия).

Для простого сценария, как это, настройка его в контроллере является самым простым способом. Если вам нужно повторно использовать логику запроса, рассмотрите абстрагирование ее на вспомогательный класс.

1

Просто создать еще один ViewModel, с двумя свойствами для двух списков:

public class MovieIndexViewModel 
{ 
    public IEnumerable<MovieListViewModel> TopTenByDate { get; set; } 
    public IEnumerable<MovieListViewModel> TopTenByRating { get; set; } 
} 

В контроллере вы можете создать этот ViewModel и передать два списка:

public ActionResult Index() 
    { 
     var vm = new MovieIndexViewModel(); 

     vm.TopTenByDate = ....; 
     vm.TomTenByRating = ...; 

     return View(vm); 

    } 
+0

Также утвердил это. –

0

Другой подход был бы для создания основного представления и получения его для отображения результатов из 2 методов действий, возвращающих 2 частичных вида, каждый из которых вводится в одну из моделей.

0

У вас есть различные варианты, которые Вы можете использовать любой из них

Использование ViewModel

Для просмотра модели вы должны создать класс и в этом классе будет определять все модели в качестве свойств этого класса. Вот два класса.

public class EmployeeDetails 
{ 
    [Required] 
    [Display(Name = "Name")] 
    public string Name { get; set; } 

} 

public class Employee 
{ 
    public int Id { get; set; } 
} 

Вот ViewModel

public class ViewModel 
{ 
    public Employee emp { get; set; } 
    public EmployeeDetails empdet{ get; set; } 
} 

Теперь в контроллере вы будете делать как этот

public ActionResult About() 
{ 
     ViewModel vm = new ViewModel(); 
     vm.emp = new Employee(); 
     vm.empdet = new EmployeeDetails(); 
     return View(vm); 
} 

И ввиду вы получите его, как этот

@model ViewModel 

использования T uple

Кортеж используется для хранения различных types.You может хранить ваши необходимые классы объектов в нем и передать для просмотра

В контроллере

Tuple<int, string> tuple = new Tuple<int, string>(1, "Hello world"); 
return View(tuple); 

В связи вы получите его, как этот

@model Tuple<int,string> 
Смежные вопросы