如果我使用没有控制器的 Razor Pages,如何实现 ViewModel

sql*_*cdr 8 t-sql asp.net mvvm viewmodel razor-pages

或者我需要使用控制器吗?我有一个 Movies 类、一个 Genres 类和一个 Media 类,我需要将它们合并到模型视图中,以便我可以访问 Razor 页面上的多个模型。我看过很多关于模型-视图-视图模型模式的文档,但它们似乎都围绕着使用控制器。

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

    }
}
Run Code Online (Sandbox Code Playgroud)

我的流派模型的示例。我的其他课程(例如媒体、电影)类似,当然它们有不同的领域。

namespace MyMovies.Models
{
    public class Genres
    {
        [Key]
        public byte GenreID { get; set; }
        public String GenreName { get; set; }
        public String ImageURL { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试创建一个 RazorPage 脚手架,它确实结合了每个类的代码。但如果没有主键,我就无法搭建支架。当我在没有实体框架的情况下搭建脚手架时,它说找不到我的页面。是否有任何关于使用 razor 页面(无控制器)创建 MVVM 模式的文档?

Mik*_*ind 10

Razor Pages 中的 PageModel 类被视为充当组合控制器和 ViewModel。默认情况下,它通过指令公开到其内容页面(类似于 MVC 视图)@model。您可以为 ViewModel 中包装的每个项目添加属性到 PageModel:

public class MyPageModel : PageModel
{
    public List<Genre> Genres { get; set; }
    public List<Movie> Movies { get; set; }
    ...
}
Run Code Online (Sandbox Code Playgroud)

或者您可以将 ViewModel 添加为属性:

public class MyPageModel : PageModel
{
    public MoviesModelView ViewModel { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在第一个示例中,您按照预期引用内容页面中的内容:

@foreach(var movie in Model.Movies)
{

}
Run Code Online (Sandbox Code Playgroud)

在第二个中,它有点混乱(无论如何对我来说):

@foreach(var movie in Model.ViewModel.Movies)
{

}
Run Code Online (Sandbox Code Playgroud)