如果我使用没有控制器的剃须刀页面,如何实现ViewModel



还是我需要使用控制器?我有一个电影课,流派课程和一个媒体课程,我需要在模型视图中组合,以便我可以在剃须刀页面上访问多个模型。我已经看到了许多模型视图模型模式的文档,但是它们似乎都围绕着使用控制器围绕着。

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的文档中所述。

缺点:

  • 在页面模型中,您必须做更多的工作,将实际值分配给变量。

一天结束时,您的最终选择将取决于您的偏好,项目范围和工作时间限制。

相关内容

  • 没有找到相关文章