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