在一个控制器中使用两个型号?

时间:2013-05-24 18:58:20

标签: c# asp.net-mvc-4 entity-framework-5

我目前有一个带有主页的应用程序,该主页根据“创建”日期或输入数据库显示十部电影的列表。我还想根据每部电影的评级显示前十部电影的列表。有没有办法传入另一个模型或改变我当前的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; }
}

5 个答案:

答案 0 :(得分:7)

创建一个包含两个列表的模型:

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);

在您的视图中,使用MovieListViewModel作为模型,并根据需要使用您的两个列表。

答案 1 :(得分: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(而不是在操作方法中使用所有逻辑)。

对于这样的简单场景,在控制器中进行设置是最简单的方法。如果您发现自己需要重用查询逻辑,请考虑将其抽象为辅助类。

答案 2 :(得分:1)

只需创建另一个viewmodel,两个列表有两个属性:

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

在控制器中,您可以创建此视图模型并传递两个列表:

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

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

        return View(vm );

    }

答案 3 :(得分:0)

另一种方法是创建主视图并使其呈现2个动作方法的结果,返回2个局部视图,每个视图都键入一个模型。

答案 4 :(得分: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; }
}

现在在Controller中你会这样做

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

在视野中,你会像这样收到它

@model ViewModel

使用元组

元组用于存储不同的类型。您可以将所需的类对象存储在其中并传递给视图

在控制器中

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

在视图中,您将收到这样的

@model Tuple<int,string>