Как реализовать ViewModel, если я использую Razor Pages без контроллера - PullRequest
1 голос
/ 02 мая 2019

Или я должен использовать контроллер?У меня есть класс Movies, класс жанров и класс Media, которые мне нужно будет объединить в виде модели, чтобы иметь доступ к нескольким моделям на моей странице Razor.Я видел много документации для шаблона Model-View-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; }

    }
}

Пример моей модели жанров.Другие мои классы (например, для Media, Movies) похожи, за исключением того, что они, конечно, имеют разные поля.

namespace MyMovies.Models
{
    public class Genres
    {
        [Key]
        public byte GenreID { get; set; }
        public String GenreName { get; set; }
        public String ImageURL { get; set; }
    }
}

Я попытался создать скаффолд RazorPage, который действительно объединяет код из каждого из этих классов.Но я не могу эшафот без первичного ключа.И когда я строю леса без структуры сущностей, он говорит, что моя страница не может быть найдена.Есть ли документация по созданию шаблона MVVM со страницами бритвы (без контроллера)?

1 Ответ

1 голос
/ 03 мая 2019

Класс PageModel в Razor Pages считается совместимым контроллером и ViewModel. По умолчанию он открывается на своей странице содержимого (аналогично представлению MVC) с помощью директивы @model. Вы можете добавить свойства в свою PageModel для каждого из элементов, обернутых в вашу ViewModel:

public class MyPageModel : PageModel
{
    public List<Genre> Genres { get; set; }
    public List<Movie> Movies { get; set; }
    ...
}

Или вы можете просто добавить свою ViewModel как свойство:

public class MyPageModel : PageModel
{
    public MoviesModelView ViewModel { get; set; }
}

В первом примере вы ссылаетесь на контент на странице контента, как и следовало ожидать:

@foreach(var movie in Model.Movies)
{

}

Во втором это немного более грязно (для меня, во всяком случае):

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

}
...