还是我需要使用控制器?我有一个电影课,流派课程和一个媒体课程,我需要在模型视图中组合,以便我可以在剃须刀页面上访问多个模型。我已经看到了许多模型视图模型模式的文档,但是它们似乎都围绕着使用控制器围绕着。
ViewModel类,位于一个名为" ViewModel"
的单独文件夹中namespace MyMovies.Models
{
public class MoviesModelView
{
public List<Movies> Movies { get; set; }
public List<Media> Media { get; set; }
public List<Genres> Genres { get; set; }
public List<TitleType> TitleType { get; set; }
}
}
我的流派模型的示例。我的其他课程(例如,用于媒体,电影(相似,除了它们当然有不同的字段。
namespace MyMovies.Models
{
public class Genres
{
[Key]
public byte GenreID { get; set; }
public String GenreName { get; set; }
public String ImageURL { get; set; }
}
}
我试图创建一个剃须刀脚手架,该脚手架确实结合了每个类中的代码。但是我不能没有主钥匙脚手架。当我没有实体框架的脚手架时,它说找不到我的页面。是否有有关使用Razor页面(无控制器(创建MVVM模式的文档?
剃须刀页中的pagemodel类被认为是组合的控制器和ViewModel。默认情况下,它通过@model
指令接触其内容页面(类似于MVC视图(。您可以为包裹在ViewModel中的每个项目中添加属性:
public class MyPageModel : PageModel
{
public List<Genre> Genres { get; set; }
public List<Movie> Movies { get; set; }
...
}
,或者您可以将视图模型添加为属性:
public class MyPageModel : PageModel
{
public MoviesModelView ViewModel { get; set; }
}
在第一个示例中,您会在内容页面中引用内容:
@foreach(var movie in Model.Movies)
{
}
在第二个,这有点混乱(无论如何,对我来说(:
@foreach(var movie in Model.ViewModel.Movies)
{
}
添加到Mike Bind提供的答复中,您还可以添加剃须刀页面视图的顶部,代码如下:
@{
ViewData["Title"] = "My Page";
var movies = Model.ViewModel.Movies;
}
以及电影循环时:
@foreach (var movie in movies)
{
// code
}
这样,您可以在视图中轻松地进行切换,以防您要返回var movies = Model.Movies;
另外,请记住,使用单个视图模型,将允许您替换10个属性/对象,例如1个单个类(ViewModel(。
public class ViewModel
{
public List<Genre> Genres { get; set; }
public List<Movie> Movies { get; set; }
public IList<CrewMember> Crew { get; set; }
// Other properties you may need
}
支持使用视图模型:
- 我会在项目中以后的任何地方算出该课程的可重复使用。
- 视图模型提供了一种防止过度稳定的替代方法。如Microsoft的文档中所述。
缺点:
- 在页面模型中,您必须做更多的工作,将实际值分配给变量。
一天结束时,您的最终选择将取决于您的偏好,项目范围和工作时间限制。